集合是一个Java自带的框架,用于存储和操作一组对象,集合可以看做一个容器。
集合一般分为三个部分:
1.接口:抽象数据类型,例如java.util.Collection,java.util.Map等
2.实现类:ArrayList,LinkedList,HashMap,TreeMap,HashSet等
3.算法:searching,sorting and shuffling
集合中的基本继承和实现关系如下图所示:
文字大致描述关系如下:
List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
Set下有HashSet,LinkedHashSet,TreeSet
List下有ArrayList,Vector,LinkedList
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
Collection接口下还有个Queue接口,有PriorityQueue类
关于各个集合实现类的区别如下:
ps:第一列是实现类名称,接下来是是否有序、是否随机存储、是否为键值类型、是否有重复元素、元素是否可以为空、是否线程安全。
各个集合类的特点简述
1.集合Collection
处于collection顶层,提供了了很多抽象⽅方法,size, isEmpty, contains, add, remove, iterator…等方法
2.迭代器Iterator
⽤用于顺序的迭代,遍历或者搜索一个集合
3.组合Set
不能包含重复元素、无序
4.列表List
能包含重复元素、有序
5.映射Map
key/value对,key唯一
6.队列Queue
队列列存放等待处理理的元素,顺序为FIFO(first-in,first-out)先进先出模式
7.双向队列Dequeue
和queue不同的是,它可以接受双向数据处理,全称double ended queue。
关于几个常用的集合类讲解
1.列表List
列列表是有序集合,它是继承与Collection的接⼝口。
列列表可以控制位置,可以在位置处插⼊入元素,基于搜索搜索元素
List类的方法:
1.int size()
2. boolean isEmpty()
3. boolean contains(Object o)
4. Iterator iterator()
5. Object[] toArray()
6. boolean add(E e): 在列列表末尾添加元素
7. boolean remove(Object o): 删除指定元素
8. boolean retainAll(Collection<?> c): 保留留包含在集合c中的元素
9. void clear()
10. E get(int index)
11. E set(int index, E element)
12. ListIterator listIterator()
13. List subList(int fromIndex, int toIndex)
ArrayList
是最常用的集合类之一
java.util.ArrayList 实现接口 java.util.List interface
ArrayList不是线程安全,性能更更好,除此之外和Vector一样
ArrayList可以包含重复元素,允许null
ArrayList是有序的,按序操作,可通过index访问元素
ArrayList默认10个元素数组,通过ensureCapacity(int minCapacity)
ArrayList Iterator是fail-fast,创建iterator后可执⾏行行除add/remove外,不可随意修改元素
推荐写法:List list = new ArrayList<>();
下面是一个关于ArrayList的简单demo
package com.list;
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo {
public static void main(String[] args) {
List<String> all = new ArrayList<>();
System.out.println("长度:" + all.size() +
" 是否为空:" + all.isEmpty());
all.add("hello");
all.add("world");
all.add("gyk");
System.out.println("长度:" + all.size() +
" 是否为空:" + all.isEmpty());
for(int x = 0; x < all.size(); x++){
String str = all.get(x);
System.out.print(str + " ");
}
}
}
输出结果如下图:
映射Map
Map表示key-value键值对集合
Map提供三种视图:keys,values,key-value mapping
Map key必须唯⼀,但value可以重复
Map不保证顺序,依赖于实现。HashMap不保证顺序,TreeMap保证顺序
大部分Map类都是基于AbstractMap抽象类
Map使用在key上的hashCode和equals方法操作get和put操作
Map的方法
1.int size()
2. boolean isEmpty()
3. boolean containsValue(Object value)
4. V get(Object key)
5. V put(K key, V value)
6. V remove(Object key)
7. void putAll(Map<? extends K, ? extends V> m): Copies all of the mappings from the specified map to this map.
8. void clear()
9. Set keySet() keySet和Map是关联的
10. Collection values()
11. Set<Map.Entry<K, V>> entrySet() entrySet和Map关联,任何修改都会在各⾃自集合上体现
HashMap
最常⽤用的集合类之⼀
HashMap 基于hash表,继承⾃自 AbstractMap,它实现接⼝口 Map
HashMap允许null key和null value
HashMap是⽆无序的
HashMap除了了⾮非同步和允许null key/value,它和HashTable是⼀一样的
HashMap使⽤用链表实现map (entry)的存储,叫做bucket或者bin。默认箱空间是16,权值2
HashMap⾮非线程安全,对于多线程环境应该ConcurrentHashMap⽅方法。
HashMap工作原理
HashMap使⽤用内部类Node<K,V>存储键值对,同时HashMap基于hash算法,并使⽤用hashCode和equals⽅方法保证key的唯⼀性,
HashMap PUT
HashMap使⽤用链表存储hash值相同的键值对,叫做桶bucket
或垃圾箱bin。当调⽤用put⽅方法,它⾸首先通过hashCode找到
bucket。然后再⽤用hashCode检测是否链表不不存在,如果存
在继续⽐比较(⽬目的是找位置),就使⽤用equals⽅方法⽐比较
key,如果相同就覆写,否则创建新的键值对加⼊入改链表
(bucket)。如果key不不存在,键值对插⼊入bucket
HashMap GET
HashMap使⽤用hashCode⾸首先找到bucket,然后继续使⽤用hashCode和equals遍历链表找到元素,如果找到返回,如果找不不到,返回null。
下面是一个关于HashMap的简单demo
package com.map;
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
Map<String, Integer> all = new HashMap<>();
all.put("a", 1);
all.put("b", 2);
all.put("p", 4);
all.put("w", 10);
all.put("w", 18);
all.put("c", 3);
all.put(null, 0);
System.out.println(all);
System.out.println(all.get("c"));
}
}
输出结果如下图:
迭代器Iterator
• ⽤于一个一个按顺序遍历集合
• Java 1.2开始支持,任何集合类都实现了了Iterator接口,也叫通用光标
• 支持读和删操作
• 相比Enumeration接口, Iterator更简单,可以完全替代
缺点:
不支持增和更新
Iterator仅支持“前进”,不能“倒退”
仅支持顺序便利,不支持平行,不支大数据(Spliterator)
下面是一个关于iterator的简单demo:
package com.iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorOutput {
public static void main(String[] args) {
List<String> all = new ArrayList<>();
all.add("Hello");
all.add("gyk");
all.add("hh");
Iterator<String> iter = all.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.println(str);
}
}
}
输出结果如下图:
组合Set
Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。
在判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现。
HashSet
HashSet是哈希表结构,主要利用HashMap的key来存储元素,计算插入元素的hashCode来获取元素在集合中的位置;HashSet实现Set接口,底层由HashMap来实现,为哈希表结构,新增元素相当于HashMap的key,value默认为一个固定的Object。
下面是一个关于HashSet的简单:
package com.set;
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
Set<String> all = new HashSet<>();
all.add("gyk");
all.add("hjr");
all.add("hhh");
System.out.println(all);
System.out.println(all.size());
all.remove("gyk");
System.out.println(all);
System.out.println(all.size());
}
}
输出结果如下图:
TreeSet
与HashSet集合类似,TreeSet也是基于Map来实现,具体实现TreeMap,其底层结构为红黑树(特殊的二叉查找树),与HashSet不同的是,TreeSet具有排序功能,分为自然排序(123456)和自定义排序两类,默认是自然排序;在程序中,我们可以按照任意顺序将元素插入到集合中,等到遍历时TreeSet会按照一定顺序输出–倒序或者升序。
下面是一个用TreeSet排序的简单代码:
package com.set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<String> treeSetString = new TreeSet<String>();
treeSetString.add("a");
treeSetString.add("z");
treeSetString.add("d");
treeSetString.add("b");
System.out.println("字母顺序:" + treeSetString.toString());
TreeSet<Integer> treeSetInteger = new TreeSet<Integer>();
treeSetInteger.add(1);
treeSetInteger.add(24);
treeSetInteger.add(23);
treeSetInteger.add(6);
System.out.println("数字顺序:" + treeSetInteger.toString());
}
}
输出结果如下:
Java集合类库就介绍到这里,如果发现文章中错误,请直接评论,我会及时更改。