安卓实习生面试题-HashMap

public class hashTest11 {
public static void main(String[] args) {
//创建一HashMap,如果没有制定初始大小,默认底层是hash表数组的大小为16
HashMap<String, String> hashMap = new HashMap<String, String>();
//往容器里面添加元素
hashMap.put("小明","好帅");
hashMap.put("老王","坑爹货");
//获取key为小明的元素 好帅
String element = hashMap.get("小明");
System.out.println(element);
//移除key为老王的元素
String removewElement = hashMap.remove("老王");
System.out.println(removewElement);
//修改key为小明的元素的值为value为其实很丑
hashMap.replace("小明","其实很丑");
System.out.println(hashMap);
//通过put方法也可以达到修改对应元素的效果
hashMap.put("小明","说的反话");
System.out.println(hashMap);
//判断key为老王的元素是否存储()
boolean isExat = hashMap.containsKey("老王");
System.out.println(isExat);
//判断是否有value=“坑爹货”的人;
boolean isHahSomeone = hashMap.containsValue("坑爹货");
System.out.println(isHahSomeone);
//查看容器内有多少个人
System.out.println(hashMap.size());
}
}

HashMapHashTable的区别?

1)容器整体结构

  1. HashMapkeyvalue都允许为空,遇到空的key为时候,会调用putForNullKey方法进行处理,而对value没有处理。
  2. Hashtablekeyvalue都不允许为空,Hashtable遇到null,直接调用NullPointerException

2)容易设定与扩容机制

HashMap默认初始化容量为16,并且容器荣拉ing一定是2n此方,扩容时,是以原容量2倍的方式进行扩容。

HashTable默认初始化容量为11,扩容时,是以原容量2倍再加一的方式进行扩容。

3)散列分布方式(计算存储位置)

  1. HashMAp是先将key键的hashCode经过扰动函数扰动后得到hash值,然后再利用hash &length-1)的方式代替取模,得到元素的存储位置。
  2. Hashtable是除留余数发进行计算存储位置的

4)线程安全(最重要):

  1. HashMap不是线程安全,如果想要线程安全,可以通过调用synchronizedMapMap<K,V> m)使线程安全,但是使用时的运行效率会下降,所以建议使用ConcurrentHashMap容器以此大到线程安全。
  2. HashMap是线程安全的,每个操作方法前都有synchronized修饰是其同步,但运行效率也不高,所以还是建议使用ConcurrentHashMap容器以此达到线程安全。

Hashtable是一个遗留容器,如果我们不需要线程同步,则建议使用HashMap,如果需要线程同步,建议使用ConcurrentHashMap

HashMap不是线程安全,如果多线程下,他是如何处理的?并且什么情况下会发生线程不安全的情况?

HashMap不是线程安全的,如果多个线程同时对同一个HashMap更改数据的话,会导致数据不一致或者数据污染,如果出现线程不安全的操作是,HashMap会尽可能的抛出ConcurrentModificationException防止数据异常,当我们在对一个HashMap进行遍历是,在遍历期间,我们是不能对HashMap进行添加,删除更更改数据的操作,否则会抛出ConncurrentModificationException异常。如果想要线程安全可以考虑使用concurrentHashMap.

在多线程下操作HashMap,由于扩容机制,当HashMap调用resize()进行自动扩容是,可能会导致死循环的发生。

在使用HashMap时,选取什么对象作为可以键比较好,为什么?

可变对象:在创建后自身状态能改变的对象,可变对象就是该对象在创建后它的哈希值可能被改变。

使用HashMap时最好选择不可变对象为key,例如Stringinteger等不可变类型作为key是非常明智的。

如果key是可变的,那么key的哈希值就可能改变,就可能丢失数据。

ArrayList

实现了List接口的可调整大小的数组。实现了所有可选列表操作,并且允许所有类型的元素。主动改变内部用于存储集合元素的数组尺寸

GetsetiteratorlistItertor

LinkedList

实现了List接口的双向链表,实现了所有可选列表操作,并且可以存储所有类型的元素,包括null

LinkedList制定索引处的访问需要顺序遍历整个链表,直到到达指定元素。

LinkedList是对链表这种数据结构的实现

优点:插入及删除操作的时间复杂度为O1

可以动态改变大小

缺点:由于其链式存储的特性,链表不具备良好的空间局部性,也就是说,链表是一种缓存不友好的数据结构。

这是对hashMap的一个比较简单的认识,后续会更新,完善对HashMap的理解。。。。。。。。

原文地址:https://www.cnblogs.com/p-t-m/p/13367357.html