==和equals方法之间的区别,hashcode的理解,String拼接,Spring拆分

==和equals方法之间的区别

字符串有字符串常量池的概念,本身就推荐使用String s="字符串",
这种形式来创建字符串对象,
而不是通过new关键字的方式,
因为可以把字符串缓存在字符串常量池中,方便下次使用,不用遇到new就在堆上开辟一块新的空间
有一对双胞胎姐妹,晓苑和晓蕊;普通人分辨不出来他们两个的名字,他们的家人可以分辨出来;
equals()像我们普通人,分辨不出来晓苑和晓瑞;看见晓苑以为是晓蕊;
==操作符比作他们的家人,一眼就能辨别出来2人的区别;
String alita = new String("abc");
String luolita = new String("abc");

System.out.println(alita.equals(luolita)); // true
System.out.println(alita == luolita); // false

.equals() 输出的结果为 true,而“==”操作符输出的结果为 false——前者要求内容相等就可以,后者要求必须是同一个对象。

Java 的所有类都默认地继承 Object 这个超类,该类有一个名为 .equals() 的方法。

//Object类的equals()方法默认采用的是==操作符进行比较。假如子类没有重写该方法的话,那么==操作符和.equals()方法的功效就完全一样
//比较2个对象的内存地址是否相等;
在实际情况中,有不少类重写了equals()方法,因为比较内存地址的要求比较严格,不太符号应用;比较字符串的时候,只想判断它们两个的内容是否相等,并不想比较它们是否是同一个对象;

String 类的 .equals() 方法的源码

//如果两个字符串对象可以使用==,直接返回true;因为这种情况下,字符串内容是必然相等的。否则就按照字符编码进行比较,分为UTF16和Latin1,差别不大;

java17

"这个 JDK 版本是 Java 17,也就是最新的 LTS(长期支持)版本。该版本中,
String 类使用字节数组实现的,所以比较两个字符串的内容是否相等时,
可以先比较字节数组的长度是否相等,不相等就直接返回 false;
否则就遍历两个字符串的字节数组,只有有一个字节不相等,就返回 false。

java8的代码

//JDK8更容易理解:首先判断2个对象是否为同一个对象,如果是,则返回true.接着,判断对象是否为String类型,
// 如果不是则返回false.如果对象为String类型,则比较2个字符串的长度是否相等,
//如果长度不相等,则返回false.如果长度相等,则逐个比较每个字符是否相等,如果都相等,则返回true,否则返回false;

hashcode是什么?有什么作用?

Java中Object有一个方法:

public native int hashcode();

(1)hashcode()方法的作用

hashcode()方法主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable。

当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入,如果有,就调用equals方法与新元素进行比较,相同就不存了,不同就存入。

(2)equals和hashcode的关系

如果equals为true,hashcode一定相等; 

如果equals为false,hashcode不一定不相等;

如果hashcode值相等,equals不一定相等;

如果hashcode值不等,equals一定不等;

(3)重写equals方法时,一定要重写hashcode方法
小白解释

1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有
例如内存中有这样的位置
0  1  2  3  4  5  6  7  
而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法
但如果用hashcode那就会使效率提高很多
我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除 8求余数直接找到存放的位置了。

2.但是如果两个类有相同的hashcode怎么办那(我们假设上面的类的ID不是唯一的),例如9除以8和17除以8的余数都是1,那么这是不是合法的,回答是:可以这样。那么如何判断呢?在这个时候就需要定义 equals了。
也就是说,我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。
那么。重写了equals(),为什么还要重写hashCode()呢?
想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊。

String拼接

热身使用

String str="first=x,keyword1=trind,keyword2=time";
Map<String, String> result = Splitter.on(",").withKeyValueSeparator("=").split(str);
List<String> usercodelist = Splitter.on(",").splitToList("1,2,3");
String name = Joiner.on(",").skipNulls().join(usercodelist);

Spring拆分

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值