Java 基础之容器



一、Java Collections 框架是什么


     Java Collections 框架中包含了大量的集合接口以及这些接口的实现类和操作他们的算法(例如:排序、查找、反转、替换、复制、取最小元素、取最大元素等),具体而言,主要提供了 list(列表)、Queue(队列)、Set(集合)、Stack(栈)、和 Map(映射表,用于存放键值对)等数据结构,其中 List、Queue、Set、Stack 都继承自 Collection 接口


二、ArrayList、Vector 和 LinkedList 有什么区别?


ArrayList、Vector、LinkedList 类均在 java.util 包中,均为可伸缩数组,既可以动态改变长度的数组。

  • ArrayList 和 Vector 的区别

      ArrayList 与 Vector 最大的区别就是 synchronization(同步) 的使用,没有一个 ArrayList 的方法是同步的,而 Vector 的绝大多数方法(例如 add、insert、remove、set、equals、hashcode 等)都是直接或间接同步的,所以 Vector 是线程安全的,ArrayList 不是线程安全的,正是由于 Vector 提供了线程安全的机制,其性能上要略逊于 ArrayList

  • LinkedList 是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低,但是插入元素时不需要对数据进行移动,因此,插入效率较高,同时 LinkedList 是非线程安全的容器。
  • 在实际使用中,如何在这几种容器中选择合适的使用?

      当对数据的主要操作为索引或只在集合的末端增加、删除元素时,使用 ArrayList 或 Vector 效率比较高,当对数据的操作主要为指定位置的插入或删除操作时,使用 LinkedList 效率比较高,当在多线程中使用容器时(即多个线程会同时访问容器),选用 Vector 较为安全。


三、HashMap、Hashtable、TreeMap 和 WeakHashMap 有哪些区别?


      Java 为数据结构中的映射定义了一个接口 java.util.Map,它包括3个实现类:HashMap、Hashtable、TreeMap。Map 是用来存储键值对的数据结构,在数组中通过数组下标来对其内容进行索引的,而在 Map 中则是通过对象来进行索引,用来索引的对象叫做 key,其对应的对象叫做 value。

HashMap 是最常用的一个 Map,它根据键的 HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,由于 HashMap 和 Hashtable 都采用了hash法进行索引,因此二者具有很多相似处,它们主要有如下一些区别。

  • HashMap 和 HashTable 的区别:

1)HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),它们都完成了 Map 接口,主要区别在于 HashMap 容许(null)键值 key(但需要注意最多只允许一条记录的键为 null,不容许多条记录的值为 null),而 Hashtable 不允许。

2)HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey,因为 contains 方法容易让人引起误解

3)HashTable 的方法时线程安全的,而 HashMap 不支持线程的同步,多以它不是线程安全的,在多个线程访问 HashTable 时,不需要开发人员对它进行同步,而对于 HashMap,开发人员必须提供额外的同步机制,多以就效率而言,HashMap 可能高于 HashTable

4)Hashtable 使用 Enumeration,HashMap 使用 Iterator。

5)HashMap 和 HashTable 采用的 hash/rehash 算法几乎都是一样的,所以性能不会有很大的差异

6)在 HashTable 中 hash 数组默认大小是 11,增加的方式是 old*2+1,在 HashMap 中,hash 数组的默认大小是 16,而一定是 2 的指数

7)hash 值的使用不同,HashTable 直接使用对象的 HashCode

      以上 3 中类型,使用最多的是 HashMap,HashMap 里面存入的键值对在取出时没有固定的顺序,是随机的,一般而言,在 Map 中插入、删除和定位元素,HashMap 是最好的选择,由于 TreeMap 实现了 SortMap 接口,能够把它保存的键进行排序,因此取出来的是排序后的键值对,所以如果需要按自然顺序或自定义顺序遍历键,那么 TreeMap 会更好,LinkedHashMap 是 HashMap 的一个子类,如果需要输出的顺序和输入的相同,那么用 LinkedHashMap 可以实现,它还可以按读取顺序来排序

  • WeakHashMap 与 HashMap 区别

     WeakHashMap 与 HashMap 类似,二者的不同之处在于 WeakHashMap 中 key 采用的是“弱引用”的方式,只要 WeakHashMap 中的 key 不再被外部引用,它就可以被垃圾回收器引用,而 HashMap 中 key 采用的是“强引用的方式”当 HashMap 中的 Key 没有被外部引用时,只有在这个 Key 从 HashMap 中删除后,才可以被垃圾回收器回收

  • 在 HashTable 上下文中,同步指的是什么?

同步意味着在一个时间点只能有一个线程可以修改 hash 表,任何线程在执行 Hashtable 的更新操作前都需要获取对象锁,其他线程则等待锁的释放

  • 如何实现 HashMap 的同步?

HashMap 可以通过 Map m = Collection.synchronizedMap(new HashMap())来达到同步的效果,具体而言,该方法返回一个同步的 Map,该 Map 封装了层的 HashMap 的所有方法,使得底层的 HashMap 即使在多线程环境中也是安全的

  • 用自定义类型作为 HashMap 或 HashTable 的 key 需要注意哪些问题?

HashMap 与 HashTable 是用来存放键值对的一种容器,在使用这两个容器时有一个限制:不能用来存储重复的键,也就是说,每个键只能有唯一映射一个值,当有重复的键时,不会创建新的映射关系,而会使用先前的键值


四、Collection 和 Collections 的区别


      Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,实现该接口的类主要有 List 和 Set,该接口的设计目标是为各种具体集合提供最大化的统一的集合方式

      Collections 是针对集合类的一个包装类,它提供一系列的静态方法以实现对各种集合的搜索、排序、线程安全化等操作,其中大多数方法都是用来处理线性表,Collections 类不能实现实例化,如同一个工具类,服务于 Collection 框架,若在使用 Collections 的方法时,对应的 Collection 为 null,则这些方法都会抛出 NullPointerException


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值