单值类型集合List和Set的异同(含面试题)

单值类型集合总结:

不同 添加 删除(下标) 删除元素 包含元素 数据结构 构造方法
List
(ArrayList)
(不唯一) list.remove(下标) list.remove(元素)/迭代器
元素为基本数据类型时需要区别于下标
比较机制:equals()
list.contains(元素)
比较机制:equals()
数组 a.()[默认开辟10块空间]
b.(int)
Set
(HashSet)
(唯一)
hashCode() == equals()
set.remove(元素)/迭代器
比较机制:hashCode() == equals()
set.contains(元素)
比较机制:hashCode() == equals()
哈希表 a.()[默认开辟16块空间]
b.(int,float)
阈值:int*float【每个小组最多承载量】
SortedSet
(TreeSet)
(唯一)
compareTo()/compare()[比较器]
set.remove(元素)/迭代器
比较机制:compareTo()/compare()[比较器]
set.contains(元素)
比较机制:compareTo()/compare()[比较器]
二叉树 a.()[默认开辟16块空间]
b.(比较器)
Collections:父接口
共有的方法 共有的遍历方式 共有的特点
add(元素) clear() remove(元素) size() addAll(集合) iterator() contains(元素) removeAll(集合)retainAll(集合) (9个) foreach + 迭代器 当我们使用迭代器遍历集合的过程中 不允许对集合的整体进行添加、删除操作 否则触发CME异常 如果在遍历的时候想要删除的话:ite.remove()
(1)List:[有序 不唯一]
特有的方法 get(下标) remove(下标)
特有的遍历 for + 下标
特点 1.当我们想要往List集合里面添加元素的时候:list.add(元素) -》 不需要做比较 2.当我们想要从List集合里面删除元素的时候: list.remove(下标) -》 不需要做比较 list.remove(元素) -》 需要做equals()比较 3.当我们想要判断List集合里面是否存在某个元素的时候: list.contains(元素) -》 需要做equals()比较
实现类 数据结构 构造方法
ArrayList 数组 ArrayList()/ArrayList(int 空间大小)/ArrayList(单值集合)
Vector 数组 Vector(int 空间)/Vector(int 空间,int 步长)
LinkedList 链表 LinkedList()/LinkedList(单值集合)
Stack Stack()
(2)Set:[无序 唯一]
特有的方法
特有的遍历
特点 1.当我们想要往Set集合里面添加元素的时候:set.add(元素) -》 需要hashCode() == equals() 2.当我们想要从Set集合里面删除元素的时候:set.remove(元素) -》 需要hashCode() == equals() 3.当我们想要判断Set集合里面是否存在某个元素: set.contains(元素) -》 需要hashCode() == equals()
实现类 数据结构 构造方法
HashSet 哈希表 HashSet()/HashSet(int 分组,float 加载因子)
SortedSet:[有序 唯一]
特有的方法 first() last() pollFirst() pollLast()
特有的遍历
特点 1.当我们想要往SortedSet集合里面添加元素的时候: set.add(元素) -》 需要compareTo()/compare() 2.当我们想要从SortedSet集合里面删除元素的时候: set.remove(元素) -》 需要compareTo()/compare() 3.当我们想要判断SortedSet集合里面是否存在某个元素: set.contains(元素) -》 需要compareTo()/compare()
实现类 数据结构 构造方法
TreeSet 二叉树 TreeSet()/TreeSet(比较器)
注意 注意:当一个对象已经添加进TreeSet集合之后,不要随意的修改那些参与排序的属性值,如果在添加之后想要修改的话:删除 + 修改 + 添加 注意:当一个对象已经添加进HashSet集合之后,不要随意的修改那些参与生成哈希码值的属性值,如果在添加之后想要修改的话:删除 + 修改 + 添加

面试题

  1. List Set Map属于同一个等级吗?不是
    List Set属于Collection的子接口
    Collection和Map属于同一个等级

  2. 2.Collection和Collections之间的区别?
    Collection是单值类型集合统一的父接口
    Collections是集合的工具类

  3. Collections.addAll()底层实现 元素个数为什么可以随意?可变参

  4. ArrayList和Vector之间的区别?

    1):同步特性不同
    ArrayList同一时间允许多个线程访问 效率较高
    但是可能会出现并发错误

    ​ Vector同一时间允许一个线程进行访问 效率较低
    ​ 但是不会出现并发错误

    2):扩容机制不同
    ​ ArrayList
    ​ jdk6.0及之前 x*3/2+1
    ​ jdk7.0及之后 x+(x>>1)

    ​ Vector
    ​ Vector(int)
    ​ Vector(int,int)

    3):出现的版本不同
    ​ ArrayList since jdk1.2
    ​ Vector since jdk1.0

  5. 如何将线程不安全的ArrayList变成线程安全的List集合?

    List x = Collections.synchronizedList(ArrayList对象)

  6. CME检测原理?

    计数器的原理
    每一个集合都有一个modCount遍历 用来记录对集合的
    处理次数[添加 、 删除 修改…]
    当通过集合得到迭代器的时候 底层会自动的将集合的modCount的
    值拷贝到迭代器自己的属性里面
    每一次car.next()触发两个值的比较
    如果两个值不同步了 那么出现CME异常

  7. ArrayList和LinkedList之间的区别?
    ArrayList底层基于数组实现的
    优点:随机访问 遍历查找
    缺点:添加、删除效率低

    ​ LinkedList底层基于链表实现的
    ​ 优点:添加 删除效率高
    ​ 缺点:随机访问 遍历查找效率低

  8. List Set存取元素特性有什么不同?

    ​ List存的时候不需要作比较 直接添加
    ​ List取的时候
    ​ remove(下标) 不需要比较
    ​ remove(元素) 需要比较equals

    ​ Set存的时候需要做hashCode() == equals()
    ​ Set取的时候需要做hashCode() == equals()

你可能感兴趣的:(Java面向对象核心逻辑,数据结构,java,set,arraylist)