Collection接口
概述
数组和集合都是Java中提供的容器
集合: 英文译为 Collection,用来存放对象的容器,集合中可以存放不同类型的对象,并且集合的长度可变。
在编程时,常常需要集中存放多个数据,可以使用数组来保存多个对象,但数组长度不可变化,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组就有点无能为力了;
为了保存数量不确定的数据,以及保存具有映射关系的数据,Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。
小结: 集合和数组的对比:
- 数组中的元素可以基本类型的值,也可以是对象; 而集合中只能保存对象
- 数组一旦指定了长度,长度就不能再改变; 而集合的长度是可以随时改变的
- 往数组中插入元素非常麻烦,需要将插入位置后面的元素往后移动; 或者删除数组中间位置的某一个元素, 需要将删除位置后的元素往前移动; 而如果往集合中插入元素或者删除集合中的某一个元素,直接使用现成的方法操作即可
集合的继承结构
由于需求不同,Java就提供了不同的集合类。这多个集合类的数据结构不同,但是它们都是要提供存储和遍历功能的,我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
Collection接口
- List接口
- ArrayList类
- LinkedList类
- Set接口
- HashSet类
- TreeSet类
解释说明:
-
Collection集合是所有单值集合的顶层接口, 其中定义了常用的用于操作集合以及集合中元素的方法
例如: 添加元素、删除元素、获取元素、获取集合长度、判断功能、将集合转成数组、迭代器遍历元素等功能
-
List是Collection的子接口,特点是其中的元素是有序的(即:元素存入集合时的顺序和取出的顺序一致)
可以通过下标访问List中的元素,另,List集合中的元素是可以重复的(包括null)
-
Set也是Collection的子接口,特点是其中的元素是无序(即:元素存入集合时的顺序和取出的顺序不一定一致)
无法通过下标访问Set中的元素,另外,Set集合中的元素是不可以重复的
学习集合的建议:
-
学习接口中提供的共性方法
-
通过实现类创建对象, 调用这些共性方法
常用方法
!!boolean add(E e)
boolean addAll(Collection c)
!!boolean isEmpty()
boolean contains(Object o)
boolean containsAll(Collection c)
- 如果此集合中包含指定 集合c 中的所有元素,则返回 true。
- 例如c1中有 “a”,“b”,“c”,“d”, 而c2中有"a",“b”, 则c1包含c2, 返回true
若,c1中有 “a”,“b”,“c”,“d”, 而c2中有"x",“a”,“b”, 则c1不包含c2, 返回false
!!int size()
!!boolean remove(Object o)
- 从集合中删除指定的元素o, 删除成功则返回true
- 如果删除的元素不存在导致删除失败, 则返回false
- 如果元素o在集合中出现多次,仅删除第一个
boolean removeAll(Collection c)
- 删除此集合中那些也包含在指定集合c中的所有元素, 若有共同元素, 则删除并返回true
例如 c1中有 “a”,“b”,“c”,“d”, 而c2中有"x",“a”,“b”,
c1.removeAll(c2),只删除c1中两个共同的元素 “a”,“b”, 对c2没有影响
- 如果两个集合中没有共同元素, 则不删除, 返回false
boolean retainAll(Collection c)
- 仅保留此集合中那些也包含在指定集合c中的元素
- 例如 c1中有 “a”,“b”,“c”,“d”, 而c2中有"x",“a”,“b”,
c1.retainAll(c2),只保留c1中两个共同的元素 “a”,“b”, 对c2没有影响
void clear()
Object[] toArray()
boolean equals(Object o)
- 比较此 collection 与指定对象是否相等。
!!Iterator iterator()
实例1:CollectionDemo1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| package collection; import java.util.ArrayList; import java.util.Collection;
public class CollectionDemo1 { public static void main(String[] args) { Collection c = new ArrayList();
c.add("one"); c.add("two"); c.add("three"); c.add("four"); c.add("five"); System.out.println(c); c.add("six"); System.out.println(c); c.add(1); c.add(true); System.out.println(c);
int size = c.size(); System.out.println("集合的元素的个数:"+size); boolean empty = c.isEmpty(); System.out.println("集合是否为空集:"+empty); c.clear(); System.out.println(c); System.out.println("集合的元素个数:"+c.size()); System.out.println("集合是否为空集:"+c.isEmpty()); } }
|
实例2:CollectionDemo2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| package collection; import pojo.Point; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet;
public class CollectionDemo2 { public static void main(String[] args) { Collection c = new ArrayList(); c.add(new Point(1, 2)); c.add(new Point(1, 2)); c.add(new Point(1, 2)); c.add(new Point(3, 4)); c.add(new Point(5, 6)); c.add(new Point(7, 8)); c.add(new Point(9, 0));
System.out.println(c); Point p = new Point(1, 2);
boolean contains = c.contains(p); System.out.println("集合中是否包含(1,2)点:"+contains);
c.remove(p); System.out.println(c); } }
|
Point
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| package pojo; import java.util.Objects; public class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } @Override public String toString() { return "(" + x + "," + y +")"; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Point point = (Point) o; return x == point.x && y == point.y; } @Override public int hashCode() { return Objects.hash(x, y); } }
|
实例4:CollectionDemo4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| package collection; import java.util.ArrayList; import java.util.Collection;
public class CollectionDemo4 { public static void main(String[] args) { Collection c1 = new ArrayList(); c1.add("java"); c1.add("c++"); c1.add(".net"); System.out.println("c1集合:" + c1); Collection c2 = new ArrayList(); c2.add("android"); c2.add("ios"); c2.add("java"); System.out.println("c2集合:" + c2);
c1.addAll(c2); System.out.println("c1集合:" + c1); System.out.println("c2集合:" + c2); Collection c3 = new ArrayList(); c3.add("c++"); c3.add("ios"); System.out.println("c3集合:" + c3);
boolean containsAll = c1.containsAll(c3); System.out.println("c1集合是否包含c3集合:"+containsAll);
c1.retainAll(c3); System.out.println("c1集合:" + c1); System.out.println("c3集合:" + c3);
c1.removeAll(c3); System.out.println("c1集合:" + c1); System.out.println("c3集合:" + c3); } }
|
集合的遍历
IteratorDemo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| package collection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;
public class IteratorDemo { public static void main(String[] args) { Collection c = new ArrayList(); c.add("a"); c.add("#"); c.add("b"); c.add("#"); c.add("c"); c.add("#"); c.add("d"); c.add("#"); c.add("e"); System.out.println(c);
Iterator it = c.iterator();
while (it.hasNext()){
String e = (String) it.next(); if ("#".equals(e)){
it.remove(); } } System.out.println(c); } }
## 增强型for循环
**NewForDemo** ```JAVA package collection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;
public class NewForDemo { public static void main(String[] args) { String[] array = {"a", "b", "c", "d", "e"}; for (int i = 0; i < array.length; i++) { String s = array[i]; System.out.println(s); } for (String s : array) { System.out.println(s); }
Collection<String> c = new ArrayList<>(); c.add("A"); c.add("B"); c.add("C"); c.add("D"); c.add("E"); for (String s : c) { System.out.println(s); } } }
|
List集合
概述
List是一个有序的Collection(List是Collection的子接口),使用此接口能够精确的控制每个元素插入的位置,能够通过索引(类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。
List 接口存储一组可重复、有序(插入顺序)的对象。
特点
- 元素有下标,可以通过下标访问元素
- 元素是有序的(存入集合的顺序和取出的顺序一定相同)
- 元素可以重复(包括null)
List方法测试
ListDemo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| package collection; import java.util.ArrayList; import java.util.List;
public class ListDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); System.out.println(list);
String str = list.get(2); System.out.println(str); for (int i = 0; i < list.size(); i++) { String s = list.get(i); System.out.println(s); } for (String s : list) { System.out.println(s); }
String old = list.set(1, "f"); System.out.println(old); System.out.println(list); } }
|
ListDemo2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package collection; import java.util.ArrayList; import java.util.List;
public class ListDemo1 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); System.out.println(list);
list.add(3,"f"); System.out.println(list);
String old = list.remove(2); System.out.println(old); System.out.println(list); } }
|
ListDemo3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| package collection; import java.util.ArrayList; import java.util.List;
public class ListDemo2 { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(i); } System.out.println(list); List<Integer> subList = list.subList(3, 8); System.out.println(list); System.out.println(subList); for (int i = 0; i < subList.size(); i++) { subList.set(i,subList.get(i)*10); } System.out.println(subList); System.out.println(list); list.subList(1,9).clear(); System.out.println(list); } }
|
集合和数组的转换
集合转换数组:CollectionToArrayDemo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package collection; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection;
public class CollectionToArrayDemo { public static void main(String[] args) { Collection<String> c = new ArrayList<>(); c.add("A"); c.add("B"); c.add("C"); c.add("D"); c.add("E"); System.out.println("集合:"+c);
String[] array = c.toArray(new String[c.size()]); System.out.println("数组:"+ Arrays.toString(array)); } }
|
数组转换集合: ArrayToListDemo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package collection; import java.util.ArrayList; import java.util.Arrays; import java.util.List;
public class ArrayToListDemo { public static void main(String[] args) { String[] arr = {"A","B","C","D","E"}; System.out.println("数组:"+Arrays.toString(arr)); List<String> list = Arrays.asList(arr); System.out.println("集合:"+list); list.set(1, "F"); System.out.println("数组:"+Arrays.toString(arr)); System.out.println("集合:"+list); arr[0] = "G"; System.out.println("数组:"+Arrays.toString(arr)); System.out.println("集合:"+list);
List<String> list2 = new ArrayList<>(list); list2.add("H"); System.out.println("数组:"+Arrays.toString(arr)); System.out.println("集合:"+list); System.out.println("集合:"+list2); } }
|
集合的排序
SortListDemo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package collection; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random;
public class SortListDemo { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 10; i++) { int a = random.nextInt(100); list.add(a); } System.out.println("乱序集合:"+list); Collections.sort(list); System.out.println("从小到大集合:"+list); Collections.reverse(list); System.out.println("从大到小集合:"+list); } }
|
Map接口
概述
Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的键(key)另外一组值用于保存Map里的值(value),键和值是一一对应的关系,称为映射。根据键就能找到对应的值,类似于生活中一张身份证对应一个人一样。
Map的key和value可以是任何引用类型的数据,其中key不允许重复,同一个Map对象的任何两个key通过equals方法比较总是返回false。
特点
- Map集合中每个元素都有两个值, 分别是key(键) 和 value(值)
- Map集合中的key(键)不允许重复, 在第二次添加已有的key时, value会被会覆盖
- Map集合中的元素是无序的(即元素存入集合的顺序和取出时的顺序很可能不一致)
- Map集合中的key和value具有映射关系, 可以通过key(键)来获取对应的value(值)
key和value之间存在单向一对一关系,即通过指定的key,总能找到唯一的、确定的value。从Map中取出数据时,只要给出指定的key,就可以取出对应的value。
如果把Map里的所有key放在一起来看,它们就组成了一个Set集合(所有的key没有顺序,key与key之间不能重复),实际上Map确实包含了一个keySet()方法,用于返回Map里所有key组成的Set集合。
如果把Map里的所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中的索引(也就是key)不是从0开始的整数值,而是任意类型的对象;
如果需要从List集合中取出元素,则需要提供该元素的数字索引;如果需要从Map中取出元素,则需要提供该元素的key。因此,Map有时也被称为字典,或关联数组。
继承结构
Map接口
- HashMap类
- TreeMap类
- Hashtable类
解释说明:
-
Map集合是采用键-值对(key-value)的存储方式, 键(key)、值(value)可以是引用类型的数据, key不允许重复, vaue可以重复, key和value是一对一的关系, 通过指定的key总能找到唯一的、确定的value值
-
HashMap 和 Hashtable 都是Map接口的实现类,它们之间的关系完全类似于ArrayList和Vector的关系
- HashMap是线程不安全的, 所以HashMap的性能要比HashTable高一些
- HashMap可以使用null作为key或value, Hashtable不允许使用null作为key和value;
- Hashtable是一个古老的Map实现类,JDK 1.0出现,出现时,Java还没有提供Map接口,命名没有遵守Java的命名规范,与Vector类似的是,尽量少用Hashtable实现类,即使需要创建线程安全的Map实现类,也无须使用Hashtable实现类,可以通过别的方式来解决线程安全问题。
- TreeMap是Map的子接口SortedMap的的实现类, 是可以支持对内部元素进行排序的类, 也正因为如此, TreeMap的执行效率通常要比HashMap和HashTable慢。
MapDemo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| package map; import java.util.HashMap; import java.util.Map;
public class MapDemo { public static void main(String[] args) { Map<String,Integer> map = new HashMap<>(); map.put("语文", 80); map.put("英语", 90); map.put("物理", 60); map.put("化学", 100); System.out.println(map); Integer score = map.put("数学", 70); System.out.println(map); System.out.println(score); score = map.put("数学", 100); System.out.println(map); System.out.println(score); score = map.get("语文"); System.out.println(score); int size = map.size(); System.out.println(size); boolean ck = map.containsKey("英语"); System.out.println(ck); boolean cv = map.containsValue(97); System.out.println(cv); } }
|
变量分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package test; import pojo.Point; import java.util.ArrayList; import java.util.Collection;
public class Demo { public static void main(String[] args) { String s = "hello"; int a = 1; Point p = new Point(1, 2); Collection c = new ArrayList(); c.add(p); test(s, a, p, c); System.out.println("s:" + s); System.out.println("a:" + a); System.out.println("p:" + p); System.out.println("c:" + c); } public static void test(String s, int a, Point p, Collection c) { a++; s = s + "world"; p.setX(3); p = new Point(4, 5); c.clear(); c.add(p); c = new ArrayList(); p.setX(7); c.add(p); } }
|