目录
5.6 String str="aaa"与String str=new String("aaa")
5.7 String、StringBuffer和StringBuilder的区别
【四】对象相等判断
4.1 ==和equals()的区别
- 如果
==
比较的是基本数据类型,那么比较的是两个基本数据类型的值是否相等; - 如果
==
是比较的两个对象,那么比较的是两个对象的引用(地址),也就是判断两个对象是否指向了同一块内存区域。
equals源码:
public boolean equals(Object obj) {
return (this == obj);
}
equals()用来比较两个对象是否相等,分为两种情况:
- 没有覆盖重写equals()方法,则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象;
- 覆盖重写equals()方法,一般我们都会覆盖equals()方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true(即,认为这两个对象相等)。
4.2 hashCode()函数
1)hashCode()函数介绍?
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的java.Object中,这就意味着Java中的任何类都包含有hashCode()函数。
2)为什么要有hashCode()?
以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:
当把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode值作比较,如果没有相同的hashcode,HashSet会假设对象没有重复出现。
但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了equals的次数,相应就大大提高了执行速度。
3)hashCode()和equals()的关系?
- 如果两个对象相等,则hashcode一定也是相同的;
- 两个对象相等,对两个对象分别调用equals方法都返回true;
- 两个对象有相同的hashcode值,但不一定相等。
4)为什么重写equals()必须重写hashCode()?
判断的时候是先根据hashcode进行判断,hashcode相同的情况下再根据equals()方法进行判断。如果只重写了equals()方法,而没有重写hashCode()的方法,会造成hashcode的值不同,而equals()方法判断出来的结果为true。
在Java中的一些容器中,不允许有两个完全相同的对象,插入的时候,如果判断相同则会进行覆盖。此时,如果只重写了equals()方法,而没有重写hashCode()方法,就有可能造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题。
【五】String相关
5.1 字符型常量和字符串常量的区别?
- 形式上:字符型常量是单引号引起的一个字符,字符串常量是双引号引起的若干个字符;
- 含义上:字符型常量相当于一个整型值(ASCII值),可以参加表达式运算,字符串常量代表一个地址值(该字符串在内存中的存放位置);
- 占内存大小:字符型常量占2个字节,字符串常量占若干个字节(至少一个字符结束标志)。
5.2 字符串常量池
JVM为了提升性能和减少内存开销,避免字符串的重复创建,维护了一块特殊的内存空间,即字符串池(String pool),当需要使用字符串时&