【当年笔记】字符串

1 String 特性

* String 是不可变类(immutable),对它的任何改动,其实就是创建了一个新对象,再把引用指向该对象;
* String 对象赋值之后会缓存到在常量池中,下次创建会判断常量池是否已经有对应的缓存对象,如果有就直接返回该引用。

2字符串常用方法

substring(2) 从下标2截取到最后  ,substring(2,6) 从下标2截取到下标6 字符串。
equals("xxx") 比较字符串值是否相同
equalsIgnoreCase("xxx") 忽略字符串的大小写对比值是否相等
length() 获取字符串长度
intern() 方法用于查找常量池中是否存在该字符值,如果常量池中不存在则先在常量池中创建,如果已经存在则直接返回。

3 StringBuffer、StringBuilder

StringBuffer、StringBuilder都是可以变的字符串类型,其中StringBuffer 在字符串拼接时使用 synchronized 来保障线程安全,因此在多线程字符串拼接中推荐使用StringBuffer。在不需要考虑线程安全时使用StringBuilder 效率更高
常用方法 
append("xxx")  添加字符串到尾部.
sf.insert(下标数,"xxx"); 插入字符串到到当前字符串下标的位置
sf.setCharAt(下标数,‘x’);修改字符中某个下标的值

4 "==" 和 equals 的区别是什么?

"==" 对基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如
String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

5 为什么重写equals方法还要重写hashcode方法

1.为了提高效率。HashSet、HashMap等等hash类存储结构,添加元素会有重复性校验,校验的方式就是先取hashCode判断是否相等,然后再取equals方法比较,最终判定该存储结构中是否有重复元素。重写hashcode方法,在进行hashcode比较时直接时直接筛选出数据,减少equals次数 ,提高效率。

2.保证equals相同的情况下hashcode值必定相同

6 String 不可变都有哪些好处?

*不可变方便使用常量池存储,节约空间;

*避免一些安全漏洞 ,如Socket 编程中,主机名和端口都是以字符串的形式传入,因为字符串是不可变的,无法直接改变值使主机和端口指向其他地址。

*多线程安全,因为字符串是不可变的,所以同一个字符串实例可以被多个线程共享,保证了多线程的安全性。
*适合做缓存的 key ,因为字符串不可变,hashcode也固定,那么他的hashcode就一样,不用每次重新计算。做key效率更高
posted @ 2022-05-27 17:14  正文儿  阅读(19)  评论(0编辑  收藏  举报