Java基础(二)—对象相等、String类和泛型

本文深入探讨Java中对象相等的判断,解析`==`与`equals()`的区别及`hashCode()`的作用。接着,文章详细阐述String类的特性,包括常量池、不可变性及其在HashMap中的应用。最后,介绍了Java泛型的基本概念、使用好处、类型擦除以及限定通配符的应用,帮助理解泛型的工作原理。
摘要由CSDN通过智能技术生成

目录

【四】对象相等判断

4.1 ==和equals()的区别

4.2 hashCode()函数

【五】String相关

5.1 字符型常量和字符串常量的区别?

5.2 字符串常量池

5.3 String的特性

5.4 String为什么要设计成不可变的

5.5 HashMap使用String作key的好处

5.6 String str="aaa"与String str=new String("aaa")

5.7 String、StringBuffer和StringBuilder的区别

【六】泛型

6.1 Java泛型

6.2 使用泛型的好处

6.3 泛型原理

6.4 类型擦除

6.5 限定通配符和非限定通配符

6.6 List和List的区别


【四】对象相等判断

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),当需要使用字符串时&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值