20201009黄春跃
20201009黄春跃
知识点总结
ArrayList、Vector、LinkList的区别
相同:
①都是java.util.List接口的实现类
②都是有序、可排列、可重复的集合,可存null。
③都支持迭代器操作
不同:
接口实现不同:
①ArrayList和Vector未实现Queue接口、Deque接口,不支持队列操作
②LinkList实现了Queue接口和Deque接口,支持队列操作同时支持栈操作。
内部实现不同:
①ArrayList,Vector内部采用数组来存储元素。
②LinkList内部采用链表来存储元素
线程安全不同
①ArrayList,LinkList是非线性安全,适用于单线程环境
②Vector是线程安全,适用于多线程环境。
增删不同:
①ArrayList、Vector内部采用数组,增删慢。
②LinkList内部采用链表,增删快。
扩容方式不同
①ArrayList内部采用1.5倍增长。
②Vector内部采用增加固定增量增长。
③LinkList内部采用链表,不需要扩容。
是否支持随机访问
ArrayList,Vector内部采用数组,随机访问效率较高。
LinkList内部采用链表,随机访问效率较低。
java.util.Map
Map 接口不是 Collection 的子类,使用键、值映射表来存储
注意:
①Map 不能有重复的键(覆盖),每个键可以映射到最多一个值
②允许将映射内容视为一组键,值集合或键值映射集合
③key 不要求有序, value 也不要求有序,但可以重复
④当使用对象作为 key 时,要重写 equals 和 hashCode 方法
抽象方法:
Map 的实现类较多,在此我们关注 HashMap 、 TreeMap 、 HashTable 、 LinkedHashMap
TreeMap
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
继承 AbstractMap ,一个红黑树基于 NavigableMap 实现
非线程安全的
key 不能存 null ,但是 value 可以存 null
key 必须是可比较的
Hashtable
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable
该类实现了一个哈希表,它将键映射到值
不允许 null 作为键和值
初始容量( initialCapacity )为 11 ,负载因子( loadFactor )为 0.75f
线程安全的
不保证顺序
扩容方式是旧容量的2倍 +1
数组 + 链表
HashMap
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
基于哈希表的实现的 Map 接口
允许 null 的值和 null 键
非线程安全
初始容量 16,负载因子 0.75
扩容是 2倍旧的容量
LinkedHashMap
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
哈希表和双向链表实现的 Map 接口
具有可预测的迭代次序(有序)
非线程安全
允许空元素
Properties
public
class Properties extends Hashtable<Object,Object>
Properties 类表示一组持久的属性。 Properties 可以保存到流中或从流中加载。 属性列表中的每
个键及其对应的值都是一个字符串。
操作和 Hashtable 基本一致,主要用于从流中记载或保存到流中去。(后期 JDBC 模块会使用到)
Collections
java.util.Collections 是 java 提供的一个集合操作的工具类。它包含了大量的静态方法,用于实现对集合元素的排序、查找和替换等操作。
提示:Collections和Collection是不同的,前者是集合的操作类,后者是集合接口。
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
List list2 = new ArrayList();
list2.add(3);
list2.add(4);
list2.add(5);
list2.add(6);
list2.add(7);
list2.add(8);
Collections.addAll(list, 7, 8, 9);
System.out.println(list);//[1, 2, 7, 8, 9]
System.out.println(Collections.disjoint(list, list2)); // false
Collections.copy(list2, list);
System.out.println(list2);//[1, 2, 7, 8, 9]
// 通过 compare / compareTo
System.out.println(Collections.max(list)); // 9
System.out.println(Collections.min(list)); // 1
Collections.reverse(list2);
System.out.println(list2); //[8, 9, 8, 7, 2, 1]
Collections.shuffle(list2);
System.out.println(list2); // [9, 2, 1, 8, 8, 7]
Collections.binarySearch(list, 2);
}
泛型
泛型是jdk1.5的新特性,泛型的本质是参数化类型
,也就是说所操作的数据类型被指定为一个参数,使代码可以应用于多种类型。简单的来说,java语言引入泛型的好处是安全简单,且所有强制转换都是自动和隐式进行的,提高了代码的重用率。
泛型的定义:
类型
语法解析:
①<>是泛型的特征;
②E表示某种数据类型,也可以用其他字母表示,如T。在实际使用泛型时,需要明确的类型替换掉E。
例如:
List<String> list = new ArrayList<String>();
//上述代码表示创建一个ArrayList集合,但规定该集合中存储的元素类型必须为String类型。
List
评论留言