面试3——java集合类面试题总结

1.总结一下啊hashmap和hashtable的知识点?
1)关于hashmap的说法
- HashMap实际上是一个“链表散列”的数据结构,在jdk1.8中添加了红黑树。HashMap底层结构是一个数组,数组中的每一项为一条链表,若链表长度超过8,使用红黑树
- HashMap的实例有两个参数影响其性能:初始容量和装载因子。HashMap的初始容量为16,装载因子为0.75
- HashMap是不同步的,因此是非线程安全的
- HashMap的key-value都是存储在Entry中的
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next; - HashMap可以存null键和null值,不能保证元素的顺序,通过hashcode()方法和equals方法保证键的唯一性
- 解决hash冲突的方法。HashMap解决hash冲突的方法为链地址法。
2)HashMap和HashTable的区别
- 继承不同
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable - HashTable的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境中,可以直接使用HashTable,但是要使用HashMap的话就要自己额外增加同步处理
Map m = Collections.synchronizedMap(new HashMap(...));
- HashTable中,key和value都不允许出现null,在HashMap中,null可以作为键,这样的键只有一个,可以有一个或者多个键所对应的值为null。当get方法返回null时,既可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此HashMap中不能由get方法来判断HashMap中是否存在某个键,而应该用containsKey方法来判断
- 哈希值的使用不同,HashTable直接使用对象的hashcode,而HashMap重新计算hash值
- HashTable和HashMap内部实现方式的数组初始大小和扩容方式不同。HashTable中hash数组的默认大小为11,增加方式为old*2+1。HashMap中hash数组的默认大小为16,而且一定是2的倍数。
2. List、Set和Map的区别
List:
- 可以允许重复的对象
- 可以插入多个null值
- 是一个有序容器,即插入的顺序和读取的顺序是一致的
- 常用的实现类有:Arraylist、Linkedlist和Vector。Arraylist最为流行,它提供了索引的随意访问,若经常添加或删除元素的话,Linkedlist性能比Arraylist好。
Set:
- 不允许有重复的对象
- 无序容器,无法保证每个元素的存储顺序,TreeSet通过实现Comparable中的CompareTo方法对其进行排序(此方法需要重写)
- 只允许一个null值
Map:
- Map不是collection的子接口或实现类,Map是一个接口
- Map的每个Entry都有两个对象,一个键一个值,在map中,键是唯一的,值可以持有相同的值
- Map中可以随意持有多个null值,但是最多只能有一个null键
3.什么情况下使用list、set和map
如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList
如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。
4.Arraylist和Linkedlist的区别
- ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于双向链表的数据结构
- 对于随机访问,ArrayList要优于LinkedList,因为LinkedList要移动指针
- 对于插入和删除,LinkedList较占优势,ArrayList要移动数据。
- ArrayList和LinkedList都是非线程安全的容器
5.Vector和ArrayList的区别
6.HashMap和ConcurrentHashMap的区别
http://www.importnew.com/28263.html
7.HashMap的工作实现原理以及代码实现,什么时候用到红黑树
https://www.cnblogs.com/znn93/p/9363894.html
红黑树使用
8.多线程情况下,Hashmap死循环问题
多线程下[Hashmap]的问题
1)多线程put操作后,get操作导致死循环
2)多线程put非null元素后,get操作得到null值
3) 多线程put操作,导致元素丢失
为何会出现死循环
我们知道HashMap采用的是链地址法来解决Hash冲突。因为是链表结构,那么就很容易形成闭合的链路,这样循环的时候只要有线程对这个Hashmap进行get操作,就会产生死循环。在单线程中,只有一个线程对hashmap的数据结构进行操作,是不可能产生闭合回路的。只有在多线程并发的情况下才会发生,在进行put操作的时候,如果size>initialcapacity * loadfactor ,那么这个时候hashmap就会进行rehash操作,随之hashmap的结构就会发生翻天覆地的变化。很有可能两个线程在这个时候同时触发rehash操作,产生闭合的回路。
Hashmap 的 resize 在多线程的情况下可能产生条件竞争。因为如果两个线程都发现 hashmap 需要进行 resize 了,他们会同时试着调整大小。在调整大小的过程中,存储在链表 中的元素的次序会反过来。因为移动到新的位置时,hashmap 并不会将元素放在链表的尾部, 而是放在头部在,这是为了避免尾部遍历。(否则,针对 key 的 hashcode 相同的 entry 每次 添加还要定位到尾节点)。如果条件竞争发生了,可能出现环形列表。之后,当我们调用 get(key)操作时就可能发生死循环。
9.HashMap出现Hash dos攻击问题
Hashmap通过链地址法来解决hash冲突。
10.ConcurrentHashMap的工作原理及代码实现,如何统计所有的元素个数
工作原理链接:https://my.oschina.net/u/3777556/blog/1795495
https://www.cnblogs.com/study-everyday/p/6430462.html
11.Collection和Collections的区别
Collection是集合的上级接口,继承此接口的有set和list
Collections是针对集合类的一个工具类,提供一系列的静态方法实现对各种集合的搜索、排序、线程安全化等操作。
面试3——java集合类面试题总结的更多相关文章
- 一招破解 Java 集合类面试题
今日招式:Java集合类面试题 Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天 ...
- 一份最贴近真实面试的Java基础面试题
这是一份Java基础知识的面试题.在网上的关于Java的面试题数不胜数,但认真看过感觉大多数都没有实用性,有很多是面试官根本就不会问到的,那些已经脱离了实际开发的技术问题.而这份资料来源自一份个人觉得 ...
- 大公司最喜欢问的Java集合类面试题
看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中包含了一系列重要的集合类,而对于集合类,主要 ...
- 面试3——java集合类总结(List)
1.集合类 数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,且长度一定,不可改变. 集合:只能存储对象,长度可变,可以存储不同类型的对象.Java集合类主要有三种:set,lis ...
- BAT面试必备——Java 集合类
本文首发于我的个人博客:尾尾部落 1. Iterator接口 Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法.它的一个子接 ...
- Java集合类笔试题
介绍Collection框架的结构 Collection接口是单值存放的最大父接口,可以向其中保存多个单值的数据(所谓单值就是指集合中的每个元素都是一个对象).其子接口主要有:List.Set.Que ...
- 面试3——java集合类总结(Map)
1.概述: Java 中的map集合使用键值对(key-value)来保持数据,其中值(value)可以重复,键(key)必须唯一,但最多只能有一个key为空,它的主要实现类有HashMap.Hash ...
- Java集合类面试题
java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最 ...
- 大公司喜欢问的Java集合类面试题
Collection Collection是基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素而另一 ...
随机推荐
- 慕学在线网0.3_四个model
1.四个model完整代码: # users/models.py from datetime import datetime from django.db import models from dja ...
- 【redis专题(1)】安装与启动
简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo(redis之父)写的key-value存储系统. Redis提供了一些丰富的数据 ...
- JQuery实战中遇到的两个小问题$(document).ready() 、bind函数的参数传递问题
一.$(document).ready() 与 window.onload的区别 1.执行时间 window.onload 必须等到页面内所有元素(包括图片 css js等)加载完毕后才会执行. $( ...
- python第四十八天--高级FTP
高级FTP服务器1. 用户加密认证2. 多用户同时登陆3. 每个用户有自己的家目录且只能访问自己的家目录4. 对用户进行磁盘配额.不同用户配额可不同5. 用户可以登陆server后,可切换目录6. 查 ...
- django静态文件
django静态文件(js脚本.CSS.图片等) 默认统一放在每一个app的static文件夹下, 通过收集静态文件命令,自动将每一个app下static文件夹下的文件复制到根目录的static文件夹 ...
- C#语言————第一章 第一个C#程序
第一章 第一个C#程序 ******************C#程序*************** ①:建立项目:文件-->新建-->项目-->c#-->控制台程 ...
- AIX mount nfs 文件系统失败
报 mount: 1831-008 的错,配置系统参数后恢复. 操作系统版本为: # oslevel 6.1.0.0 LOG如下: # mount 192.168.240.69:/xyz/xvdh2/ ...
- shell脚本之数组
变量:存储单个元素的内存空间. 数组:存储多个元素的连续的内存空间. 数组名:整个数组只有一个名字: 数组索引:编号从0开始: 数组名[索引]: 引用数组中的某个元素:${ ARRAY_NAME [ ...
- win7 系统中的加密文件打不开了
网友提问:我原来安装的时候win7 32位 旗舰版系统,因为想电脑达到最大运行速度,所以决定把系统重装为64位的win 7系统.[了解win 7 32位于64位的区别]因为重装前未解密bitlocke ...
- 17秋 软件工程 第六次作业 Beta冲刺 Scrum5
17秋 软件工程 第六次作业 Beta冲刺 Scrum5 各个成员冲刺期间完成的任务 世强:完成APP端相册.部员管理.手势签到模块: 陈翔:完成Scrum博客.总结博客,完成超级管理员前后端对接: ...