java hashmap 面试_java面试题:HashMap面试题

java面试题:HashMap面试题

Szx • 2019 年 03 月 13 日

请讲下Java里面的容器

分两大类,Map和Collection。而Collection又有子接口List(数据存储顺序和插入顺序是一样的)、Set(里面的元素具有唯一性)

Map是存储键值对的,里面的健不可以重复,但值可以重复

a. 对于List主要有ArrayList和LinkedList两种实现。实现的数据结构不同,所以主要的区别也都是和数据结构相关的。 ArrayList基于数组,随机访问快,而对于中间元素的插入删除效率比较低,而且需要考虑扩容问题。LinkedList,则 基于链表,和ArrayList提到的正相反,随机访问慢,但对于中间元素的插入和删除更有效率。

Set也是一种Collection,和List比起来主要体现在元素唯一性。

请说下Iterator的作用

迭代器可以实现Collection接口的方法,可以一个一个地获取集合中的元素

在遍历集合时 可判断是否有下一个元素

说下ArrayList和LinkedList的区别和联系,并说明什么情况下用它们

区别:ArrayList用于对象的随机访问速度快,没有顺序

LinkedList实现机制是链表式的,和顺序有关,速度比ArrayList慢

联系:ArrayList和LinkedList都是List接口的实现类

当要快速获取一个值时,用ArrayList,用于顺序插入操作时,用LinkedList.

说下List,Set,Map三种集合各有什么特征

List集合中的元素可以重复,

Set集合中的元素不可以重复

Map集合用键-值映射存放对象,Map容器中的键对象不能重复,值对象可以重复

HashSet和TreeSet有什么区别,什么时候用它们

区别:HashSet中的元素不能重复,没有顺序

TreeSet中的元素不能重复,但有顺序

当集合中的元素需要排序时,用TreeSet

一般情况下用HashSet,因为不需要排序,速度比TreeSet快

什么是泛型,怎么使用的,有什么好处?

答案

定义一个集合时,可以知道里面定义的是什么类型

使用:在集合类型后面加< 数据类型 >

使用泛型后,从集合中取得元素后就不用再用强转

什么是for each循环,它可以循环那些数据类型

答案

也可以叫增强型循环,通过对象拿到集合里的值,因为扩展性比较强,建议多使用

可以用来循环集合和数组

比较下集合和数组的优缺点

集合是多个对象的容器,可以将不同数据类型的多个对象组织在一起

数组类型是有相同数据类型的数据集合,数组是很多语言都支持的底层数据结构,性能上是最高的

HashMap与LinkedHashMap,和TreeMap的区别。

共同点:HashMap,LinkedHashMap,TreeMap都属于Map的实现类.

不同点: 1.HashMap里面存入的键值对在取出的时候是随机的,

2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现.

在List里面怎么去掉重复的数?

通过把List里面的数据放入HashSet可以去除重复

HashMap和ArrayList是不是都是线程不安全的?

ArrayList是线程不安全的;HashMap是线程不安全的;还有我们常见的一些JAVA集合都是线程不安全,这样做是为了提高性能

在JDK5以后提供了线程安全的并发包java.util.concurrent并发包,譬如里面的类CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap等

ArrayList集合加入1万条数据,应该怎么提高效率

因为ArrayList的底层是数组实现,并且数组的默认值是10,如果插入10000条要不断的扩容,耗费时间,所以我们调用ArrayList的指定容量的构造器方法ArrayList(int size) 就可以实现不扩容,就提高了性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Q: HashMap如何实现的,能否简单描述一下? A: HashMap是基于哈希表的数据结构,它是由数组和链表构成的。当我们将一个键值对存储在HashMap中时,会首先根据键的哈希值计算出它在数组中的下标,如果该下标处已经有其他键值对了,那么它们就会以链表的形式存储在该位置,新的键值对就会被添加到链表的末尾。如果链表长度过长,就会转换成红黑树,以提高查询效率。 Q: HashMap的put方法是怎样实现的? A: HashMap的put方法首先会根据键的哈希值计算出它在数组中的下标,然后在该位置进行插入操作。如果该位置已经有其他键值对了,就会遍历链表或红黑树,查找是否已经存在该键,如果存在就更新它的值,如果不存在就将它添加到链表或红黑树的末尾。如果链表长度过长,就会转换成红黑树。 Q: HashMap的get方法是怎样实现的? A: HashMap的get方法首先会根据键的哈希值计算出它在数组中的下标,然后在该位置进行查找操作。如果该位置是空的,就返回null;如果该位置已经有其他键值对了,就遍历链表或红黑树,查找是否存在该键,如果存在就返回它的值,如果不存在就返回null。 Q: HashMap的扩容是怎样实现的? A: HashMap的扩容是在当前容量达到阈值时进行的。扩容后的容量是原来容量的两倍,然后将原来的键值对重新分配到新的数组中。具体操作是遍历原来的数组,将每个键值对重新计算哈希值,并根据新的哈希值找到它在新数组中的位置,然后将它插入到该位置。如果该位置已经有其他键值对了,就遍历链表或红黑树,查找是否已经存在该键,如果存在就更新它的值,如果不存在就将它添加到链表或红黑树的末尾。如果链表长度过长,就会转换成红黑树。 Q: HashMap的并发问题怎样解决? A: HashMap是非线程安全的,如果在多线程环境下使用,就会出现并发问题。Java提供了ConcurrentHashMap类来解决这个问题,它是线程安全的。ConcurrentHashMap使用分段锁来保证线程安全,将整个HashMap分成多个段,每个段都有自己的锁,不同的线程可以同时访问不同的段,从而提高了并发度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值