equals方法和==
对于String字符串
- equals用来判断字符串的内容是否相同
- ==用来判断引用地址是否相同
public class testequals {
public static void main(String[] args) {
// User u1 = new User(0, "zym");
// User u2 = new User(0, "zym");
// System.out.println("test equals method: "+u1.equals(u2));
// System.out.println("test == : "+(u1==u2));
String s = new String("zym");
String s2 = new String("zym");
System.out.println("test equals method: "+s.equals(s2));
System.out.println("test == : "+(s==s2));
}
}
对于非String字符串所有其他
都是用来判断引用,地址
//Uers 类用于测试
class User{
private int id;
private String name;
//构造方法
public User(int id,String name) {
this.id = this.id;
this.name = this.name;
}
}
public class testequals {
public static void main(String[] args) {
User u1 = new User(0, "zym");
User u2 = new User(0, "zym");
System.out.println("test equals method: "+u1.equals(u2));
System.out.println("test == : "+(u1==u2));
}
}
引申
HashCode和hashmap
首先hashmap底层是数组+链表。每一个K-V可以看成是一个整体Entry。数组是Entry[],这个Entry中是一个链表。
插入时,根据Key的HashCode,找到内存中对应的位置,插入。如果冲突,即HashCode相同,调用equals方法判断key是不是相同,如果相同返回true,那么对象插入失败,新value覆盖原来的value。否则在key的value链上插入对象,记住是插入到value的链头,我一直以为是链尾。。。重写时equals时参数必须是Object
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return true;
}
取出数据,首先根据key的HashCode找出位置,根据equals方法找出需要的Entry。其实每一个Entry[i]就是一个解决哈希冲突的链表。
- Hashmap与hashtable区别
Hashmap可允许key和value为null,Hashtable不允许。
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;
//测试hashmap的key 和 value是不是可以为空
public class second{
public static void main(String[] args) {
HashMap<String, String> mymap = new HashMap<String, String>();
mymap.put(null, null);
for (Iterator iterator = mymap.entrySet().iterator(); iterator.hasNext();) {
Entry<String, String> type = (Entry<String, String>) iterator.next();
System.out.println(type.getKey()+type.getKey());
}
System.out.println("测试hashtable");
//报错at java.util.Hashtable.put(Unknown Source)
Hashtable<String, String> mytable = new Hashtable<String, String>();
mytable.put(null, null);
for (Iterator iterator = mytable.keySet().iterator(); iterator.hasNext();) {
Entry<String, String> type = (Entry<String, String>) iterator.next();
System.out.println(type.getKey()+type.getKey());
}
}
}
Hashmap不是线程安全的(fail-fast快速失败),Hashtable 是线层安全的。
Hashtable在jdk1.2就有是Dictionary,hashtable是在jdk1.2引入的,实现map接口
这个博客讲的特比好,我是引用哦
http://www.importnew.com/16301.html
ConcurrentHashmap
分段锁Segment
ConcurrentHashMap采用了分段锁的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。相比于对整个Map加锁的设计,分段锁大大的提高了高并发环境下的处理能力。
见博客[http://www.importnew.com/22007.html]