集合

java中的集合是一个重点,也是一个面试中常见的考点,下面只是我认为比较常出现的知识点,以及遇到过的考点,由于经验的欠缺,难免出现不全或者错误,还望见谅!

**

集合和数组的比较:

**
数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下:
1:数组能存放基本数据类型和对象,而集合类存放的都是对象的引用,而非对象本身!
2:数组容易固定无法动态改变,集合类容量动态改变。
3:数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数 。
4:集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式
5:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率。

集合的类别

集合类分为Map和Collection两个大的类别。
下面分别进行介绍:

Collection:
Collection有三个继承接口:List、Queue(暂时不进行介绍)和Set。
 List:元素是有序的,允许重复,因为该集合体系都具有索引。
  ArrayList:底层数据结构是数组,查询速度快,增删操作较慢,线程不同步,线程不安全,默认容量10,扩容后容量为原来的1.5倍。
  LinkedList:底层数据结构是链表,查询效率较低,增删操作快,线程不同步,线程不安全,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好。
   Vector:功能同ArrayLis类似,底层也是数组,不同是线程是同步的,效率较低,线程安全。
 Set:元素是无序的,元素不允许重复,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象,底层用到了Map。
   HashSet:底层hash表,存储的对象最好复写hashcode和equals方法,保证元素不会重复。具体规则是,如果两个元素通过equals为true,并且两个元素的hashCode相等,则这两个元素相等(即重复)。默认初始容量为16,加载因子为0.75:即当 元素个数超过容量长度的0.75倍时,进行扩容,扩容增量:原容量的 1 倍,如 HashSet的容量为16,一次扩容后是容量为32。
  TreeSet:底层二叉树,存储的对象具备比较性,有序,不允许空值。 实现Comparable接口,并且覆盖里面的compareTo方法。通过teturn 0判断元素是否相同,来保证数据的唯一性。

Map
 数据是以键值对的形式存储的,有的元素存在映射关系就可以使用该集合,元素不允许重复。
  HashMap:允许有一条记录为空,线程不安全 默认容量16,加载因子0.75,默认扩容一倍,效率比hashTable高。
  TreeMap
   HashTable(过时的集合类):类似HashMap,不允许null键或值,线程安全,默认容量11,加载因子0.75,每次将容量变为“原始容量x2 + 1”。

对hashmap线程不安全的解决:
   在jdk1.5的时候新增了ConcurrentMap接口和它的一个实现类 ConcurrentHashMap。ConcurrentHashMap提供了和Hashtable以及SynchronizedMap中所不同的锁机 制。Hashtable中采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是 一次锁住一个桶。ConcurrentHashMap默认将hash表分为16个桶,诸如get,put,remove等常用操作只锁当前需要用到的桶。 这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。

在这里插入图片描述

以下是面试中常遇到的面试题;
Collection 和 Collections 的区别。
 Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List.
 Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
 
阐述ArrayList Vector LinkedList的存储性能和特性.
  ArrayList和Vector都是使用数组方式存储数据,此数组元素大于实际存储的数据以便增加和插入元素,他们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器,LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方法相比,内存的利用率更高),按序号索引数据需要进行前项或后项遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快,Vector属于遗留容器,已经不推荐使用,但是由于ArrayList和LinkedList都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用。
  
List Map Set三个接口存取元素时,各有什么特点?
  List以特定索引来存取元素,可以有重复元素,Set不能存放重复元素(有对象的equals()方法来区分元素是否重复)Map保存键值对映射,映射关系可以是一对一或者多对一.set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素的键(key)构成排序树从而达到排序和去重的效果。
  
TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
  TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序,Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值