List和Set集合面试题

List和Set集合面试题面试List和Set有什么区别?

① List 允许有重复元素
Set 不允许有重复元素
② List可以保证每个元素存储顺序
Set无法保证元素的存储顺序哪种集合可以实现自动排序?
TreeSet 集合实现了元素的自动排序
TreeSet集合存储的元素的类型必须实现Comparable接口

Vector和ArrayList的初始化大小和容量扩充有什么区别?

1 Vector 初始大小 10 ,
capacityIncrement 增量 =0, 扩容为原来的2倍
增量 >0, 扩容为原来的大小+增量
2. ArrayList 初始容量为0,
第1次扩容add方法为10,
原因:private static final int DEFAULT_CAPACITY = 10;
后面每次扩容 oldCapacity + (oldCapacity>>1) 原来的1.5

Vector、ArrayList、LinkedList的区别? 什么场景使用?

Vector是早期的动态数组,它使用synchronized来保证线程安全,如果非线程安全的场景不建议使用。
ArrayList:常用的动态数组,本身线程不安全,因此性能比Vector好很多,在单线程的情况建议使用
LinkedList:是双向链表的集合,也是非线程安全的集合。
① Vector和ArrayList底层都是动态数组实现的,非常适合随机访问,不是尾部的插入和删除元素,效率比较低
② 需要在前半部分进行插入,修改删除建议使用LinkedList
​Collection 和 Collections的区别 Collection 是List和Set的父接口
Collections 是针对集合的帮助类,Collections提供了一些方法去操作集合,
例如 Collections.sort()排序
Collections.reverse()反转

​LinkedHashSet如何保证有序和唯一性?

LinkedHashSet ,底层数据结构 哈希表 + 链表 实现的。
链表保证了元素的有序即存储和取出顺序一致。逻辑顺序 哈希表保证了元素的唯一性。
​HashSet是如何保证数据不可重复 查看HashSet源码,发现HashSet的本质就是一个HashMap
查看源码add方法,发现调用map.put方法,向set集合中存储的 值,被设置为map的“key”的位置,其“value”位置设置一个PRESENT常量值。
我们都知道HashMap的key是唯一,继续查看HashMap的put方法会发现底层调用putVal方法存储值,putVal方法内部先调用hashCode方法判断key的hash值是否一致,如果hash值一致再调用对象的equals方法当HashSet中放入两个对象之后
情况1: hashCode值不一样,因此不需要调用equals方法 认为他们不是同一个对象,可以存入两个对象
情况2: hashCode值一样,就需要进一步比较equals方法 equals返回true,就判断他们是同一个对象 不能存重复的元素。 equals返回false,则判断他们不是同一个对象

如何用程序模拟栈先进后出?

可以使用集合中Stack类,它是标准的先进后出的栈结构 可以使用push方法进栈, pop方法出栈(取出栈顶元素并且删除该元素)
// 栈:先进后出 | 后进先出
Stack stack=new Stack<>();
stack.push(“a”); //push方法进栈
stack.push(“b”);
stack.push(“c”);
for(int i=0;i<3;i++) {
System.out.println(
stack.pop());//出栈的方法
}
// 进栈: abc
// 出栈: cba

Comparable 和 Comparator的区别

1 包不同
Comparable 是 java.lang下
Comparator 是 java.util 下
2 Comparable 是内部排序,要求被排序对象实现这个接口
Comparator 是外部排序,不需要排序的对象实现Comparator接口
3 Comparator 需要重写 public int compare(T o1,T o2);方法
Comparable 需要重写 public int compareTo(T o);方法

你可能感兴趣的:(java面试题,java)