String

  • 字符串是一个常量,在被创建后不可以被修改
  • 字符串的连结(追加)是通过StringBuilder或者StringBuffer的append方法实现的

 

String pool(字符串池)

  字符串常量池是存储在 Java 堆内存中的字符串池,是为防止每次新建字符串带的时间和空间消耗的一种解决方案。在创建字符串时 JVM 会首先检查字符串常量池,如果字符串已经存在池中,就返回池中的实例引用,如果字符串不在池中,就会实例化一个字符串放到池中并把当前引用指向该字符串

 

String创建方式

  1. 通过字符串字面赋值 (String str = "abc")
    • 首先在字符串池中查找是否存在"abc"这个对象,如果存在,则不创建任何对象,直接将字符串池中的"abc"对象的地址返回,赋给变量str
    • 如果不存在,则在字符串池中创建"abc"对象,然后将字符串池中"abc"对象的地址返回,赋给变量str,导致str指向字符串池中的"abc"这个对象

    2. 通过new方式(String str = new String("abc"))

    • 首先在字符串池中查找是否存在"abc"这个对象,如果存在,则不在字符串池中再去创建"abc"字符串对象,直接在堆中创建"abc"对象,然后将堆中的"abc"字符串对象的地址返回,赋给变量str,导致str指向堆中生成的"abc"对象
    • 如果不存在,则现在字符串池中创建"abc"对象,然后再去堆中创建"abc"对象,最后将堆中的"abc"对象的地址返回

String拼接

  对于string的操作,我们经常会对它进行拼接操作,但是需要注意,拼接的一些问题

  1. “+”号两边都是字符串字面值
    • 这种情况下,会首先在字符串池中查找是否存在这个对象,如果存在,直接返回,否则在字符串池中创建该对象,然后将创建好的对象的地址返回

    2. “+”号有一边是变量

    • 直接在堆中创建一个新对象

 String的相等性比较

  对于string的相等性比较,请使用equals方法,不要使用“==”

  说明:

    使用 “==”判断的是地址是否相同

    对于String类的equals方法来说,判断的是内容是否相同

String的intern方法

  在面试或者笔试中,经常会看到该方法,这个方法到底有什么用呢?

  intern方法主要用于查找字符串池中是否存在当前对象,如果存在,则直接返回;如果不存在,则在字符串池中创建该对象,然后将该对象返回

String、StringBuffer、StringBuilder的区别

  • 可变性:String 为字符串常量是不可变对象,StringBuffer 与 StringBuilder 为字符串变量是可变对象;

  • 性能:String 每次修改相当于生成一个新对象,因此性能最低;StringBuffer 使用 synchronized 来保证线程安全,性能优于 String,但不如 StringBuilder;

  • 线程安全:StringBuilder 为非线程安全类,StringBuffer 为线程安全类

测试题

String s = new String("abc");
String s1 = "abc";
String s2 = new String("abc");
        
System.out.println(s == s1); 
System.out.println(s == s2);  
System.out.println(s1 == s2);
        
System.out.println("------");
        
System.out.println(s == s.intern());  
System.out.println(s1 == s1.intern());  
System.out.println(s.intern() == s2.intern());  

以上代码的输出结果是什么?(先思考一下,再看答案)

 

答案从上到下依次是:false  false  false  false  true  true

String hello = "hello";
String hel = "hel";
String lo = "lo";
        
System.out.println(hello == "hel" + "lo"); 
System.out.println(hello == "hel" + lo); 
System.out.println(hello == hel + lo); 

以上代码的输出结果又是什么?(先思考,再看答案)

 

答案为:true  false  false

 

posted on 2019-08-20 15:40  萧瑟如枫🍁  阅读(123)  评论(0)    收藏  举报