String
- 字符串是一个常量,在被创建后不可以被修改
- 字符串的连结(追加)是通过StringBuilder或者StringBuffer的append方法实现的
String pool(字符串池)
字符串常量池是存储在 Java 堆内存中的字符串池,是为防止每次新建字符串带的时间和空间消耗的一种解决方案。在创建字符串时 JVM 会首先检查字符串常量池,如果字符串已经存在池中,就返回池中的实例引用,如果字符串不在池中,就会实例化一个字符串放到池中并把当前引用指向该字符串
String创建方式
- 通过字符串字面赋值 (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的操作,我们经常会对它进行拼接操作,但是需要注意,拼接的一些问题
- “+”号两边都是字符串字面值
-
- 这种情况下,会首先在字符串池中查找是否存在这个对象,如果存在,直接返回,否则在字符串池中创建该对象,然后将创建好的对象的地址返回
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
浙公网安备 33010602011771号