【JDK】String 字符串

1.简介

String用来表示字符串,程序中的“abc”等字符串字面量就是其实例

String是个不可变类,就是虽然它底层实现的一个字符数组,但是不能够修改字符数组的某个字符。因此它是可以多线程间共享的(线程安全的)。

2.字段&构造

由于String底层也是char数组,char类型在内存中是由两个字节Unicode编码(UTF-16)表示,每个字符值都在[\u0000,\uFFFF]这个范围。所以在内存中每个字符是两个字节。

UTF-16用两个字节来表示Unicode转化格式,它是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是16个bit,所以叫UTF-16。UTF-16表示字符非常方便,每两个字节表示一个字符,这就大大简化了字符串操作,这也是Java以UTF-16作为内存的字符存储格式的一个很重要的原因。

字段作用
char[] value字符数组
int hash

缓存该字符串的hash值

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

空串为0

long serialVersionUID = -6849794470754667710L序列化标识
// 1.空串,很少使用
public String() {
    this.value = "".value;
}
// 2.复制串,浅复制,指向同一个字符数组,但由于不可变,可以共享
public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}
// 3.深复制,因为字符数组曝露在外,如果不拷贝不能保证其不可变
public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}
char data[] = {'a', 'b', 'c'};
String str = new String(data);

String origin = "abc"; // 字面量会在编译、加载时,jdk7在堆中创建String对象,并将其引用放入常量池
String copy = new String(origin);

字符串初始化分为以下三种,各个方式创建对象的数量不一样,如下表所示:

字符串初始化对象图解解释
String origin = "abc";

没有创建新对象

字符串字面量(“abc”会在类加载时,jdk7在堆中创建String对象,并将其引用放入常量池。

此时的赋值就是栈中复制常量池中的引用,不会调用构造函数创建新的对象。

new String(origin)

会创建一个对象

String类型的对象指向与origin对象相同的字符数组。

new String(charArray)

创建两个对象

一个String对象,一个底层存储字符的char[]数组

因为其不可变性,一定会深拷贝暴露在外的字符数组。

3.核心方法

方法功能样例
length()返回字符数组value.length“abc”.length() ==3
charAt(int index)返回数组下标index下的字符,return value[index] 
compareTo(String another)比较字典序 小于返回负数,等于返回0,大于返回正数

“abcd” >"abc"

"abcd" <"abd"

startsWith(String prefix)是否以prefix开头 
endWith(String suffix)是否以suffix结尾 
indexOf(int ch)返回字符ch所在的第一个下标 
indexOf(String str)返回字符串str所在的第一个下标 
substring(int beginIndex, int endIndex)返回子串,下标是左闭右开,包含beginIndex,不包含endIndex字符 
concat(String str) 、+返回原串后面连接上str的串、连接两个字符串“abc”+“de”
contains(CharSequence s)包含子串 
split(String regex)以regex为分割符分割成字符串数组 
matches(String regex)字符串正则匹配 
hashCode返回hash值 

4.特性总结

不变性

线程安全

 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值