java中的集合概述
map 接口
总结
java集合学习
1 java中存储数据的方式 1 数组 (基本数据类型+引用数据类型)。2 集合(对象)
数组存储数据的缺点1:数组一旦创建,长度固定 2:数组不能直接确定有效元素的个数
java中的集合概述:
java集合接口:Collection 接口 和Map 接口
(Collection接口 表示不按照添加顺序存放对象的集合,而且集合内的元素可以重复即 无序可重复 集合,它是List,Set,Queue..接口的父接口)
Collection 接口
|–List接口 (存储有序的,可以重复的元素,equals()
|–ArrayList (主要实现类,线程不安全,效率高
|–LinkedList (适用于需要经常删除或者添加的情况
|–Vector (古老的list实现类,线程安全
|–Set 接口:无序的,不可以重复的元素,hashCode(),equals()
|–HashSet |–LinkedHashSet |–TreeSet
Map 接口 (具有映射关系”key-value”对(键值对) 的集合)
|–HashMap ,LinkedHashMap,TreeMap ,Hashtable(子类
Properties)
Collection useful method
1 add(Object obj):添加obj到当前集合
addAll(Connection c) 将c集合中的元素添加到当前集合
size() 返回集合中元素的个数
isEmpty()判断当前集合是否为空
2 remove(Object obj) 删除obj元素,先调用元素类的equals方法
判断当前集合中是否包含obj元素。
判断的标准:调用obj元素所在类的equals()方法进行判断。
要求:如果obj元素是我们自定义类的对象,那么要求自定义类需要重写equals()!
removeAll(Connection con) “差集” 删除con集合中与当前集合的交集
retainAll(Collection con):“交集”:返回当前集合与con集合共有元素,并将此元素的集合返回给当前集合
equals(Object obj):判断当前集合与obj元素是否equals()
要想返回true,必须obj也是一个集合,同时元素与当前集合中的元素都相同。
contains(Object obj) 判断当前集合中是否包含obj元素
containsAll(Connection con) 判断当前集合中是否包含coll集合中的所有元素。
hashCode()
3 iterator():返回一个实现了Iterator接口的类的对象。(该对象用来遍历 Collection集合的元素)
iterator.hasNext(),返回当前位置的下一个位置是否为null。
iterator.next():位置下移,然后返回 下移之后的元素。
toArray() 将集合转换成数组类型。
List list = Arrays.asList(new Objcet[]{…,…});
List 接口 useful method
List接口 存储 有序的,可以重复的元素, “动态”数组
增,add(Objctect obj)
删,remove(int index)
改,set(int index,Object obj)
查,get(int index)
插:add(int index,Object obj)
遍历:iterator()
Set接口
Set 接口 存储 无序的,不可重复的元素,没有额外添加父接口 Collection中的抽象方法。
|– HashSet (主要实现类)可以添加null
|–LinkedHashSet ,是HashSet的子类,遍历的时候可以按照添加时候的顺序,对于频繁遍历的时候使用。
|–TreeSet
Set接口集合:
1无序性 != 随机性,真正的无序性是指,元素在底层的存储的位置是无序的,HashSet集合底层也是数组,只不过其元素并不是按照添加进集合的顺序排列,而是由元素的哈希码值决定位置
2不可重复性,当向Set集合中添加相同元素的时候,后面的元素无法添加。
为了保证如上2点,要求:
添加进Set集合的元素的类型必须重写equals()和hashCode()方法,而且保证以上两个方法保持一致。
Set集合中的元素如何存储呢?
Set集合使用了哈希算法。先调用元素所在类的hashCode()方法,根据哈希码值指定元素的存储位置,在哈希码值相同的情况下,使用元素所在类的equals()方法比较,若元素相同,则不能添加进Set类型的集合。
【弦外话】一个类的hashColde方法和equals方法要求一致。a与b对象相等,那么其hashCode方法返回的哈希码值也要相同,这就要求我们重写的如上方法健壮
另外在向Set集合中添加元素的时候如果元素的码值相同,但是equals方法返回的是false,那么这个后进来的元素也可以添加。
同理如果俩元素equals方法返回true,但是hashCode方法返回的码值不同,那么后进来的元素也可以存储。
如上情况,就要去我们要重写健壮的equals方法和hashCode方法。
HashSet类 集合元素特点:无序和不可重复
LinkedHashSet类 集合元素:使用链表维护了元素添加进集合时候的顺序,所以在遍历集合的时候也是按照元素被添加进集合时候的顺序。
Set接口的主要实现类 HashSet:
1,HashSet类是Set接口的典型实现类,在使用Set接口的时候大多数都是在使用HashSet类。
2,HashSet类按照Hash算法来存储元素,因此具有很好的存取和查找的性能。
3,HashSet类的特点:
a:不能保证元素的排列顺序
b:HashSet不是线程安全的
c:集合元素可以是null
总结HashSet
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。 HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等
LinkedHashSet 是 HashSet 的子类 LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。LinkedHashSet 不允许集合元素重复。TreeSet类
1,向TreeSet 类型的集合中添加元素必须是同一种类型的
2,可以按照元素的指定的顺序排列,像String 和基本数据类型按照从小到大的顺序排列
3,向集合中添加自定义类的对象时,自定义类需要实现Comparable 接口的唯一抽象方法(compareTo(Objcet obj))方法。
即:按照自定义类中重写的compareTo方法来进行排序。(自然排序)
TreeSet类中排序方式1自然排序,2指定排序。
1:自然排序:
1:向TreeSet集合中添加的元素a所在的类A,需要实现接口Comparable接口
2:类A重写Comparable接口的抽象方法compareTo(Object o)
3:保证compareTo方法和hashCode以及equals方法一致。
理解:
在向TreeSet类型的集合中添加元素的时候,首先调用其元素的compareTo()方法进行比较,一旦返回0,虽然仅仅是元素对象的某一个属性值相同,但是程序会认为这两个对象是同一个,故而后面一个元素不能添加进TreeSet类型的集合中。
因此我们应当保证元素类型的compareTo()方法 hashCode()以及equals()方法 一致!!!!
TreeSet类型集合 元素的排序方式二
1:创建一个实现了Comparator 接口的类的对象com,自然要重写其抽象方法compare(Object o1,Object o2)。
2:将如上对象 com 作为 形参 传递给TreeSet 的构造器
3:向TreeSet类型集合中添加 实现Comparator 接口的类中compare(Object o1, Object o2)方法中涉及的类 的对象。
同上的问题,compare方法也必须和hashCode 和 equals 方法保持一致。
针对以上TreeSet集合元素的两种排序方式:
当可以操作集合元素的类型的时候可以采用第一种排序方式,让元素类型实现comparable 接口即可。
若不能操作元素类型,可以采用第二种排序方式。使用TreeSet的有参构造器。其参数类型是Comparator,一般在方法使用内部类,构造实现了该接口的具体类。