文章目录
一、String类
1、概述
- 字符串所在的包为
java.lang.String
String 是引用数据类型,不是基本数据类型
。
2、特点【重要】
a、字符串的值在创建后不能被更改【非常重要】
字符串底层的char[]数组由final修饰,意味着这个数组不能扩容
而且char[]数组是私有的,程序员无法直接操作这个char[]数组
String str = "abc";
相当于
char datas[] = {'a', 'b', 'c'};
String str = new String(datas);
- JDK1.9之前:底层是用 char[ ] 存储
- JDK1.9之后:底层选用 byte[ ] 存储
String提供的所有的方法,对字符串的修改都是给你返回一个新的字符串对象
b、String 类型不能被继承,因为 String 是由final 修饰的。
3、String、StringBuffer、StringBuilder
参考:java面试题:为什么 StringBuilder 不是线程安全的?
- StringBuilder和StringBuffer的内部实现跟String类一样,都是通过一个char数组存储字符串的,不同的是String类里面的char数组是final修饰的,是不可变的,而StringBuilder和StringBuffer的char数组是可变的
- StringBuilder线程不安全,StringBuffer线程安全
二、字符串的创建
参考:运行时数据区域、Class常量池、运行时常量池、字符串常量池的4.1
1、导包
String 这个类 是 java.lang.String 包内的,不需要手动导入。
扩展:
常用的如基本数据类型(Integer、Float)、String、Thread、System,只要是 lang 包下面的,就不必写import 导包语句
。
2、创建字符串
创建字符串的常见3+1种方式(三种构造方法,一种直接创建)
。
a、3种构造方法创建
- public String() : 初始化新创建的 String对象,以使其表示空字符序列
- public String(char[] value) :通过当前参数中的字符数组,来构造新的String。
- public String(byte[] bytes) :通过使用平台的默认字符集,解码当前参数中的字节数组,来构造新的String。
// 无参构造
String str = new String();
// 通过字符数组构造
char chars[] = {'a', 'b', 'c'};
String str2 = new String(chars);
// 通过字节数组构造
byte bytes[] = { 97, 98, 99 };
String str3 = new String(bytes);
b、直接创建
String str = “字符串内容”; // 右边直接用双引号
分析:这里面虽然没有 new 关键字,但同时创建了一个 String 对象
。
3、字符串是如何存储的
- 当直接创建一个字符串时,变量会到字符串常量池中去寻找该字符串,如果找到了,该变量指向该字符串;如果没有找到,会用 char[ ]拼接成所需的字符串,然后放入常量池中并指向它。
- 使用 new 关键字创建字符串,会在堆区创建一个 String 对象,而且底层是用 char[ ] 数组拼接的,这个 String 对象并没有放入字符串常量池中,而是在堆中,引用指向该String对象的地址。
String str = “hello”;
String s1 = new String(); // 本质上 this.value = new char[0];
String s2 = new String(String original); //this.value = original.value;
String s3 = new String(char[] a); //this.value = Arrays.copyOf(value, value.length);
String s4 = new String(char[] a, int startIndex, int count)
注意:
- 使用new String(“abc”)的创建方式
≠
使用new String([‘a’, ‘b’, ''c])的创建方式 数组是创建在堆上的
三、字符串的拼接
参考:运行时数据区域、Class常量池、运行时常量池、字符串常量池的4.3
结论
:
- (1) 因为只有常量池中才是共享,==比较才为 true;
- (2) 常量与常量的拼接结果在常量池中;
- (3) 只要其中有一个是变量,结果就在堆中;
- (4) 如果拼接的结果调用 intern() 方法,结果就在常量池中;
四、空字符串
1、表现方式
(1)String str = "";
(2)String str2 = new String();
(3)String str3 = new String("");
2、判断字符串为空
(1)if(str != null && str.length() == 0)
(2)if(str != null && str.equals(""))
(3)if("".equals(str)) 推荐
(4)if(str!=null && str.isEmpty())