public class MapDemo { /** * HashSet,HashMap和HashTable的区别 * 1.HashTable是同步的,线程安全的,源代码有synchronized 修饰符 * HashMap不是 * 2.HashTable只能有一条记录key为null, * 经验证:Hashtable在put时不能存入null值无论null值还是null键都不可存入。但是在取不存在的key值时返回null * * HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value * 经验证:null被HashMap当做一个对象进行处理,可以是key或者value,符合HashMap只有一个key的要求,重复put会覆盖以前put的值 * 3.父类不同 Hashtable的父类是Dictionary,HashMap是AbstractMap的实现 * * Set和List的区别 * hashset不会有重复数据。分析源代码,发现hashset的值使用的是map的key,因为map的key不可重复故set值也不重复 * list内数据按顺序插入,数据可以重复。分析源代码,发现ArrayList使用的是数组,没插入新元素,都copy一份旧数组加上新元素组成一个新数组,并且销毁原数组 * * String和StringBuilder比较。 * String字符串连接的=+号是生成一个新StringBuilder对象,后面的+号使用append()方法。 * 所以如果有很多的=+或+=就会创建很多StringBuilder对象。占用系统空间和时间。 * 所以使用+连接字符串的效率低于使用StringBuilder */ public final static MapDemo ins = new MapDemo(); private MapDemo() {} public String getString(int num){ String s = ""; Random rand = new Random(); for (int i = 0; i < num; i++) { s = s + rand.nextInt(1000) + " "; } return s; } public String getStringBuilder(int num){ StringBuilder sb = new StringBuilder(); Random rand = new Random(); for (int i = 0; i < num; i++) { sb.append( rand.nextInt(1000)).append(" ") ; } return sb.toString(); } public void testString(int num){ System.out.println("组成"+num+"遍字符串"); long start = System.currentTimeMillis(); getStringBuilder(num); long end = System.currentTimeMillis(); System.out.println("使用StringBuilder耗时 "+(end-start)); start = System.currentTimeMillis(); getString(num); end = System.currentTimeMillis(); System.out.println("使用String耗时 "+(end-start)); } public void testHash(){ testHashMap(); testHashTable(); testHashSet();//set数据不可以重复 testArrayList();//list数据可以重复 } private void testArrayList() { System.out.println("测试List...."); List list = new ArrayList(); list.add(1); list.add(2); list.add(1); list.add("string"); list.add("string"); Iterator iterat = list.iterator(); System.out.println("列出list中数据"); while(iterat.hasNext()){ System.out.println(iterat.next()); } System.out.println("List数据可以重复."); System.out.println(); } public void testHashSet(){ System.out.println("测试HashSet...."); Set hashSet = new HashSet(); hashSet.add(null); System.out.println("加入null"); hashSet.add(null); System.out.println("加入null"); hashSet.add(1); System.out.println("加入"+1); hashSet.add(1); System.out.println("加入"+1); hashSet.add("string"); System.out.println("加入string"); hashSet.add("string"); System.out.println("加入string"); Iterator iterat = hashSet.iterator(); System.out.println("列出set中数据"); while(iterat.hasNext()){ System.out.println(iterat.next()); } System.out.println("HashSet没有重复数据."); System.out.println(); } public void testHashMap(){ System.out.println("测试HashMap...."); Map hashmap = new HashMap(); try { hashmap.put(null, null); if(hashmap.get(null)==null){ System.out.println("key和value都可以为null."); } } catch (Exception e) { System.out.println("key和value都不可以为null."); } try { hashmap.put(null, 1); System.out.println("key可以为null,value值被覆盖:"+hashmap.get(null)); } catch (Exception e) { System.out.println("key不可以为null."); } try { hashmap.put("key", null); if(hashmap.get("key")==null){ System.out.println("value可以为null."); } } catch (Exception e) { System.out.println("value不可以为null."); } System.out.println(); } public void testHashTable(){ System.out.println("测试Hashtable...."); Hashtable hashtable = new Hashtable(); try { hashtable.put(null, null); if(hashtable.get(null)==null){ System.out.println("key和value都可以为null."); } } catch (Exception e) { System.out.println("key和value都不可以为null."); } try { hashtable.put(null, "------"); System.out.println("key可以为null,value值被覆盖:"+hashtable.get(null));; } catch (Exception e) { System.out.println("key不可以为null."); } try { hashtable.put("key", null); if(hashtable.get("key")==null){ System.out.println("value可以为null."); } } catch (Exception e) { System.out.println("value不可以为null."); } System.out.println(); } public static void main(String[] args) { MapDemo.ins.testHash(); MapDemo.ins.testString(100); MapDemo.ins.testString(10000); } } 输出结果 测试HashMap.... key和value都可以为null. key可以为null,value值被覆盖:1 value可以为null. 测试Hashtable.... key和value都不可以为null. key不可以为null. value不可以为null. 测试HashSet.... 加入null 加入null 加入1 加入1 加入string 加入string 列出set中数据 null 1 string HashSet没有重复数据. 测试List.... 列出list中数据 1 2 1 string string List数据可以重复. 组成100遍字符串 使用StringBuilder耗时 0 使用String耗时 0 组成10000遍字符串 使用StringBuilder耗时 16 使用String耗时 875