zoukankan      html  css  js  c++  java
  • Java

    String 类

    正则表达式

    Pattern 类
    s.matches();
    s.replaceFirst();
    s.replaceAll();
    s.split();
    

    StringBuffer

    文档说明

    根据 StringBuffer 的文档说明可知:

    StringBuffer 是线程安全的,主要体现在它的方法上有 synchronized 同步锁,也因此导致其执行效率较低。

    StringBuffer 虽然是线程安全的,但是其安全指的是操作上的安全,需要处理的数据在处理过程中不能改变,或者处理的数据不被其他线程共享。也就是处理的数据中途自身发生改变,则得到的结果可能和想要的结果不一致,这种不一致并不是因为线程不安全,而是数据自身的不稳定。

    StringBuffer 主要有两个常用方法,append() 和 insert()。

    容量问题,如果不超过则不会扩容,超过容量自动扩容。

    传入的参数不能是 null,否则会报出 NullPointException。

    JDK 5 加入了 StringBuilder,它适用于单线程,且操作相同,由于没有加入 synchronized 同步机制,使得它能更快完成任务,官方优先推荐使用。

    StringBuffer 初始化容量

    public StringBuffer() {
        super(16);
    }
    
    public StringBuffer(int capacity) {
        super(capacity);
    }
    
    public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }
    
    public StringBuffer(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }
    

    由构造方法的源码可知,有三种初始化容量:

    1. 无参,容量为 16.
    2. 传入容量值.
    3. 传入 String 或 实现 CharSequence 接口的类型的数据长度 + 16.

    StringBuffer 扩容

    StringBuffer 在使用 append() 方法时会扩容,策略有两种:

    1. 先将当前容量 * 2,再加 2.

    2. 如果此时容量还比追加后的 StringBuffer 长度 minCapacity 小,则使用minCapacity.

    3. 此时的容量仍需要判断是否超出 StringBuffer 规定的最大容量,如果超过则可能报出 OutOfMemoryError 异常.

      注:可能 是因为 StringBuffer 规定的最大容量和 Integer.MAX_VALUE 仍有 8 个空位.

    /*
    AbstractStringBuilder.java
    StringBuffer 调用的 append() 方法中调用了父类的这个方法
    */
    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }
    
    private int hugeCapacity(int minCapacity) {
        if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
            throw new OutOfMemoryError();
        }
        return (minCapacity > MAX_ARRAY_SIZE)
            ? minCapacity : MAX_ARRAY_SIZE;
    }
    
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    
    /*
    Integer.java
    */
    @Native public static final int MAX_VALUE = 0x7fffffff;
    

    为了避免频繁扩容影响运行效率,可以提前设定好 StringBuffer 的容量。

  • 相关阅读:
    中国黑客传说:游走在黑暗中的精灵
    智能硬件安全入门
    迈克菲:2016年的八大网络安全威胁
    走进科学之WAF(Web Appllication Firewall)篇
    从对SAE的一次授权安全评估浅谈云安全
    沟通的艺术,心理学与生活,学会提问
    知道创宇研发技能表v3.0
    SYN Cookie的原理和实现
    1043. 输出PATest(20)
    1042. 字符统计(20)
  • 原文地址:https://www.cnblogs.com/chenxianbin/p/11922435.html
Copyright © 2011-2022 走看看