Java基础01
1. 值传递 VS 引用传递
1 | int a = 1101; |

基本数据类型的变量里直接存放值,引用类型的变量存放的是实际对象的地址。
1 | void fun(int a){ |
JAVA只有值传递,没有引用传递。
2. == VS equals
- 对于基本数据类型,==比较的是两个变量的值是否相等。
1 | int a = 10; |
- 对于引用类型,==比较的是两个变量是否指向同一地址。
1 | String a = "hello"; |
JAVA中所有对象都继承自object类,equals是object类的方法之一。
1 | public boolean equals(Object obj) { |
但是对于我们常用的String类来说,它重写了equals方法。
1 | String a = "hello"; |
String类的equals方法
1 | public boolean equals(Object anObject) { |
并不是说 == 比较的就是引用是否相等,equals 比较的就是值,具体情况具体分析。
3. 为什么重写equals()时必须重写hashCode()方法?
- 如果两个对象的
hashCode值相等,那这两个对象不一定相等(哈希碰撞)。 - 如果两个对象的
hashCode值相等并且equals()方法也返回true,我们才认为这两个对象相等。 - 如果两个对象的
hashCode值不相等,我们就可以直接认为这两个对象不相等。
如果重写
equals()时没有重写hashCode()方法的话就可能会导致equals方法判断是相等的两个对象,hashCode值却不相等。
4. String/StringBuffer/StringBuilder
操作少量的数据: 适用
String(不可变)单线程操作字符串缓冲区下操作大量数据: 适用
StringBuilder多线程操作字符串缓冲区下操作大量数据: 适用
StringBuffer
5. String s1 = new String(“abc”) 创建了几个字符串对象?
如果字符串常量池中不存在字符串对象“abc”的引用,那么会在堆中创建 2 个字符串对象“abc“
如果字符串常量池中已存在字符串对象“abc”的引用,则只会在堆中创建 1 个字符串对象“abc”