目录
一、List
List接口继承了Collection接口以定义一个允许重复项的有序集合。
- 允许插入重复的元素
- 允许添加null
以下是接口的三种分类:
(1)ArrayList
- 优点: 底层数据结构是数组,查询快,增删慢。
- 缺点: 线程不安全,效率高
(2)Vector
- 优点: 底层数据结构是数组,查询快,增删慢。
- 缺点: 线程安全,效率低
(3)LinkedList
- 优点: 底层数据结构是链表,查询慢,增删快。
- 缺点: 线程不安全,效率高
主要方法:
(1) add()
在指定索引添加元素
List list= new ArrayList();
list.add("hi");/* 或写为list.add(0,"hi"); */
System.out.println(list);
/*运行结果:[hi]
*/
(2)set()
提供下标和内容,修改对应位置的数据
List list= new ArrayList();
list.add("hi");
list.set(0,"hello");
System.out.println(list);
/*运行结果:[hello]
*/
(3)remove()
删除指定元素
List list= new ArrayList();
list.add("hi");
list.set(0,"hello");
list.add(1,"text");//再添加一个元素
list.remove(0); //删除第一个元素,或写为list.remove("hello");
System.out.println(list);
/*运行结果: [text]
*/
(4)get()
获取指定索引的元素
List list= new ArrayList();
list.add("hi");
list.add(1,"text");
list.add("hello");
System.out.println(list.get(2)+"");/*获得下标为2的元素 */
/* 运行结果;hello */
(5)int size()
获取链表大小(包含元素的个数)
List list= new ArrayList();
list.add("hi");
list.add(1,"text");
list.add("hello");
System.out.println(list.size()+"");/*获取长度 */
/* 运行结果:3 */
(6)of()
可以用创建List,但是不接受null值
List<Integer> list = List.of(1, 2, 5);
Iterator本身也是一个对象,但它是由List的实例调用iterator()方法的时候创建的。
Iterator对象有两个方法:boolean hasNext()判断是否有下一个元素,E next()返回下一个元素。因此,使用Iterator遍历List代码如下:
List<String> list = List.of("apple", "pear","banana");
for (Iterator<String> it =list.iterator(); it.hasNext();)
{
String s = it.next();
System.out.println(s);
}
由于Iterator遍历是如此常用,所以,Java的for each循环本身就可以帮我们使用Iterator遍历。把上面的代码再改写如下:
List<String> list = List.of("apple", "pear", "banana");
for (String s:list)
{
System.out.println(s);
}
(7)List 和Array互换
List 变成Array:
(1)给toArray(T[])传入一个类型相同的Array,List内部自动把元素复制到传入的Array中
List<Integer> list =List.of(12, 34, 56);
Integer[] array =list.toArray(new Integer[3]);
for (Integer n:array) {}
System.out.println(n);
}
如果我们传入类型不匹配的数组,例如,String[]类型的数组,由于List的元素是Integer,所以无法放入String数组,这个方法会抛出ArrayStoreExceptio。
(2)通过List接口定义的T[] toArray(IntFunction<T[]> generator)方法
Integer[] array = list.toArray(Integer[]::new);
Array变成List:
通过List.of(T…)方法最简单
Integer[] array = { 1, 2, 3 };
List<Integer> list = List.of(array);
二、Map
Map集合没有继承Collection接口,其提供的是键到值的映射。Map不能包含相同的键,每个键只能映射一个值。键还决定了储存对象在映射中的储存位置。
- LinkedHashMap集合用法跟HashMap基本一致,它是基于链表和哈希表结构的所以具有存取有序,键不重复的特性,存的顺序和遍历出来的顺序是一致的。
- TreeMap与TreeSet类似,都需要重写比较器(外部比较器+内部比较器)。TreeMap集合特点:单一,有序
主要方法:
(1)put()
- 调用put(K key, V value)方法时,就把key和value做了映射并放入Map。
Map<String, String> map = new HashMap<>();
map.put("hi", 123);
System.out.println(map);
/* 运行结果:{hi=123} */
(2)获取功能
- 获取value
Map<String, String> map = new HashMap<>();
map.put("hi", "123");
//Collection<V> values()
Collection<String> values=map.values();
for(String value: values) {
System.out.println(value);
/* 运行结果:123 */
- 获取key
Map<String, String> map = new HashMap<>();
map.put("hi", "123");
//Set<K> keySet()
Set<String> keys = map.keySet();
for(String key: keys) {
System.out.println(key);
}
/*运行结果:hi */
(3)遍历功能
- 调用V get(K key)时,就可以通过key获取到对应的value
Map<String, String> map = new HashMap<>();
map.put("hi", 123);
Set<String>keys=map.keySet();
for(String key:keys) {
/*通过key找value */
String value = map.get(key);
System.out.println(key+"="+value);
}
/* 运行结果:hi=123 */
- 通过(entry)中间人Set<Map.Entry<K,V>> entrySet() 来寻找Key和Value
Map<String, String> map = new HashMap<>();
map.put("hi", "123");
//获取所有中间人entrys
Set<Map.Entry<String, String>> entrys =map.entrySet();
//遍历所有entrys用Map.Entry<String, String>类型的entry接收
for(Map.Entry<String, String> entry:entrys) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"= "+value);
}
/*运行结果: hi=123 */
三、Set
- Set集合中的对象不按特定的方式排序,只是简单的将对象加入到集合中,但是Set集合不能包括重复对象
- Set接口继承了Collection接口,因此也包含Collection接口的所有方法
- Set实际上相当于只存储key、不存储value的Map。我们经常用Set用于去除重复元素
(1)HashSet
- 不允许重复,无序
(2)LinkedHashSet
- 继承自HashSet,特点是:有序,唯一,效率高
(3)TreeSet
- 为使用树来进行储存的Set接口提供了一个工具,对象按升序储存,访问和检索是很快的。在存储了大量的需要进行快速检索的排序信息的情况下。
主要方法
(1)add()
添加元素
Set<String>set=new HashSet<>();
set.add("hi");
System.out.println(set);
/* 运行结果: [hi] */
(2)remove()
删除元素
Set<String>set=new HashSet<>();
set.add("hi");
set.add("hello");
set.remove("hi");
System.out.println(set);
/*运行结果:[hello] */
(3)contains()
判断是否包含某个元素
Set<String>set=new HashSet<>();
set.add("hello");
System.out.println(set.contains("hi"));
/*运行结果: false */
- HashSet是无序的,因为它实现了Set接口,并没有实现SortedSet接口;
- TreeSet是有序的,因为它实现了SortedSet接口。这个顺序是元素的排序顺序。