集合面试题

1、JAVA中集合和数组的区别

数组与集合的区别:

1、数组声明了它容纳的元素的类型,而集合不声明。

2、数组是大小固定的,一旦创建无法扩容;集合大小不固定,

3、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。

4、数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。集合就是基于数组创建的容器类

2、Collection和Collections的区别

Collection: Collection是集合类的顶级接口,被List和set直接继承

Collections: 是集合类的一个工具类,内部提供了一些静态方法,用于对集合进行排序和检索,以及线程安全等操作

区别:Collection是集合的接口,Collections是一个工具类

3、list和set的区别

  • list: 元素有序,有下标,可以重复,可以存入多个null值,

  • set: 元素无序,无下标,不可重复,只能存在一个null值

    扩容机制:jdk1.8

    ArrayList,LinkedList,HashMap

    ArrayList初始化容量10,扩容因子1.5

    LinkedList没有初始化容量和扩容因子

    HashMap初始化容量16,扩容因子0.75

4、ArrayList和LinkedList 和Vector的区别

区别:

1、当我们指定位置插入的时候 linkedlist效率一定高于arraylist

2、当我们指定元素查找的时候, arraylist效率相对高一点(具体要看元素所在的位置)

3、当我们使用下标去遍历元素的时候, arraylist一定比linkedlist快;

4、线程安全方面,ArrayList和LinkedList是异步的,可以被多个线程同时操作,所以它们是不安全的,而Vector内部使用了同步锁synchronize保证了线程的安全

5、存储方式:ArrayList和Vector以数组方式存储,linkedlist是双向链表

5、HashMap和HashTable的比较

相同点: 底层数组+链表(红黑树),key-value的形式存储元素,内部是单链表,当容量不足时可以自动扩容,实现了Serializable支持序列化,也实现了cloneable接口,支持被克隆

不同点:

1)它们继承的父类不同,HashTable继承了Dictionary类,HashMap继承了AbstractMap类,

2)HashTable线程安全,它给每个方法加上synchronize,而HashMap线程不安全

3)HashTable中不允许存null,而HashMap中可以存null,但是只允许一个key为null

4)hash值不同,HashTable直接使用对象的hash值,取模运算. HashMap重新计算hash值,采用与运算

5)数组初始化和扩容方式不同,HashTable默认容量11,HashMap是16

6、HashMap和ConcurrentHashMap区别

HashMap线程不安全,ConcurrentHashMap是线程安全的,分段锁机制

7、HashMap 底层实现原理

底层实现原理: HashMap底层是数组➕链表(红黑树)组成,

什么时候使用红黑树?

链表长度大于8

数组长度大于64

如何解决hash冲突?

链表法

8、HashMap和LinkedHashMap的区别

HashMap是数组➕链表(红黑树),

linkedhashmap是链表➕散列表结构,底层使用linked双向链表保存数据,保证有序性,初始化容量16,加载因子0.75

9、HashSet和TreeSet的区别

区别:

HashSet : 可以添加null ; 不排序, 使用equals比较去重
TreeSet : 不可以null; 排序; 去重: 自定义的对象必须实现Comparable接口 重写comparaTo方法

10、HashSet和LinkedHashSet区别

HashSet 不排序 , 使用equals比较去重

实现原理:HashSet基本是将HashMap进行了一层封装,通过一个静态变量实现了不允许存储相同key

LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置。LinkedHashSet将会以元素的添加顺序访问集合的元素

实现原理:LinkedHashSet继承HashSet,在HashSet里面有这样一个构造函数

11、如何对list去重?

Java8新特性stream去重

HashSet去重

双重for循环去重

把list里的对象遍历一遍,用list.contains(),如果不存在就放入到另外一个list集合中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值