集合框架有何好处
集合弥补了数组的缺陷,他比数组更灵活更实用,可大大提高软件的开发效率,而且不同的集合可使用与不同场合
数组和集合的区别
- 数组长度固定,集合长度可以动态改变
- 定义数组时必须指定元素类型,集合默认所有元素都是Object
- 无法直接获取数组中实际元素的个数,集合可以通过size()直接获取元素个数
- 集合有多种实现方式和不同的适合场合,而不像数组仅采用分配连续空间方式。
- 集合以接口,类的形式存在,具有面向对象的三大特征,提高了软件的开发效率
Hashtable和HashMap的异同
实现原理、功能相同,可以互用
主要区别
- Hashtable继承Dictionary类,HashMap实现Map接口
- Hashtable线程安全,HashMap线程非安全
- Hashtable不允许null值,HashMap允许null值
泛型集合的好处
- 严格限制存入元素的数据类型,从集合中取出元素时无需进行强制类型转换,避免了ClassCastException异常。
Collections算法类
- Collections和Collection不同,前者是集合的操作类,后者是集合接口
- Collections提供的常用静态方法
- sort():排序
- binarySearch():查找
- max()min():查找最大最小值
集合类有哪些
-
Collection(接口)(由List和Set两部分组成)
-
List(接口)
- LinkedList(类)
- ArrayList(类)
- Vector(类)
- stack(类)
-
Set接口
-
Map接口
- Hashtable(类)
- HashMap(类)
- WeakHashMap(类)
如何使用集合类
- 如果涉及到堆栈、队列等操作,应当考虑List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList
- 哈希表的操作,作为Key的对象要正确复写equals和hashCode方法
- 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果将来要将ArrayList换成LinkedList时,客户端代码不用改变
- List可以有类似数组的下标操作,且允许有相同的元素存在;Map是以键值对(KeyValue)的形式存在,不能存在相同的键
常用集合类
- ArrayList类:
ArrayList实现可变大小的数组,长度随着元素的增加而变化,而且可以存在重复的元素 - HashMap类:
允许null,即null key,null value。且存在的形式是key-value形式,不允许有key重复
Collection的使用
Collection接口是什么
- Collection接口是可以理解成动态的数组、集合,和数组类似,但不同的是集合可以任意扩充大小
- Collection是最基本的接口,Java SDK提供的类都是继承自Collection的子接口,例如“List”、“Set”
Collection接口特点
- 性能高
- 易扩展
- 易修改
List接口的使用
List接口的特点
- List接口可以存放任意的数据,且在接口中,内容可以重复
- List中提供了高效的插入和移除多个元素的方法
List常用(实现)子类
- ArrayList(实现类)
例:Listlist = new ArrayList<>(); - Vector(实现类)
例:Listlist = new Vector<>();
ArrayList和Vector区别
|ArrayList | Vector |
---|---|
推出时间 | JDK1.2后 |
性能 | 异步处理,性能高 |
线程安全 | 非线程安全 |
Set的使用
Set接口的特点
Set接口可以存放任意的数据,且在接口中,数据不可以重复(注意和List进行区别)
Set接口常用子类
- HashSet
Setsets = new HashSet<>(); - TreeSet
Setsets = new TreeSet<>();
HashSet和TreeSet的区别
- HashSet与TreeSet都是间接实现了Set接口,同样拥有add、remove等方法
- HashSet是无序存放的、而TreeSet实现是有序存放(ASCII顺序存放)
Map的使用
Map的特点
-
Map接口存放数据是以键值对的形式存放,例如:
key -> value
"name" -> "尼古拉斯赵四"
"age" -> "33" -
键(key)的类型要一致,值(value)的类型也要一致。
Map常用实现类(实现类的方法和List、Set的方法不一样)
-
HashMap
Map<String,String> maps = new HashMap<>();
maps.put("name","詹姆斯刘能");
maps.put("age","24");
List接口常用方法
- boolean add(Object o) 在列表的末尾顺序添加元素,起始索引位置从0开始
- void add(int index,Object o) 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间
- int size()返回列表中的元素个数
- Object get(int index)返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换
- boolean contains(Object o) 判断列表中是否存在指定元素
- boolean remove(Object o) 从列表中删除元素
- Object remove(int index) 从列表中删除指定位置元素,起始索引位置从0开始
LinkedList常用方法
- void addFirst(Object o) 在列表的首部添加元素
- void addLast(Object o) 在列表的末尾添加元素
- Object getFirst() 返回列表中的第一个元素
- Object getLast() 返回列表中的最后一个元素
- Object removeFirst() 删除并返回列表中的第一个元素
- Object removeLast() 删除并返回列表中的最后一个元素
Map接口常用方法
- Object put(Object key, Object val) 以“键-值”对的方式进行存储
- Object get(Object key) 根据键返回相关联的值,如果不存在指定的键,返回null
- Object remove(Object key) 删除由指定的键映射的“键-值对”
- int size() 返回元素个数
- Set keySet() 返回键的集合
- Collection values() 返回值的集合
- boolean containsKey(Object key) 如果存在由指定的键映射的“键-值对”,返回true
迭代器iterator的使用(接口)
-
iterator自带常用方法
-
hasNext:如果仍有元素可以迭代,则返回true
-
next:返回迭代下一个元素
-
remove:从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)
Set
sets = maps.keySet();
Iteratoriterator = sets.iterator();
while(iterator.hasNext()){
System.out.println("key=" + iterator.next());
}
Collection
collection = maps.values();
Iteratoriterator = collection.iterator();
while(iterator.hasNext()){
System.out.println("value=" + iterator.next());
} -
结尾