内容:
/********************
数组与集合
集合框架体系
SET接口
LIST接口
迭代器接口
Map接口
老集合类的使用
内部比较器与外部比较器
集合类的综合使用
********************/
一. 数组
int[] aryInt = new int[100]
用于容纳一组数据
数组的特点:
在Java中,数组是被当做对象处理的
数组长度在数组初始化时必须固定
长度在固定之后,要改变数组长度大小的话,必须对数组进行长度大小变化的控制
package com.fjnu.study2; public class Array { public static void main(String[] args){ String[] strs = new String[10]; //当作对象, 定义一个数组长度为10 String[] strs1 = { "1", "2" }; String[] strs2 = null; String[] strs3; String[] strs4 = new String[] {}; System.out.println(strs.length); System.out.println(strs1.length); //System.out.println(strs2.length); //运行期间出错, 因为对象没有实例化 //System.out.println(strs3.length); //编译期间错误,因为没有赋初值 System.out.println(strs4.length); } }
10 2 0
数组的优缺点:
数组存取效率高,使用时要求容量大小固定;适合基本数据类型的存取;
而集合存取效率上有一定的牺牲,集合容量大小可以根据实际需要改变,提供丰富的存取方法,适合成为对象的“容器”;
集合用来存储对象。
两个对象的equals相等,那么他们的哈希码一定相等
两个对象的哈希码相等,那么他们的equal不一定相等。
Collection接口
集合框架的根 通用方法 boolean contains(Object a) boolean equals(Object a) Iterator iterator() //遍历 int size() void clear() boolean add(Object a) Boolean remove(Object a)
Set接口以及特点
扩展Collection接口 不允许重复元素 允许一个null值 对 add()、equals() 和 hashcode() 方法添加了限制
set接口的实现类
HashSet LinkedHashSet CopyOnWriteArraySet TreeSet
HashSet的特点
底层是以哈希表的算法实现的。 不是线程同步的一个集合类 探讨HashSet中的重复概念? 探讨HashSet中的元素到底是不是无序的?
什么是重复
public boolean equals(Object obj) 指示某个其他对象是否与此对象“相等”。 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 public int hashCode() 生成对象的哈希码。返回对象存储的物理地址(实际上可能并不是),但是是用来标识对象的一个标记号。
LinkedHashSet特点
LinkedHashSet的特点 底层是以链表实现的 LinkedHashSet是有序的(插入顺序有序) 不是线程同步的一个集合类
CopyOnWriteArraySet
CopyOnWriteArraySet的特点 底层是以数组实现的 线程安全的集合类。 元素之间是有序的.(插入有序)
copyOnWriteArraySet 是用数组实现了, 而LinkHashSet是用链表实现的,会更快
TreeSet的特点
TreeSet的特点 底层是以TreeMap实现的红黑树结构 不是线程安全的类 元素之间是有序的(不是插入顺序,而是指元素之间有序)。
迭代器Iterator
对集合进行迭代的迭代器。迭代器代替了 Java Collections Framework 中的 Enumeration。 包含如下方法: boolean hasNext() 如果仍有元素可以迭代,则返回 true。 Object next() 返回迭代的下一个元素。 boolean remove(Object o) 从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法
迭代器会出现快速失败异常
什么叫快速失败异常 出现快速失败异常的原因 如何解决快速失败异常 A:使用迭代器删除 B:使用线程安全的集合
快速失败异常的原因举例:如果在迭代的过程中,有其他线程在修改这个迭代的数据,那么迭代的数据就会具有不定性,所以会出现错误。
package com.fjnu.study2; import java.util.HashSet; import java.util.Set; import java.util.Iterator; public class interg { public static void main(String[] args){ Set set = new HashSet(); set.add("aa"); set.add("bb"); set.add("cc"); System.out.println(set); Iterator iterator = set.iterator(); while (iterator.hasNext()){ String str = (String)iterator.next(); if (str.equals("bb")){ //set.remove(str);//出现快速失败异常 iterator.remove(); } } System.out.println(set); } }
List接口以及特点
扩展了Collection接口 具有顺序的集合(插入的顺序) 元素可以通过其整型下标访问 可以包含重复元素 方法分类 定位方法:get()、set()、add()、remove()、addAll() 搜索方法:indexOf() 和 lastIndexOf() ListIterator方法:listIterator() 和 subList()
List接口的实现类
ArrayList类: 由一个数组后推而成,适合查询频繁的列表 LinkedList类: 由一个双向链表后推而成,适合插入删除频繁的列表
ArrayList的特点
ArrayList的特点 底层是以数组实现的 元素是有序的(插入顺序) 不是线程安全的集合类 适合查找频繁的操作
LinkedList
LinkedList的特点 底层是以链表实现的数组 元素是有序的(插入顺序) 不是线程安全的集合类 适合增删改比较频繁的操作
CopyOnWriteArrayList
CopyOnWriteArrayList的特点 底层是以数组实现的 元素是有序的(插入顺序) 线程安全的集合类 查找速度比较快,增删改速度比较慢。
注意List中的sublist的用法
Map接口
关键字唯一 将键映射至值的对象 每个键最多都只能映射至一个值 键值重复的话,后面添加的后覆盖前面元素的值。 重要方法 基本操作 put()、get()、remove()、containsKey()、containsValue()、size() 和 isEmpty() 批操作 putAll() 和 clear() 集合视图 keySet()、values() 和 entrySet()
HashMap
底层是以哈希算法实现 允许一个NULL键,允许多个NULL值 元素之间是无序的 不是线程安全的集合类
LinkedHashMap
底层是以链表实现 允许一个NULL键,允许多个NULL值 元素之间是有序的(插入顺序有序) 不是线程安全的集合类
TreeMap
底层是以红黑树算法实现 元素之间是有序的(是对象之间有序) 不是线程安全的集合类
迭代Map
通过KeySet来迭代 通过Values来迭代 通过Map.Entry来迭代
老的集合类
Vector HashTable Enumeration
HashTable
HashTable的特点 不允许空键 不允许空值 其它的特点与用法与HashMap相同。
Enumeration
包含下列方法: boolean hasMoreElements() 当且仅当此枚举对象至少还包含一个可提供的元素时,才返回 true;否则返回 false。 Object nextElement() 得到此枚举的下一个元素。 与Iterator的区别: 迭代器允许调用方利用定义良好的语义在迭代期间从迭代器所指向的集合移除元素。 思考Enumeration中为什么不提供remove方法?