1.字符串
Java中的字符串只能位于内存中的两个区域:常量池和Java堆。常量池维护了一个StringTable,它是一个hashtable,以字符串hashcode作为键,字符串引用作为值;Java堆中存储的就是普通的字符串对象。
1.字符串的定义形式:
1. String s = "kkk"; //把“kkk”放到常量池中,并在栈中生成一个引用s。
2. String s = new String(); //其中s的值为""
3. String s1 = new String("kkk"); //在堆中生成一个“kkk”字符串对象,并在栈中返回一个s1引用。
创建流程:
先去常量池看有没有"kkk"存在,如果有,就直接使用"kkk"创建对象。
如果不存在,则先在常量池中创建字符串"kkk",然后再使用"kkk"创建对象,并赋值给字符串引用s1。
2.字符串的不可变性
String s2 = "ddd"; //在常量池中生成字符串"ddd",引用指向s2
s2 = "hello" + s2; //在常量池中重新生成字符串"helloddd",引用指向s2;
对String类型进行+操作,会使得原来的"ddd",没有引用指向它,如果进行太多次+操作的话,会导致频繁地创建新的内容,导致效率下降。
故频繁进行叠加、删减操作等,建议使用StringBuilder。
例外:StringBuffer和StringBuilder二者基本相似,StringBuffer是线程安全的,StringBuilder则没有,所以性能略高,执行速度快于StringBuffer。
2.集合
关于集合的内容只讲一点点。
1.自定义的类用Set的话,要重写hashCode和equals方法,才能让内容相同的类不能添加入Set集合中。
public int hashCode(){
//自动生成即可
}
@Override
public boolean equals(Object obj){
//1.判断是否是同个对象
//2.向下转型后,判断内容是否相等。
if(this == obj)
return true;
if(obj.getClass() == Cat.class){
Cat cat = (Cat)obj;
return cat.getName().equals(name)&&(cat.getMonth()==mon