import java.util.HashMap; import java.util.Hashtable; public class Main { // 1. 继承Map private HashMap<String,String> hashmap = new HashMap<String,String>(); // 1.继承Dictionary private Hashtable<String,String> hashtable = new Hashtable<String,String>(); public static void main(String[] s) { Main main = new Main(); main.HashMapTest(); main.HashTableTest(); // String因为复写了equals方法,所以该方法是比较里面的内容.java的所有对象都有hashcode和equals方法.如果要复写equals,必须复写hashcode main.StringTest(); } private void HashMapTest(){ hashmap.put("0", "0"); // 2.可以放null值,一般会有特定的位置存储,比如0位置 hashmap.put(null, "null"); System.out.println(hashmap.get(null)); // 3.所谓的不是线程安全的,是因为hashmap的put和get方法实现如下: // public V put(K paramK, V paramV) // public V get(Object paramObject) } private void HashTableTest(){ hashtable.put("0", "0"); // 2. 不可以放null值 // hashtable.put(null, "null"); // System.out.println(hashtable.get(null)); // 3.所谓的线程安全的,是因为Hashtable的put和get方法实现如下: // public synchronized V put(K paramK, V paramV) // public synchronized V get(Object paramObject) } private void StringTest(){ // 由于String是final类,因此你不可以继承这个类、不能修改这个类。 // 会在内存中创建对象,可以通过intern放入String的string池中 String str1 = new String("exam"); String str2 = new String("exam"); // 首先会去string池中判断是否有该对象,有的话就直接返回已有对象的地址,否则会在内存中创建对象,并且放入String的string池中 String str3 = "exam"; // 所以它不会创建内存空间 String str4 = "exam"; // false System.out.println(str1==str2); // true System.out.println(str1.equals(str2)); // false System.out.println(str1 == str3); // true System.out.println(str1.equals(str3)); // true System.out.println(str4 == str3); // true System.out.println(str4.equals(str3)); str1 = str1.intern(); // true System.out.println(str1 == str3); // true System.out.println(str1.equals(str3)); } }