String常见知识点

一 String的内存
在这里插入图片描述
1)String 声明为final 不可继承;
2)String实现了Serializable接口,表示String可以比较大小
实现了Compareble接口,表示String可以比较大小
3)String内部定义了final char[] value用于存储字符串数据,具有不可变性
总结:一个值,一个内存区域地址,且不存相同值,是一 一映射
体现:1当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
2 当对现有的字符串进行连接操作时候,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
3.当调用String的replace修改指定的字符或字符串时,也需要重新指定内存区域进行赋值***
在这里插入图片描述

public class JavaTest {
    public static void main(String[] args) {
        String s1="abc";
        String s2="abc";
        System.out.println(s1==s2);//true
    }
}

4)通过字面量的方式给一个字符串赋值,此时字符串声明在字符串常量池中
5)字符串常量池是不会存储相同内容的字符串的(所有上面二者在同一个地址,因为只存一次)
详情见https://editor.csdn.net/md/?articleId=120342865
例题
String test=“javaandpython”;
String str1=“java”;
String str2=“and”;
String str3=“python”;
System. out. println(test==“java”+“and”+“python”):
System. out. println(test ==str1 + str2 + str3);
对于上面这段代码,结果是true false
这是因为字符串字面量拼接操作是在Java编译器编译期间就执行了,也就是说编译器编译时,直接把"java"、“and"和"python"这三个字面量进行”+“操作得到一个"javaandpython” 常量,并且直接将这个常量放入字符串池中,这样做实际上是一种优化,将3个字面量合成一个,避免了创建多余的字符串对象(只有一个对象"javaandpython",在字符串常量池中)。而字符串引用的"+“运算是在Java运行期间执行的,即str1 + str2 + str3在程序执行期间才会进行计算,它会在堆内存中重新创建一个拼接后的字符串对象。且在字符串常量池中也会有str1,str2与str3,这里创建多少个新的对象与原来字符串常量池中有没有str1\str2\str3有关,如果之前存在就不会创建新的对象。
总结来说就是:字面量”+“拼接是在编译期间进行的,拼接后的字符串存放在字符串池中;而字符串引用的”+"拼接运算实在运行时进行的,新创建的字符串存放在堆中。
那么再来看这题,很明显只在编译期间在字符串常量池中创建了"welcometo360"一个字符串
6)基本数据类型传递数据 引用数据类型传递地址值

在这里插入图片描述
此图中
str引用了ex.str ,但是由于String的不可变性,str="test ok"则新指向一个地址,原来的ex.str不变
而char[]则是更改第一位
二 String的方法
chatAt (int index):返回某索引处的字符
trim()返回字符串的副本,忽略前导空白和尾部空白
equal(Object obj)比较字符串的内容是否相同
equalIsignoreCase(String anotherString)与euals类似忽略大小写
concat(String str)将指定字符串连接到此字符串的结尾
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三 String-----与char的转换
String转换为char
char[] charArray=str1.tocharArray
char转换为String
String str2=new String(arr)
四 String与byte[]之间的转换
String---->byte
str.getBytes()
在这里插入图片描述
byte---->String
new String(bytes)
在这里插入图片描述
五 String StringBuffer StringBuilder
String 不可变的字符序列
StringBuffer 可变的字符序列 线程安全 效率低 底层用char[](没有加final)
在这里插入图片描述
StringBuffer sb2=new StringBuffer(“abc”);//char[] value=new char[“abc”.length()+16];
底层是一个初始创造并多出了16个字节
//问题1:sb2.length()==3
//问题2:扩容问题:如果要添加的数据底层数据盛不下,那就需要扩容底层的数组
默认情况下,扩容为原来容量的2倍+2,同时将原有数组的元素复制到新的数组中
指导意义:建议使用StringBuffer(int capacity)
StringBuilder 可变的字符序列 线程不安全 效率高 底层用char[] (没有加final)
六 StringBuffer的方法
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值