Java集合

(一)Iterable接口

1.实现Iterable接口的类可以拥有增强for循环。

2.实现Iterable接口的集合类必须提供一个叫iterator()的方法,该返回值为Iterator。

3.Iterable :存在于 java.lang 包中,Iterator :存在于 java.util 包中。实现了Iterable接口的类,就可以使用Iterator迭代器。

Iterator方法:

1.boolean hasNext():判断容器内是否存在下一项

2.Object next():获取下一项,返回值是 Object,需要强制转换成自己需要的类型

3.void remove():该方法可以删除由next()最新返回的项,此后不能调用 remove(),直到对next()再一次调用以后

 

(二)Collection接口

1.Collection接口继承Iterable接口,Collection接口java.util包

2.Collection是集合类的上级接口,继承与他的接口主要有Set 和List。

Collections是Collection的帮助类,Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。例如:Collections.sort()方法排序  Collections.shuffle() 打乱集合。(应用场景:手机通讯录)

3.Collection接口的方法列表:

size():返回集合中的项数

isEmpty():判断是否为空

contains(Object):检测是否存在某个元素

clear():清除

add(E):添加元素

remove(Object):删除元素

Iterator():迭代器 遍历集合

Collection接口的remove()方法和Iterator接口的remove()方法区别?

1.首先肉眼可见的不同就是参数:Collection接口的remove()方法带参数,Iterator接口的remove()方法不带参数

2.然后在性能方面:Collection的remove方法必须首先找出要被删除的项,采用的是单链表结构查询,单链表查询效率比较低,需要从集合中一个一个遍历才能找到该对象;而 Iterator的remove方法结合next()方法使用,有下一项就删除,没有就不删,比如集合中每隔一项删除一项,所以Iterator的remove()效率更高。

  • 3.最后在容错方面看:前提,在使用Iterator遍历时,使用Collection的remove()会报异常,用Collection的remove()的时候会调用到父类Iterable的Iterator,就有两个集合遍历,遍历移除的时候是移除Iterable里面的,没有移除Collection里面的所以会出现ConcurrentModificationException,因为集合中对象的个数会改变而Iterator 内部对象的个数不会,不一致则会出现该异常;但是在使用Iterator遍历时,不会报错,因为iterator内部的对象个数和原来集合中对象的个数会保持一致。

  (三)List、Set、Queue接口

List、Set、Queue接口继承Collection接口

List接口

1.有重复有顺序有下标(三有)

2.ArrayList:(数组结构)get和set调用,查询的速度快;但是添加删除的速度慢。

   LinkedList:(链表结构)get和set的调用花费昂贵,不适合做查询;添加和删除的速度快。

(1)Array与ArrayList有什么区别?

其实问的就是数组与集合的区别?看懂这个就好办事儿了,Array是Java中的数组,ArrayList是集合,也就是动态数组,数组的复杂版本,可以动态的添加和删除元素。首先要搞懂数组的声明有三种方式,定义一个数组的时候,必须指定这个数组的数据类型及数组的大小,也就是说数组中存放的元素个数固定并且类型一样。而这个ArrayList的声明,在不使用泛型的情况下,这个list是可以添加进不同类型的元素的,而且arraylist是可以不用指定长度的。在使用泛型时,我们就只能添加一种类型的数据了

不同点:

1.ArrayList是Array的复杂版本

2.存储的数据类型:Array只能存储相同数据类型的数据,而ArrayList可以存储不同数据类型的数据

3.长度的可变:Array的长度是固定的,而ArrayList的长度是可变的

(2)数组与list之间的相互转换

1.数组转list,可以使用Arrays.asList(数组)

2.List转数组,使用list.toArray()

Set接口

1.无重复无顺序无下标(三无)

2.HashSet:速度最快,没顺序保存元素,集合元素可以保存null,但只可以存一个null,存储对象

   TreeSet:升序保存对象

    LinkedHashSet:按照被添加的顺序保存对象

(1)HashSet、TreeSet、LinkedHashSet区别?

1.需要速度快的集合,使用HashSet

2.需要集合有排序功能,使用TreeSet

3.需要按照插入的顺序存储集合,使用LinkedHashSet

Queue接口

它的特点就是先进先出,也就是队列的特点,这里就会联想到堆栈的特点跟队列的特点是相反的,堆栈的特点是先进后出

(四)Map接口

1.HashMap:提供了最快的访问技术,没有按照明显的顺序保存元素,键值对

   TreeMap:升序保存键

   LinkedHashMap:按插入保存键,同时保留HashMap的查询速度

 

HashMap的实现原理

通过put和get存储和获取对象

1)存储对象时,将键值对传给put方法,调用hashcode计算hash 得到bucket(容器,比喻成桶)位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量。16*0.75=12(16指的是集合默认初始值,0.75扩容因子,12表示一个条件,就是说在往集合里面加数据的时候,当加到16的0.75倍 也就是12,就开始扩容,扩16,集合长度就是32,然后继续往集合里面加数据加到32*0.75的时候也就是24,继续扩容32,这时候集合总长度是64……)
new XXX(默认初始值,扩容因子)这个默认值和扩容因子是可以自定义的,不过是有条件的,扩容因子在修改的时候注意写2的几次幂。

2)获取对象时,我们将K传递给get,他调用hashcode计算hash从而得到bucket位置,并进一步调用equals()方法确认键值对。

(1)HashMap和HashSet区别

HashMap:实现了Map接口 存储键值对  调用put()向map中添加元素  使用key计算hashcode

HashSet:实现了Set接口     存储对象     调用add()向set中添加元素   使用成员对象计算hashcode

HashMap相对于HashSet较快,因为它是使用唯一的键获取对象

HashSet较HashMap来说比较慢

List、Set、Map之间的区别

1.List:可重复;多个null值;有顺序,插入的顺序和输出的顺序一样

2.Set:不重复;只可以一个null值;无序

3.Map:键值对,键唯一,值可重复;键一个null值,值可以多个null值;无序

 

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值