Java SE 基础:集合(1)

来源:互联网 发布:淘宝卖家 人工服务电话 编辑:程序博客网 时间:2024/05/16 05:30
作者:小兔子脚
链接:https://zhuanlan.zhihu.com/p/25063771
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一:集合概述

》1.存储对象可以考虑:数组、集合

》2.数组存储对象的弊端:一旦创建,其长度不可变

》3.集合: 分为 Collection 和 Map 两种体系。

①Collection 接口:

》Set:元素无序、不可重复的集合

》List:元素有序、可重复的集合

②Map 接口:具有映射关系“key-value对” 的集合。



二:集合划分


Collection 接口
-----List接口:存储有序的,可以重复的元素
---ArrayList(主要的实现类)、LinkedList、Vector 实现类
-----Set接口:存储无序的,不可重复的元素
---HashSet、LinkedHashSet、TreeSet 实现类
Map 接口 :存储“键值对”的数据
---HashMap、LinkedHashMap、TreeMap、Hashtable(子类:Properties)实现类


三:Collection 接口的常用方法、集合遍历方法

以下不一一介绍,只说两个,可查API

》1.contains(Object obj);

判断集合中是否包含指定的obj 元素,如果包含,返回true,否则返回false。

注意:判断的依据 是根据元素所在的类的equals()方法进行判断的

如果存入集合中的元素是自定义类的对象。要求:自定义类要重写equals()方法!


》2.集合遍历方法

iterator():

》返回一个Iterator 接口实现类的对象,用其来实现对集合的遍历。

》①Collection 对象.iterator()方法获取Iterator 对象

②Iterator 对象.hasNext()方法配合 Iterator对象.next()方法




四、List


(1)ArrayList 实现类

List 是Collection 的子接口,所以Collection 中的15个方法他都能用。并在此基础上,添加了 根据索引 来操作集合元素的方法。如下:

//void add(int index, E element)
在指定的索引位置添加元素 element,index 从0开始。

//void addAll(int index, Collection c)


//Object get(int index)
获取指定索引的元素。

//Object remove(int index)
删除指定索引位置的元素。

//Object set(int index, Object el)
设置指定索引位置的元素为 el

//int indexOf(Object obj)
返回obj 在集合中首次出现的位置,没有的话,返回-1。

//int lastIndexOf(Object obj)
返回obj 在集合中最后一次出现的位置,没有的话,返回-1。

//List subList(int fromIndex,int toIndex)
返回从fromIndex 到 toIndex 结束(左闭右开)的一个子list




List 常用的方法:
增(add(Object obj))
删(remove)
改(set(int index, Object obj))
查(get(int index))
插(add(int index, Object ele))
长度(size())


(2)LinkedList 类

1.在底层以链表的形式存在,但还是可以通过索引获取其中的内容。
2.适用于 对于频繁的插入、删除操作。




(3)Vector类
线程安全,但效率要低于ArrayList






五、Set


1.Set接口:存储无序的,不可重复的元素。

---HashSet(主要实现类)


---LinkedHashSet
---TreeSet 实现类


2.Set 中常用的方法都是Collection 下定义的。
3.Set 存储的元素是无序的,不可重复的!
》无序性 不代表 随机性。真正的无序性 指的是元素在底层存储的位置是无序的。根据hash值来存。
》不可重复性:当向Set 中添加进相同的元素的时候,后面的这个不能添加进去。

说明:要求添加进Set 中的元素所在的类,一定要重写equals() 和 hashCode()方法。进而保证Set 中元素的不可重复性。

而添加进List 中的元素的所在的类,只需重写equals()方法即可。


4.Set 中的元素如何存储?使用 哈希算法。
当向 Set 中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在Set 中的存储位置。若此位置没有对象存储,则这个对象直接存储到此位置。若此位置已有对象存储,再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。万一返回false呢,都存储(不建议)。
要求:hashCode()方法要与equals()方法一致。


5.同样可以用iterator()方法来对其进行遍历。




LinkedHashSet

LinkedHashSet :
1. 使用链表维护了一个添加进集合中的顺序,导致当我们遍历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的。
2.但这个LinkedHashSet在内存中存的还是无序的。
3.LinkedHashSet 插入性能略低于 HashSet,但在 迭代访问Set 里的全部元素 时有很好的性能。





TreeSet

1.向TreeSet 中添加的元素必须是同一个类的。
2.可以按照添加进集合中的元素的指定的顺序遍历。像String。。。包装类等默认按照从小到大的顺序遍历。


3.当向TreeSet 中添加自定义类的对象时,有两种排序方式:①自然排序 ②定制排序
4.自然排序:当自定义类 没有实现Comparable 接口时,当向TreeSet 添加自定义类对象,会报错ClassCastException。这个Comparable 接口中的方法CompareTo()方法是确定按照哪个属性排列。
5.向TreeSet 中添加元素时,首先按照compareTo ()方法进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序会认为这两个对象是相通的,进而后一个对象不能添加进来。

要求:compareTo() 与hashCode() 以及equals()方法保持一致。


重写的compareTo()方法



6.定制排序:
1)创建一个实现Comparator 接口的类对象
//向TreeSet 中添加自定义类的对象,在此compare()方法中,指明是按照自定义类的哪个属性排序的。
2)将此对象作为形参传递给TreeSet 的构造器中。
3)向TreeSet 中添加Comparator 接口中的compare 方法中涉及的类的对象。
要求:compare()方法与hashCode() 以及equals()方法保持一致。
0 0
原创粉丝点击