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. Java集合之TreeMap源码分析

    一.概述 TreeMap是基于红黑树实现的.由于TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射根据其键的自然顺序进行排序或者根据创建映射时提供的C ...

  2. web应用

    实现HttpServlet的Web应用 <dependency> <groupId>javax.servlet</groupId> <artifactId&g ...

  3. (网页)人人都会的35个Jquery小技巧

    转自CSDN: 收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发. 1. 禁止右键点击 $(document).ready(function(){ $(document).bind(&q ...

  4. HTTP的Referrer和Referrer Policy设置

    Referrer referrer是HTTP请求header的报文头,用于指明当前流量的来源参考页面.通过这个信息,我们可以知道访客是怎么来到当前页面的.这对于Web Analytics非常重要,可以 ...

  5. 大表分批删除脚本之MySQL版

    经常需要定期对某些表删除历史数据,通常这样的表的数据又是非常巨大,为了减轻对线上环境的影响,删除时必须分成小批量来进行. 以前分享过SQLServer的版本. 下面是MySQL版本: delimite ...

  6. Asp.net MVC通过自定义特性实现Action日志记录

    一.自定义特性 /// <summary> /// 描述特性 /// </summary> [AttributeUsage(AttributeTargets.Method)] ...

  7. SQL mysql优化

    慢查询 如何通过慢查日志发现有问题的SQL? 查询次数多且每次查询占用时间长的SQL pt-query-digest分析前几个查询 IO大的SQL pt-query-diges分析中的Rows exa ...

  8. account

    Account Doc V3_ADD 1. 用户头像 用户头像今后会放在阿里云上,所以: dev: http(s)://pyserver.oss-cn-hangzhou.aliyuncs.com/DE ...

  9. 对数组的操作splice() 和slice() 用法和区别

    JavaScript splice() 方法 定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组. 语法 arrayObject.spli ...

  10. CF 633 E. Binary Table

    题目链接 题目大意:给定一个棋盘,棋盘上有0或1,你可以将一整行取反或者一整列取反,要使得最后剩的1最少.\((1\le n\le 20,1\le m\le 100000)\). 一个容易想到的思路就 ...