String类:
实现原理:
参考: https://blog.csdn.net/xiezhi_1130/article/details/84953379
重点: 1 String是被final修饰的,不可继承
2 String的底层是一个char数组 private final char value[];被final修饰,不可修改
曾经有过一次面试让我手写String类型的equal方法
1 先判断地址是不是一样的
2 先判断对象是不是String类型
3 判断长度是否相等
4 遍历两个char 数组的每一个元素是否相等
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
String类中的equal方法是重载过的
Object中的equal方法就是 ==
public boolean equals(Object obj) {
return (this == obj);
}
问题: 1 new String("123") 创建了几个对象?
答: 俩, 一个在字符串常量池中,一个在堆中, new 出来的对象地址指向堆中
String str1 ="123";
String str2 = new String("123");
String str3 ="123";
String str4 ="12"+"3";
System.out.println(str1.hashCode()); //48690
System.out.println(str2.hashCode()); // 48690
System.out.println(str2.equals(str1)); //true
System.out.println(str2 == str1); // false
System.out.println(str1 == str3); // true
System.out.println(str1 == str4); // true //记住这个
可以参考: https://blog.csdn.net/changgebuyu/article/details/86523998
StringBuffer和StringBuilder
StringBuffer 和StringBuilder 底层都继承 AbstractStringBuilder 都是用char[]存储数据的
StringBuffer 线程安全 安全原因增加了synchronized
包装类中几个反直觉的东西
Integer i1 = 123;
int i2 = 123;
Integer i3 = new Integer(123);
Integer i4 = new Integer(121)+2;
Integer i5 = new Integer("123");
System.out.println(i1 == i2); // true
System.out.println(i1 == i3); // false
System.out.println(i1 == i4); // true
System.out.println(i2 == i4); // true
System.out.println(i3 == i4); // false
System.out.println(i3 == i5); // false
Object类
clone() 深拷贝,浅拷贝
深拷贝:
深拷贝把要拷贝的对象以及所引用的对象都复制了一遍。
浅拷贝:
浅拷贝仅仅拷贝对象,而不复制它所引用的对象。