String、StringBuffer、StringBuilder 拼搏现实的明天。 2022-06-02 03:38 173阅读 0赞 一、在java中有3个类来负责字符的操作。 1.Character 是进行单个字符操作的, 2.String 对一串字符进行操作。不可变类。 3.StringBuffer 也是对一串字符进行操作,但是可变类。 二、String、StringBuffer、StringBuilder (1)String 是不可变的对象,因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 "==" 比较地址 "equals" 比较内容 ==是判断两个变量或实例是不是指向同一个内存空间,即引用 equals是判断两个变量或实例所指向的内存空间的值是不是相同 举例: String s1 = "hello"; String s2 = "hello"; String s3 = new String("hello"); s1 == s2; // true 地址相同 s1 == s3; // false 地址不同 s1.equals(s2); // true 内容相同 s1.equals(s3); // true 内容相同 intern() 方法 查找内容相同(equals())的字符串 String s1 = "hello"; // hello不存在,jvm创建新对象 (1) String s2 = new String("hello"); // 创举新对象 (2),这时heap中存在两个内容为hello的对象 s1 == s2; // false // 地址不同 s1.equals(s2); // true // 内容相同 s2 = s1.intern(); // true // 找到对象(1) 并赋予s2 s1 == s2; // true !! // 注意:此时s1,s2同指向(1) (2)使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的: 主要操作: append 和 insert 方法,可重载这些方法,以接受任意类型的数据。 append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。 例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。 (3)从 JDK 5.0 开始,为StringBuffer 类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 StringBuffer线程安全,StringBuilder线程不安全
还没有评论,来说两句吧...