• 【Java基础】String StringBuffer StringBuilder


    1. String
    • String是不可变的

      • 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的。(public final class String)

        查看以下代码:

        String text = "a";
        text = "b";
        

        String不是不可变的么?为什么可以这样用?因为text是字符串"a"的引用,即引用是可以变化的,跟对象实例的属性变化没有关系。(这里创建的是两个String对象)

      • String设计成不可变的原因

        • 字符串常量池Java方法区中一个特殊的存储区域,当创建一个String对象时,假如这个字符串已经在常量池中了,就不会创建一个新的对象,而是引用已经存在的对象。++常量池指的是在编译期被确定,并保存在已编译的.class文件中的一些数据。它包括了关于类,方法,接口中的常量,也包括字符串常量++

          String text1 = "abc";
          String text2 = "abc"; 
          

          上面的代码只会在堆内存中创建一个实际的String对象。如果字符串对象允许改变的话,那么会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象。

          栈(stack):主要保存基本数据类型和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆

          堆(heap):用于存储对象

        • 安全性,因为字符串是不可变的,所以是线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串本身就是线程安全的。

    1. StringBuffer,StringBuilder

      • StringBuffer

        StringBuffer和String一样都是用来存储字符串的,只不过他们内部的实现方式不一样,导致他们所使用的范围不同,对于StringBuffer,它在处理字符串的时候,如果是进行修改操作,并不会产生一个新的字符串对象。

        StringBuffer的许多方法和String差不多,只不过修改时StringBuffer是修改自身的,而String类则是产生一个新的对象,这是他们最大的区别。

        同时,StringBuffer是不能通过=来进行初始化的,它必须通过构造方法来进行初始化。

      • StringBuilder

        StringBuilder和StringBuffer的不同之处在于StringBuilder是线程不安全的,StringBuffer是线程安全的。

      • String,StringBuffer,StringBuilder区别

    2. 常见面试题

      • 如何比较两个字符串?使用“==”还是equals()方法?

        • equals()是用来比较两个值的,==会比较两个引用
      • String s=new String("abc")创建了几个对象?

            public String(String original) {
                this.value = original.value;
                this.hash = original.hash;
            }
        

        上面是String的构造方法,我们在使用new调用了String的构造方法创建了一个对象,并将它的引用赋值给了str变量。
        同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是“abc”,由此我们又要引入另外一种创建String对象的方法的讨论 -- 引号内包含文本

      • String字符串与BufferString的传递问题

        • 基本数据类型的值传递,不改变其值;引用数据类型的值传递,改变其值

        • String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的

            public static void changeString(String str) {
                // 因为str是属于局部变量,在调用该方法时实际参数s和形式参数str指向同一个字符串对象
                // 但是在方法内部将str又指向了一个新的字符串对象,而此时s还是指向原来的字符串对象
                // changeString方法执行完毕,局部变量str消失,方法内部产生的新的字符串对象称为垃圾
                // 但是s还是指向原有的字符串对象,并没有改变
                str += "test";
            }
        
      • String.intern()

        • 存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同unicode的字符串常量,如果有,返回其引用,没有的话就在常量池中添加一个unicode等于str的字符串并返回它的引用
      • Java中常见的面试题

  • 相关阅读:
    高内聚,低偶合
    Infinite Scrolling in UIScrollView
    ios5开发UITableView开启编辑功能
    一种自动的将自定义类序列化为JSON的方法
    Beini Compatible Hardware List
    BizTalk开发小工具批量更新发送端口订阅配置参数
    IOS5开发http get/post调用mvc4 webapi互操作(图片上传)
    IOS5开发控件位置适应屏幕旋转代码
    打开WHRHPG54AP的HP(High Power)功能
    xcode uiscrollview with paging and zoom
  • 原文地址:https://www.cnblogs.com/lebo0425/p/6482999.html
Copyright © 2020-2023  润新知