1.String,StringBuffer,StringBuilder 的区别是什么? String 为什么是不可变的?
按可变性来说:
String以java9为界限来分析:
java9 之前,jdk源码中String采用char[] 数组形式来保存字符串对象,并且使用final关键字来修饰(表示当前对象是不可变的),每次对String对象的重新赋值或者修改都是创建一个新的对象;java9 之后,String类中采用final修饰的byte[]数组来保存,其他的与之前都是一样是不可变的;
StringBuilder与StringBuffer都是继承与AbstractStringBuilder,采用char[]数组形式保存字符串, 注意:没有使用final修饰的,所以StringBuilder与StringBuffer是可变的。
按线程安全性来说:
String:在string是使用final修饰的,所以可以认为是一个常量,就不会存在线程安全的问题,每一个操作都是原子性的操作;
StringBuilder:在操作字符串拼接的方法中没有使用锁或者Synchronized修饰,因此线程是不安全的;
StringBuffer:这个类在操作字符串时有使用到同步锁操作,所以使用这个类操作是线程安全的。
按性能来说:
性能排序(低到高):String < StringBuffer < StringBuilder
原因:
String是一个常量,每次操作都会创建一个新的对象,所以性能最低的;
StringBuffer加入了同步锁导致性能的较低,而StringBuilder反之没有加入线程同步问题,所以性能是最好的。
一般用法:
单线程下操作少量字符: String
单线程下操作大量字符:StringBuilder
多线程下操作大量字符:StringBuffer
2.== 与 equals
"=="一般用于基本数据类型的比较;
基本数据类型:比较的是数据的值
引用数据类型:比较的是对象的地址
“equals” 一般用于引用数据类型的比较
① 没有重写Object中的equals方法
功能与 “ == ”是一样的
②重写equals方法
比较的是关心对象里面的一些数据,数据相等认为两个对象是相等的
重写:一般是会先重写hashcode方法,先通过hash函数计算两个对象的hashcode值是否相等,如果不想等就不需要执行equals方法进行比较-------直接判断不相等;hashcode的值相等后再进行equals方法的字段比较,如果都相等,就证明这两个对象是相等的。