Java基础八股吟唱 02_day

Java基础八股吟唱 02_day

  • hashCode的作用

    • Java的集合有两类,分别是List和Set。前者存储的元素有序且可重复,后者存储的元素无序不重复。当我们在向Set集合中插入元素的时候,如何判断两个元素是否重复呢?很显然,调用equals嘛,但是这样最坏的情况下,时间复杂度是O(n)(即一个一个的比较,直到最后一个元素为止)
    • 于是乎,有人发明出了哈希算法来提高集合中元素的查找效率。这种方式将集合划分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据对象的哈希码就可以确定该对象应该存储的那个区域了
    • hashCode方法在Object基类中定义,自然,Java中的所有对象都会有一个hashCode方法。它返回一个根据对象内存地址换算出的一个值。这样一来,当集合要添加新元素是,判重的话就直接调用该对象的hashCode方法,就能定位到它应该放置的物理位置。如果这个位置已经有元素了,就调用它的equals方法进行比较,相同的话就不存了,不相同(即发生了哈希碰撞)就采取其他方式(再次进行散列,或者将这些元素用链表“串起来”)。这样一来实际低矮用equals方法的次数就大大降低了
  • String、StringBuilder和StringBuffer的区别

    • String是只读字符串,是一个不可变对象。从底层源码上看是一个final类型的字符数组,所引用的字符串不能被改变,每次对String对象的操作都会生成新的String对象
    • 每次+操作:隐式在堆上new了一个和原字符串相同的StringBuilder对象,再调用append方法拼接+后面的字符
    • StringBuffer和StringBuilder他们都继承了AbstractStringBuilder抽象类,从AbstractStringBuilder抽象类源码中我们可以得知它们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuilder和Stringbuffer来进行操作
    • StringBuffer 对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的
  • ArrayList和LinkedList的区别

    • ArrayList可以看做是一个自动扩容的数组,当然,本质上是用一个Object类型的数组进行存储的,该数组的默认大小是10。达到容量上限后想要扩容,会创建一个大小是原来1.5倍大小的新数组,然后将原数组的内容copy过去,改变内部数组引用指向新创建的数组。知道索引查询效率是O(1),否则是O(n)。插入和删除的效率不高(最坏为O(n))
    • LinkedList是一个双向链表,在添加和删除元素时具有比ArrayList更好的性能(O(1)),但是get和set方面弱于ArrayList。当然,这些都是建立在数据量较大的前提下。其实对于LinkedList有一个小优化:get方法如果气索引大于size()/2的话,会从尾端开始查找元素(LinkedList也支持索引查找的,不过不推荐,使用一种数据结构之前应当利用该数据结构的优势,而不是去做它本就不擅长的事情)
  • HashMap和HashTable的区别

    • 父类不同

      • HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类
      • 不过,他们都实现了Map,Cloneable,Serializable这三个接口
    • 对外提供的接口不同

      • Hashtable比HashMap多提供了elments() 和contains() 两个方法

      • elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举

      • contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实

        上,contansValue() 就只是调用了一下contains() 方法

    • 对null的支持不同

      • Hashtable:key和value都不能为null

      • HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性;可以有多个

        key值对应的value为null

    • 安全性不同

      • HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自

        己处理多线程的安全问题

      • Hashtable是线程安全的,它的每个方法上都有synchronized 关键字,因此可直接用于多线程中

      • 虽然HashMap是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部

        分的使用场景都是单线程。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap

      • ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为

        ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定

    • 初始容量大小和每次扩充容量大小不同

    • 计算hash值的方法不同

  • Collection和Collections的区别

    • Collection是集合类的上级接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、

      Set

    • Collections是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种

      集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的

      Collection框架

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP