欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java集合面试题

程序员文章站 2024-03-22 08:44:34
...

[面试题]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时,将链表换成红黑树,提高查询的效率。