java集合
集合
集合体系包括Collection 和 Map 两种体系
Collection
List Set Queue实现Colletion接口
List 有序,可重复
ArrayList
构造一个初始容量为 10 的空列表
优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程不安全,效率高 Vector 优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程安全,效率低 LinkedList 构造一个空列表。 优点: 底层数据结构是链表,查询慢,增删快。 缺点: 线程不安全,效率高
Set 无序,唯一
HashSet
使用默认初始容量 (16) 和负载因子 (0.75) 构造一个新的空链接散列集底层数据结构是哈希表。(无序,唯一) 如何来保证元素唯一性? 1.依赖两个方法:hashCode()和equals()
LinkedHashSet
使用默认初始容量 (16) 和负载因子 (0.75) 构造一个新的空链接散列集 底层数据结构是链表和哈希表。(FIFO插入有序,唯一) 1.由链表保证元素有序 2.由哈希表保证元素唯一
TreeSet
构造一个新的空树集,根据其元素的自然顺序排序。底层数据结构是红黑树。(唯一,有序)
队列queue的实现 java中虽然有Queue接口,单java并没有给出具体的队列实现类,而Java中让LinkedList类实现了Queue接口,所以使用队列的时候,一般采用LinkedList。因为LinkedList是双向链表,可以很方便的实现队列的所有功能。
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用element()或者peek()方法。
java中定义队列 一般这样定义: Queue queue = new LinkedList();
Queue <Integer> queue = new LinkedList <Integer>();
queue.offer(1);
queue.offer(2);
queue.offer(3);
System.out.println(queue);
System.out.println(queue.peek());
queue.poll();
System.out.println(queue);
List子类常用方法
ArrayList的常用方法
增add() 删 remove() 改set() 查 contains() 查 indexOf() 返回第一次找到的索引 get() 计算长度size() 删除所有clear() 是否为空isEmpty() 按条件删除removeif() 遍历forEach() 排序sort() // 使用增强for循环进行遍历
for (Object value : list) {
System.out.println(value);
}
LinkedList的方法
增add() 删 remove() 改set() 查 contains() 查 indexOf() 返回第一次找到的索引 get() 计算长度size() 删除所有clear() 是否为空isEmpty() 按条件删除removeif() 遍历forEach() // 使用增强for循环进行遍历 for (Object value : list) { System.out.println(value); }
Set子类常用方法
hashSet
增add() 删 remove() 改 没有 查 contains() 查 indexOf() 返回第一次找到的索引 get() 计算长度size() 删除所有clear() 是否为空isEmpty() 按条件删除removeif() 遍历forEach() // 使用增强for循环进行遍历
for (Object value : list) {
System.out.println(value); }
LinkHashSet方法
增add() 删 remove() 改 没有 查 contains() 查 indexOf() 返回第一次找到的索引 get() 计算长度size() 删除所有clear() 是否为空isEmpty() 按条件删除removeif() 遍历forEach() // 使用增强for循环进行遍历
for (Object value : list) {
System.out.println(value); }
TreeSet方法
增add() 删 remove() 改 没有 查 contains() 查 indexOf() 返回第一次找到的索引 get() 计算长度size() 删除所有clear() 是否为空isEmpty() 按条件删除removeif() 遍历forEach() // 使用增强for循环进行遍历
for (Object value : list) {
System.out.println(value); }
Map
HashMap、TreeMap和HashTable实现Map接口
HashMap
构造一个HashMap 具有默认初始容量 (16) 和默认负载因子 (0.75)的空。
基于哈希表的Map 接口实现。此实现提供所有可选的映射操作,**并允许 null 值和null **键。(HashMap 该类大致相当于Hashtable ,除了它是非同步的并允许空值。)该类不保证映射的顺序;特别是,它不保证订单会随着时间的推移保持不变。
此实现为基本操作(get 和put )提供恒定时间性能,假设散列函数在存储桶中正确分散元素。集合视图上的迭代需要的时间与HashMap 实例的“容量” (桶的数量)加上它的大小(键值映射的数量)成正比 。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低),这一点非常重要。
? LinkedHashMap
? LinkedHashMap是hashMap的子类LinkedHashMap 使用**默认初始容量 (16) 和 加载因子 (0.75)**构造一个空的插入排序实例。
? 接口的哈希表和链表实现Map ,具有可预测的迭代顺序。此实现的不同之处 HashMap 在于它维护一个贯穿其所有条目的双向链表。这个链表定义了迭代顺序,通 常是将键插入到映射中的顺序(插入顺序)。请注意,如果将键重新插入到映射中,则 插入顺序不会受到影响。
HashTree
**使用其键的自然顺序构造一个新的空树映射。**键非空值可空
基于红黑树的实现。根据其键的[自然顺序进行排序或者根据创建时提供的[顺序进行排序]具体取决于使用的构造函数。
此实现提供了保证的log(n)的时间成本,为 containsKey ,get ,put 和remove 操作。算法是对 Cormen、Leiserson 和 Rivest 的算法简介中的算法的改编。 HashTable
构造一个具有默认初始容量 (11) 和负载因子 (0.75) 的新的空哈希表。 这个类实现了一个哈希表,它将键映射到值。任何非null 对象都可以用作键或值。 要从哈希表中成功存储和检索对象,用作键的对象必须实现hashCode 方法和equals 方法。 的实例Hashtable 有两个影响其性能的参数:初始容量和负载因子。的 容量是多少桶在哈希表,和 初始容量是简单地在创建哈希表中的时间的能力。请注意,哈希表是开放的:在“哈希冲突”的情况下,单个存储桶存储多个条目,必须按顺序搜索。该客座率是衡量哈希表在其容量自动增加之前允许达到多满的指标。初始容量和负载因子参数只是对实现的提示。关于何时以及是否调用 rehash 方法的确切细节取决于实现。
通常,默认负载因子 (.75) 在时间和空间成本之间提供了良好的折衷。较高的值会减少空间开销,但会增加查找条目的时间成本(这反映在大多数 Hashtable 操作中,包括get 和put )。
Map子类常用方法
HashMap方法
增**[put([K] key, [V] value) 删remove(Object key) 改 没 但可以添加key相同,但value不同的值,来实现改value 查 value() keySet() containsKey(key) containsValue(value) entrySet()返回key-value 长度 size() // 遍历
for (Object entry:hashMap.entrySet()){
System.out.println(entry);
}
treeMap方法
增**put(K key, [V]value) 删remove(Object key) 改 没 但可以添加key相同,但value不同的值,来实现改value 查 value() keySet() containsKey(key) containsValue(value) entrySet()返回key-value 长度 size() // 遍历
for (Object entry:hashMap.entrySet()){
System.out.println(entry); }
Map子类间的比较
|