字符串String、StringBuffer、StringBuilder

一、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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值