Java 关于集合框架(Set, List, Map)
集合框架
集合相关接口和类均处于 java.util 包下
Collection
- Set(集)
- SortedSet(进一步扩展 Set 接口,增加对元素排序功能)
- List(列表)
Map
-
SortedMap(增加按照键 - 值对的键对元素进行排序)
* java.util.Collection * +boolean add(Object o) 向集合中加入指定元素,加入成功返回true,否则返回false。在Set接口中,此方法在添加元素前要进行是否重复的判断,如果是重复元素,添加被拒绝,返回false,否则成功,返回true。List接口则不变。 * +boolean addAll(Collection c) 将指定Collection中的所有元素都添加到此Collection中。子接口中方法发生变化和 +boolean add(Object o)一样 * +void clear() 移除此Collection中的所有元素 * +boolean contains(Object o) 如果此Collection包含指定的元素,返回true,否则返回false * +boolean containsAll(Collection c) 如果此Collection包含指定Collection中所有元素,返回true,否则返回false * +boolean isEmpty() 如果此Collection不包含任何元素,则返回true,否则返回false * +Iterator iterator() 返回在此Collection的元素上进行的迭代器 * +boolean remove(Object o) 从此Collection中移除指定元素,成功返回true,否则返回false * +boolean removeAll(Collection c) 移除此Collection中那些包含指定Collection中所有元素 * +boolean retainAll(Collection c) 仅保留此Collection中那些也包含在指定Collection的元素 * +int size() 返回此Collection中的元素数 * +Object[] toArray() 返回包含此Collection中的所有元素的数组
集合实现类
Collection
- HashSet(Set)
- TreeSet(SortedSet)
- LinkedList,Vector,ArrayList(List)
HashTable,HashMap(Map)
Set
模拟数学集合概念,特征:
(1)集合中不允许出现重复元素
(2)集合中不区分元素顺序
SortedSet接口只是增加了对集合存放的元素按升序排列的功能
HashSet类是Set接口常用的实现类,它不能存放重复的元素,且其中的元素是无序的,HashSet中可以存放null
HashSet集合判断元素重复的标准:
- HashSet底层采用哈希表实现,向HashSet添加对象元素时,会根据对象的哈希码计算对象的存储位置,对象的哈希码通过Object类提供的hashCode()方法获得,hashCode()方法返回的值根据对象的内存地址得到哈希码。
- 这两个对象通过new构造的地址不一样,得到的哈希码就不一样,所以HashSet认为两者是不同的对象;hashCode返回相同值的同时必须保证两个对象利用equals方法比较的结果为真,这样HashSet才认为两者为相同的对象。
- 事实上,开发者只需要记住一点即可:如果用HashSet存放自定义类型的对象时,一定要重写hashcode()和equals()这两个方法,重写的原则是两个对象相同时保证两者的hashcode()方法返回相同的整数,并且两者利用equals()比较时返回true。
TreeSet类实现了Set接口的子接口SortedSet,基本特征和用法与HashSet类一样,只是增加了排序功能的集合。在将对象元素添加到TreeSet时,会按照一定排序规则,将元素插入到有序的对象序列中,保证TreeSet中的元素组成的对象序列时刻按照“升序”排列。 有一点要注意,向TreeSet添加的对象元素的类型必须实现处于java.lang包下的Comparable接口,否则程序运行时出现
java.lang.ClassCastException异常。API中的String类,封装类都已实现该接口,对于自定义类型,开发者必须实现Comparable接口,也就是说,要实现接口中的抽象方法。Comparable接口只有一个抽象方法: public int compareTo(Object o),用来实现排序规则。自定义类型如果不实现Comparable接口,即不去定义排序规则,Java运行时就不知道该如何排序,进而导致java.lang.ClassCastException异常。
List
基本特征是采用线性方式存放元素,具体表现为数组,向量,链表,栈和队列等。特征如下:
(1)集合区分元素的顺序,即按照元素的存入顺序存放元素
(2)允许存放重复元素
List接口允许使用者对插入列表的元素进行精确控制,并添加了根据元素索引位置来访问元素,搜索元素的功能。
相对于Collection接口List接口新增方法如下:
+void add(int index, Object o) 在列表的指定位置插入指定元素
+boolean addAll(int index, Collection) 将指定Collection中的所有元素插入到列表中的指定位置
+Object get(int index) 返回列表中指定位置的元素
+int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,返回-1
+int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引,如果列表不包含此元素,返回-1
+ListIterator listIterator(int index) 从列表的指定位置开始返回列表中元素的列表迭代器
+Object remove(int index) 移除列表中指定位置的元素
+Object set(int index, Object o) 用指定元素替换列表中指定位置的元素
List接口常用的主要实现类LinkedList,ArrayList和Vector的基本用法是一样的,只是底层的实现方式不同,导致各实现类适用的场合不同
适用迭代器遍历方法:Iterator是使用统一方式对各种集合元素进行遍历/迭代的工具。实际上,无论Collection的实际类型如何,都支持一个iterator()的方法,所以程序中定义print(Collection c)是一个通用的集合元素遍历方法,iterator()方法返回一个迭代子,使用该迭代子即可逐一访问Collection中的每一个元素。
迭代器典型用法:
Iterator it = collection.iterator(); //获得一个迭代子
while (it.hasNext()) {
Object obj = it.next; //获得下一个元素
}
- LinkedList: 实现了List接口,以一般的双向链表完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素;如果在List的开始处增加元素,或者在List中进行插入删除操作,应该使用LinkedList
- ArrayList: 实现了List接口,用于表示长度可变的数组列表;在构造对象时可以指定列表的长度,默认为10,不指定长度且实际添加对象数目超过10时,系统将自动增加列表长度;ArrayList是非同步的,适合在单线程环境下使用
- Vector: 实现了List接口,表示一个可变的对象数组;Vector是同步(线程安全)的,占用资源多一些,相比ArrayList的运行效率低一些,主要用在多线程环境下。
Map
Map中存放的是成对“键 - 值”(Key - Value)信息,Map中的每一个元素都必须包括起到标识作用的“键“和元素”值“两部分。特征:
(1)在存放的键 - 值对不允许有重复的键
(2)每个键最多只能映射一个值
Map描述了映射结构,Mao中存放的是“键-值”对信息,Map中不能存放键重复的键值对,每个键只能映射一个值。允许通过键集,值集合或键值对映射关系的形式查看映射内容。 SortedMap只是增加了按照键 - 值对的键对元素进行升序排列功能
java.util.Map(主要方法)
+void clear() 从此映射中移除所有映射关系
+boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回true,否则返回false
+boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,返回true,否则返回false
+Set entrySet() 返回此映射中包含的映射关系的Set集合
+Object get(Object key) 返回指定键所映射的值,如果此映射不包含该键的映射关系,返回null
+boolean isEmpty() 如果此映射未包含键 - 值映射关系,返回true,否则返回false
+Set keySet() 返回所有映射中包含的键的Set集合
+Object put(Object key, Object value) 将指定的指定键 - 值对放入此映射中
+void putAll(Map m) 从指定映射中将所有映射关系复制到此映射中
+Object remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除
+int size() 返回此映射中的键 - 值映射映射关系数
+Collection values() 返回此映射中包含的值的Collection集合
HashMap类实现了Map接口,是比较常用的Map实现类,HashMap集合用于存放“键-值”对信息,不能存放重复的“键-值”对。在HashMap中判断键值是否重复的标准和Set中判断添加元素的标准完全一致。
TreeMap类实现了Map接口的子接口SortedMap,基本使用方法和HashMap类似,只是在HashMap接口原有功能的基础上增加了对添加的“键-值”对元素按照“键”进行升序排列的功能。向TreeMap添加的“键-值”对元素的键类型必须实现Comparable接口或定义比较器类。
可配合接口Map.entry<K, V>来实现获得当前项对应的键或值
java.util.Map.Entry<K,V>
+K getKey() 返回与此项对应的键
+V getValue() 返回与此项对应的值
Map m = new HashMap();
m.put("zhang", "1212");
Set entrySet = m.entrySet(); //m此时不是java.lang.Iterable的数组或实例,所以得把m转换到Set集合
for(Object obj: m) {
Map.Entry entry = (Map.Entry)obj; //必须显示的把Object类型转换为Map.Entry类型
System.out.println("key= " + entry.getKey() + " value= " + entry.getValue());
}
内容不是很全,可以评论下,我好改改!
下一篇: 构造函数的继承