Java 集合框架性能分析与HashMap源码分析

1.类集实际上就属于动态对象数组,在实际开发之中,数组的使用出现的几率并不高,因为数组本身有一个最大的缺陷:数组长度是固定的。

2.类集有两大接口,Collection 和 Map。

Collection

3.Collection有两个子接口,List和Set

List

4.list元素可重复,有子类ArrayList(使用率80%),Vector,LinkedList

5.get()方法是List子接口提供的。如果现在操作的是Collection接口,那么对于此时的数据取出只能够将集合变为对象数组操作。

6.请解释ArrayList与Vector区别

  1. 历史时间:ArrayList是从JDK1.2提供的,而Vector是从JDK1.0就提供了。
  2. 处理形式:ArrayList是异步处理,性能更高;Vector是同步处理,性能较低。
  3. 数据安全:ArrayList是非线程安全;Vector是性能安全。
  4. 输出形式:ArrayList支持Iterator、ListIterator、foreach;Vector支持Iterator、ListIterator、foreach、Enumeration。

7.在以后使用的时候优先考虑ArrayList,因为其性能更高,实际开发时很多时候也是每个线程拥有自己独立的集合资源。如果需要考虑同步也可以使用concurrent包提供的工具将ArrayList变为线程安全的集合(了解)。

8.ArrayList和LinkedList的区别

ArrayList封装的是一个数组,可以初始化数组长度,不够时动态扩充,时间复杂度为1;
LinkedList封装的是一个链表,时间复杂度为n。

Set

9.Set有两个子类:HashSet(无序存储)、TreeSet(有序存储)

10.TreeSet

  • 既然TreeSet子类可以进行排序,所以我们可以利用TreeSet实现数据的排列处理操作。此时要想进行排序实际上是针对于对象数组进行的排序处理,而如果要进行对象数组的序,对象所在的类一定要实现Comparable接口并且覆写compareTo()方法,只有通过此方法才能知道大小关系。
 public int compareTo(Person o) {
	if (this.age > o.age ) {
		return 1 ;
	}else if (this.age < o.age ){
		return -1 ;
	}else {
		return this.name.compareTo(o.name) ;
	}
 } 

  • 需要提醒的是如果现在试用Comparable接口进行大小关系匹配,所有属性必须全部进行比较操作

11.重复元素判断
hashCode () & equals () 的关系就像 f(x) & x

12.集合输出

  • Iterator迭代输出
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
    System.out.println(iterator.next());
}
  • ListIterator双向迭代接口
ListIterator<String> listIterator = list.listIterator() ;
System.out.print("从前向后输出: ") ;
while (listIterator.hasNext()) {
    System.out.print(listIterator.next()+"、") ;
} 
System.out.print("\n从后向前输出: ") ;
while (listIterator.hasPrevious()) {
    System.out.print(listIterator.previous()+"、") ;
}
  • Enumeration 枚举输出
Enumeration<String> enumeration = vector.elements() ;
while (enumeration.hasMoreElements()) {
System.out.println(enumeration.nextElement()) ;
} 
  • foreach 输出

Map

13.Map有四个子类:HashMap,HashTable,TreeMap,ConcurrentHashMap

  • HashMap:性能较高,线程不安全,异步处理,基于哈希表和红黑树实现.在多线程情况下使用会产生死锁,cpu飙到100%,多线程情况下使用ConcurrentHashMap,允许key,value为null.

  • HashTable:同步处理,线程安全,性能较低,锁的是整个哈希表,读读互斥.key,value均不为null

  • TreeMap:性能较高,线程不安全,异步处理,基于红黑树实现,只允许value为空.

  • ConcurrentHashMap:线程安全且高效,key,value均不为null.

14.Map集合使用Iterator输出

// 1.将Map集合转为Set集合
Set<Map.Entry<Integer,String>> set = map.entrySet() ;
// 2.获取Iterator对象
Iterator<Map.Entry<Integer,String>> iterator = set.iterator() ;
// 3.输出
while (iterator.hasNext()) {
// 4.取出每一个Map.Entry对象
Map.Entry<Integer,String> entry = iterator.next() ;
// 5.取得key和value
System.out.println(entry.getKey()+" = " +entry.getValue()) ;
} 

HashMap源码分析以及面试题,隔壁小孩都看懂了

发布了42 篇原创文章 · 获赞 13 · 访问量 6515

猜你喜欢

转载自blog.csdn.net/weixin_43508555/article/details/104087004