==和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);