• 安卓实习生面试题-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的理解。。。。。。。。

  • 相关阅读:
    python多线程学习一
    https学习笔记三----OpenSSL生成root CA及签发证书
    https学习笔记二----基础密码学知识和python pycrypto库的介绍使用
    HTTPS学习笔记一----HTTPS的基础理论知识
    一只小鹅的2017
    python 全局变量的import机制
    一起来学设计模式-----工厂模式的实践
    一起来学设计模式-----创建型模式之抽象工厂
    一起来学设计模式-----创建型模式之工厂方法
    一起来学设计模式-----创建型模式之简单工厂
  • 原文地址:https://www.cnblogs.com/p-t-m/p/13367357.html
Copyright © 2020-2023  润新知