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的区别

相同点:两者都是基于存储元素的数组来实现的,它们会在内存中开辟块连续的空间来存储,由于数据存储是连续的,它们支持用序号(下标)来访问元素,但是插入和删除是要移动容器中的元素,所以执行较慢。两者都有一个初始化的容量的大小,为10;当里面存储的元素超过这个大小时,就会动态的进行扩容。Vector默认扩充为原来的2倍,ArrayList默认扩充为原来的1.5倍。
区别:二者最大的区别在与synchronization(同步)的使用。在ArrayList中没有一个方法是同步的,而在Vector中,绝大部分方法都是同步的。所以Vector是线程安全的,而ArrayList不是线程安全的。由于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攻击问题

  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集合类面试题总结的更多相关文章

  1. 一招破解 Java 集合类面试题

    今日招式:Java集合类面试题 Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天 ...

  2. 一份最贴近真实面试的Java基础面试题

    这是一份Java基础知识的面试题.在网上的关于Java的面试题数不胜数,但认真看过感觉大多数都没有实用性,有很多是面试官根本就不会问到的,那些已经脱离了实际开发的技术问题.而这份资料来源自一份个人觉得 ...

  3. 大公司最喜欢问的Java集合类面试题

    看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中包含了一系列重要的集合类,而对于集合类,主要 ...

  4. 面试3——java集合类总结(List)

    1.集合类 数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,且长度一定,不可改变. 集合:只能存储对象,长度可变,可以存储不同类型的对象.Java集合类主要有三种:set,lis ...

  5. BAT面试必备——Java 集合类

    本文首发于我的个人博客:尾尾部落 1. Iterator接口 Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法.它的一个子接 ...

  6. Java集合类笔试题

    介绍Collection框架的结构 Collection接口是单值存放的最大父接口,可以向其中保存多个单值的数据(所谓单值就是指集合中的每个元素都是一个对象).其子接口主要有:List.Set.Que ...

  7. 面试3——java集合类总结(Map)

    1.概述: Java 中的map集合使用键值对(key-value)来保持数据,其中值(value)可以重复,键(key)必须唯一,但最多只能有一个key为空,它的主要实现类有HashMap.Hash ...

  8. Java集合类面试题

    java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最 ...

  9. 大公司喜欢问的Java集合类面试题

    Collection Collection是基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素而另一 ...

随机推荐

  1. spring 引用Bean的属性值

    引用Bean的属性值 从Spring3.0开始,可以通过#{beanName.beanProp}的方式方便地引用另一个bean的属性值1.不需要使用PropertyPlaceholderConfigu ...

  2. 理解ES6中的Promise

    一.Promise的作用 在ajax请求数据的过程中,我们可以异步拿到我们想要的数据,然后在回调中做相应的数据处理. 这样做看上去并没有什么麻烦,但是如果这个时候,我们还需要做另外一个ajax请求,这 ...

  3. 使用Visual Studio Team Services进行压力和性能测试(二)——压力测试执行

    使用Visual Studio Team Services进行压力和性能测试(二)--压力测试执行 1.点击Run test将会该压力测试进行排队,我们将看到等待测试代理屏幕.Visual Studi ...

  4. Excel实用录入技巧

    一.文本录入技巧 输入开头为0的序号 当直接输入单元格中的数字第一个为0时系统会默认去掉 只需要经单元格格式改为文本或者在单元格输入前使用英文状态下的单引号(‘) 例如:'0001 >>& ...

  5. CSS| 框模型-輪廓

    轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用.CSS outline 属性规定元素轮廓的样式.颜色和宽度. 相關屬性 outline-color 属性 ou ...

  6. MailKit帮助类

    public class EmailHelp { /// <summary> /// Smtp服务器地址 /// </summary> private static reado ...

  7. nginx代理 upstream轮询

    问题描述 我有2个Tomcat  一个端口开启(8021),一个端口未开启(8022),在nginx里用upstream模块进行代理 ,代理的负载算法采用的是默认的轮询算法,配置成功后,访问页面时并没 ...

  8. Django 项目连接数据库Mysql要安装mysqlclient驱动出错 : Failed building wheel for mysqlclient:

    1,如果直接用 CMD命令:pip install mysqlclient ,会安装出错. 2,解决问题,参考了这个博友的帖子:https://blog.csdn.net/qq_29784441/ar ...

  9. Nginx主程序使用介绍

    守护进程和服务 <br\>在首次运行Nginx之前,了解此应用程序的性质很重要. 有两种类型的计算机应用程序 – 那些需要用户输入,因此在前台运行,另一种在后台运行. Nginx是后一种类 ...

  10. 用navicat手动删除了数据表的记录,再次写入的时候,怎么让id重新从1开始?

    问:用navicat手动删除了mariadb数据表的记录,再次写入的时候,自增id会继续,不会从1开始. 比如,原来有10条记录,全部清空,再次写入数据,id会从11开始,怎么让他重新从1开始呢? 重 ...