日常工作中遇到的一些问题笔记:

  • 1 JDK1.7与1.8中 Map的hash方法有变动,导致的结果是HashSet读取的时候是有序的。
  • 2 return的用法:一个是返回方法指定类型的值(这个值总是确定的),一个是结束方法的执行(仅仅一个return语句)。
  • 3 for each 底层用的还是iterator。
  • 4 Hash表采用一个映射函数 f : key —> address 将关键字映射到该记录在表中的存储位置,从而在想要查找该记录时,可以直接根据关键字和映射关系计算出该记录在表中的存储位置,通常情况下,这种映射关系称作为Hash函数,而通过Hash函数和关键字计算出来的存储位置(注意这里的存储位置只是表中的存储位置,并不是实际的物理地址)称作为Hash地址。
  • 5 Map <int,int> 这样是会报错的,泛型的声明必须是一个类,int是基本数据类型而不是一个类,这里应该用int的封装类Integer做声明,应该是Map<Integer,Integer>
  • 6 HashMap默认的容量是16,默认加载因子是0.75(3/4),构造方法中可以修改的。
static final int DEFAULT_INITIAL_CAPACITY = 16;    
	static final float DEFAULT_LOAD_FACTOR = 0.75f;
  • 7 HashMap和TreeMap的区别
    HashMap:数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法。
    默认初始容量16,加载因子0.75,扩容为旧容量乘2,查找元素快,如果key一样则比较value,如果value不一样,则按照链表结构存储value,就是一个key后面有多个value;
    TreeMap:基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null,key不可以重复,value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口,会按照排序后的顺序迭代元素,两个相比较的key不得抛出classCastException。主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出
  • 8 一个Map中删除一个不存在的Key是不会报错的
Map map = new Hashtable();
		map.remove("1");
  • 9 HashMap因为resize,所以在多线程下会产生不安全:
Exception in thread "新线程2" java.util.ConcurrentModificationException
	at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922)
	at java.util.HashMap$EntryIterator.next(HashMap.java:962)
	at java.util.HashMap$EntryIterator.next(HashMap.java:960)
	at java.util.AbstractMap.toString(AbstractMap.java:518)
	at java.lang.String.valueOf(String.java:2849)
	at java.lang.StringBuilder.append(StringBuilder.java:128)
	at com.wxx.runnable.MyRunnable2.run(MyRunnable2.java:21)
	at java.lang.Thread.run(Thread.java:745)