Java集合面试题

[面试题]Person类为已经重写好的hashCode()和equals()方法的类,试着写出每次打印set的值

		HashSet set = new HashSet();
		Person2 p1 = new Person2(1001, "AA");
		Person2 p2 = new Person2(1002, "BB");
		set.add(p1);
		set.add(p2);
		p1.name = "CC";
		set.remove(p1);
		/*
		 * remove时计算p1的HashCode值,此时p1的值已被修改,所以算出来的HashCode值并不是之前的,
		 * 所有这个remove并没有remove掉p1,此时打印set值为[(BB 1002), (CC 1001)]
		 */
		System.out.println(set);// [(BB 1002), (CC 1001)]

		set.add(new Person2(1001, "CC"));
		/*
		 * 添加的新的元素[1001,"CC"],虽然和set中的元素相同,但是两者的hashCode值并不相同,前一个元素HashCode
		 * 值为[1001,"AA"]的hashCode值,所以[1001,"CC"被存进来了
		 */
		System.out.println(set);// [(BB 1002), (CC 1001), (CC 1001)]
		
		set.add(new Person2(1001, "AA"));
		/*
		 * 添加的新元素[1001,"AA"]和p1的hashCode值相同,然后调用equals方法,和[1001,"CC"]不一样,所以
		 * 这个元素[1001,"AA"]也被存进来了
		 */
		System.out.println(set);	// [(BB 1002), (CC 1001), (CC 1001), (AA 1001)]

[面试题]HashSet的底层实现原理
   当我们向HashSet中添加一个数据时。会先调用该数据的hashCode方法来决定该数据在数组中所存储的位置
   如果该位置上没有其他的元素,则将该数据直接存放即可。如果该位置已经有了其他的元素,调用该元素所在类的equals方法进行比较。如果返回值是个true则认为两个数据相同则不能存放。如果返回值是个false则以链表的形式将该数存在 该位置上。
   (jdk8中):如果数量达到8则将链表换成红黑树

[面试题]List的主要实现类有哪些?有什么不同?
   ArrayList:List的主要实现类,底层是数组,线程不安全,查找快,增删慢(数组快的特点)
   Vetor:古老的实现类,底层是数组,线程安全的
   LinkedList:底层是使用双向链表。增删块,查找满。

[面试题]:ArrayList的底层实现原理
   通过ArrayList空参的构造器创建对象。底层会创建一个长度为10的数组。当我们向数组
中添加第11个元素时
   底层会进行扩容,扩容为原来的1.5倍(创建一个新的数组长度为原来的1.5倍并将原数组
中的内容添加到新的数组中)

[面试题]TreeSet HashSet ArrayDeque LinkedList ArrayList HashMap的底层实现

TreeSet:底层是红黑树,有两种排序方式:自然排序和定制排序,需要实现Comparable接口或者实现Comparator匿名内部类。并不需要重写hashCode和equals

HashSet:底层是数组;需要重写hashCode和equals,先调用hashCode算出添加元素的hashCode值,找到该hashCode值对应的

ArrayDeque:双端数组:一般用于实现队列和栈这种数据结构;
实现队列:入队:offer() 出队:pull()
实现栈: 入栈:push() 出栈:pop()

LinkedList:底层是一个链表,删插快,但是遍历慢

ArrayList:底层是一个数组,当添加第一个数组时创建一个长度为10的数组,当存储超过数组长度时,扩容为原来的1.5倍

HashMap:调用HashMap空参的构造器,默认创建一个长度为16,默认加载因子为0.75的数组,即每次当达到数组的0.75时,自动扩容2倍。该数组存存在一个个Node元素,该Node元素包含的是entry,即key-value对。

HashMap的存储过程:取该元素的key,调用key的HashCode方法,算出该元素的位置,若该位置没有元素,则直接存入;若该位置有元素,再调用equals方法,如返回值为true,则覆盖之前的元素,若为false,则以链表的形式将这两个元素存在一起,当该链表达到8时,将链表换成红黑树,提高查询的效率。

猜你喜欢

转载自blog.csdn.net/qq_38697437/article/details/82975512