学习笔记:Java容器Collection接口和Map接口
一、 为什么要使用Java集合框架
使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。
数组在内存存储方面的特点:
- 数组初始化以后,长度就确定了。不便于扩展 ,存储的数据是有序的、可以重复的。
- 数组声明的类型,就决定了进行元素初始化时的类型,数组中提供的属性和方法少,不便于进行添加、删除、插入等操作,且效率不高。 同时无法直接获取存储元素的个数。
Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的 key-value 键值对关联数组。
二、主要的Java集合框架
三、Collection接口的常用API
一般指Collection中的的抽象方法。
boolean add(E e) :向此集合添加指定的元素。
int size() :返回此集合中元素的数量。
void clear() :从集合中删除所有元素。
boolean isEmpty() :如果该集合不包含元素,则返回true。
boolean addAll(Collection<? extends E> c) :将指定集合中的所有元素添加到此集合。
boolean contains(Object o) :如果该集合包含指定的元素,则返回true。
boolean containsAll(Collection<?> c) :如果该集合包含指定集合中的所有元素,则返回true。
boolean remove(Object o) :从集合中删除指定元素的单个实例。
boolean removeAll(Collection<?> c) :删除指定集合中包含的该集合的所有元素。
boolean equals(Object o) :比较指定的对象与此集合是否相等。
int hashCode() :返回此集合的哈希码值。
boolean retainAll(Collection<?> c) :只保留该集合中包含在指定集合中的元素。
Object[] toArray() :返回包含此集合中所有元素的数组。 Collection-->数组
static List asList( a) : 返回由指定数组支持的固定大小的列表。 列表-->Collection
注意:java.util.ArrayList重新了这些方法而Arrays的内部类ArrayList没有重新,所以会抛出异常。可以通过ArraysList构造器来解决
1 import org.junit.Test; 2 3 import java.util.*; 4 5 /** 6 * @author vetstein 7 * @creat 2021-03-2021/3/1-19:18 8 * 9 * 注意:向Collection接口的实现类的对象中加入数据obj时,要求obj所在类要重写equsls()方法。体现在contains()、remove()等API的调用中。 10 */ 11 public class CollectionTest { 12 @Test 13 public void test1(){ 14 // boolean add(E e) :向此集合添加指定的元素。 15 Collection c = new ArrayList(); 16 c.add(123); 17 c.add(456); 18 c.add("Good"); 19 c.add(new Person(12,"小王")); 20 c.add(new Person(24,"小李")); 21 System.out.println(c);//[123, 456, Good, Person{age=12, name='小王'}, Person{age=24, name='小李'}] 22 23 //int size() :返回此集合中元素的数量。 24 int a = c.size(); 25 System.out.println(a);//5 26 27 //void clear() :从集合中删除所有元素。 28 c.clear(); 29 int a2 = c.size(); 30 System.out.println(a2);//0 31 32 //boolean isEmpty() :如果该集合不包含元素,则返回true。 33 boolean a3 = c.isEmpty(); 34 System.out.println(a3);//true 35 36 //boolean addAll(Collection<? extends E> c) :将指定集合中的所有元素添加到此集合。 37 Collection c2 = Arrays.asList(123,456,"Good",new Person(12,"小王"),new Person(14,"小李")); 38 c.addAll(c2); 39 System.out.println(c);//[123, 456, Good, Person{age=12, name='小王'}, Person{age=14, name='小李'}] 40 41 //boolean contains(Object o) :如果该集合包含指定的元素,则返回true。 42 boolean bo1 = c.contains(123); 43 System.out.println(bo1);//true 44 boolean bo2 = c.contains(new Person(14,"小李")); 45 System.out.println(bo2);//true 46 47 //boolean containsAll(Collection<?> c) :如果该集合包含指定集合中的所有元素,则返回true。 48 Collection co2 = Arrays.asList(123,456,"Good"); 49 boolean bo3 = c.containsAll(co2); 50 System.out.println(bo3);//true 51 52 //boolean remove(Object o) :从集合中删除指定元素的单个实例。 53 c.remove(123); 54 System.out.println(c);//[456, Good, Person{age=12, name='小王'}, Person{age=14, name='小李'}] 55 56 //boolean removeAll(Collection<?> c) :删除指定集合中包含的该集合的所有元素。 57 Collection co3 = Arrays.asList(123,456); 58 boolean bo4 =c.removeAll(co3); 59 System.out.println(bo4);//true 60 System.out.println(c);//[Good, Person{age=12, name='小王'}, Person{age=14, name='小李'}] 61 62 //boolean equals(Object o) :比较指定的对象与此集合是否相等。 63 Collection co4 = Arrays.asList("Good",new Person(12,"小王"),new Person(14,"小李")); 64 boolean bo5 = c.equals(co4); 65 System.out.println(bo5);//true 66 67 //int hashCode() :返回此集合的哈希码值。 68 int num1 = c.hashCode(); 69 System.out.println(num1);//2131989475 70 71 //boolean retainAll(Collection<?> c) :只保留该集合中包含在指定集合中的元素。 72 Collection co5 = Arrays.asList("good","Good"); 73 c.retainAll(co5); 74 System.out.println(c); 75 76 //Object[] toArray() :返回包含此集合中所有元素的数组。 Collection-->数组 77 c.addAll(co4); 78 System.out.println(c);//[Good, Good, Person{age=12, name='小王'}, Person{age=14, name='小李'}] 79 Object[] o = c.toArray(); 80 System.out.println(o.toString());//[Ljava.lang.Object;@4563e9ab 81 82 //static List asList( a) : 返回由指定数组支持的固定大小的列表。 列表-->Collection 83 //调用Arrays.asList()生产的List的add、remove会报异常, 84 // 这是由Arrays.asList() 返回的是Arrays的内部类ArrayList, 而不是java.util.ArrayList。 85 // Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList 86 // remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。 87 // java.util.ArrayList重新了这些方法而Arrays的内部类ArrayList没有重新,所以会抛出异常。可以通过ArraysList构造器来解决 88 Collection co6 = Arrays.asList(123,456,789); 89 System.out.println(co6);//[123, 456, 789] 90 //co6.add(123);//Error 会抛出java.lang.UnsupportedOperationException 91 ArrayList list = new ArrayList(co6) ; 92 list.add(123); 93 94 95 } 96 97 @Test 98 public void test2() { 99 //Iterator<E> iterator() 返回该集合中元素的迭代器。 100 Collection c = new ArrayList(); 101 c.add(123); 102 c.add(456); 103 c.add("Aa"); 104 c.add("Bb"); 105 c.add("Cc"); 106 Iterator iter = c.iterator(); 107 //常用API boolean hasNext() ,boolean hasNext() ,default void remove() 108 while (iter.hasNext()) { 109 System.out.println(iter.next());//123 456 Aa Ba Cc 110 } 111 112 Iterator iter1 = c.iterator(); 113 while (iter1.hasNext()) { 114 if (new Integer(123).equals(iter1.next())) { 115 iter1.remove(); 116 } 117 } 118 System.out.println(c);//[456, Aa, Bb, Cc] 119 } 120 121 @Test 122 public void test3(){ 123 Collection c = new ArrayList(); 124 c.add(123); 125 c.add(456); 126 c.add("Aa"); 127 c.add("Bb"); 128 c.add("Cc"); 129 for(Object o : c){ 130 System.out.println(o);//123 456 Aa Bb Cc 131 } 132 } 133 134 135 136 }
四、ArrayList中的常用API
增加:add( )
删除:remove( )
修改: set( )
查询: get( ),indexOf( )
遍历: iterator( )
长度: size( )
1 import org.junit.Test; 2 3 import java.util.*; 4 5 /** 6 * @author vetstein 7 * @creat 2021-03-2021/3/2-10:38 8 */ 9 public class ArrayListTest { 10 @Test 11 public void test1(){ 12 //增加: boolean add(E e) ,void add(int index, E element) , 13 // boolean addAll(Collection<? extends E> c) ,boolean addAll(int index, Collection<? extends E> c) 14 ArrayList list = new ArrayList(); 15 list.add(123); 16 System.out.println(list);//[123] 17 list.add(1,456); 18 System.out.println(list);//[123, 456] 19 Collection co1 = Arrays.asList("good","Hello","nice"); 20 list.addAll(co1); 21 System.out.println(list);//[123, 456, good, Hello, nice] 22 list.addAll(1,co1); 23 System.out.println(list);//[123, good, Hello, nice, 456, good, Hello, nice] 24 25 //查 E get(int index) 26 Object ob1 = list.get(2); 27 System.out.println(ob1);//Hello 28 29 //查找:int indexOf(Object o) 30 int in1 = list.indexOf("Hello"); 31 System.out.println(in1);//2 32 33 //查找:int lastIndexOf(Object o) 34 int in2 = list.lastIndexOf("Hello"); 35 System.out.println(in2);//6 36 37 //删除 E remove(int index) ,boolean remove(Object o) ,boolean removeAll(Collection<?> c) 38 list.remove(new Integer(456)); 39 System.out.println(list);//[123, good, Hello, nice, good, Hello, nice] 40 list.remove(2); 41 System.out.println(list);//[123, good, nice, good, Hello, nice] 42 Collection co2 = Arrays.asList(123); 43 list.removeAll(co2); 44 System.out.println(list);//[good, nice, good, Hello, nice] 45 46 //修改 E set(int index, E element) 47 list.set(1,"Nice"); 48 System.out.println(list);//[good, Nice, good, Hello, nice] 49 50 //List<E> subList(int fromIndex, int toIndex) 返回指定的fromIndex(包含)和toIndex(排除)之间的列表 51 List li = list.subList(1,4); 52 System.out.println(li);//[Nice, good, Hello] 53 54 //遍历 55 Iterator iter1 = list.iterator(); 56 while (iter1.hasNext()){ 57 System.out.println(iter1.next());//good Nice good Hello nice 58 } 59 60 //长度 int size() 61 int in3 = list.size(); 62 System.out.println(in3);//5 63 64 HashSet 65 } 66 }
五、常用工具类Collections的常用API
1 import org.junit.Test; 2 3 import java.util.*; 4 5 /** 6 * @author vetstein 7 * @creat 2021-03-2021/3/2-20:13 8 */ 9 public class CollectionsTest { 10 11 12 @Test 13 public void test1(){ 14 List list = new ArrayList(); 15 list.add(123); 16 list.add(456); 17 list.add(789); 18 list.add(101); 19 list.add(111); 20 21 System.out.println(list);//[123, 456, 789, 101, 111] 22 23 //static void reverse(List<?> list) :反转指定列表中元素的顺序。 24 Collections.reverse(list); 25 System.out.println(list);//[111, 101, 789, 456, 123] 26 27 //static void shuffle(List<?> list) :使用默认的随机源随机排列指定的列表。 28 Collections.shuffle(list); 29 System.out.println(list);//[456, 111, 101, 123, 789] 30 31 //static <T extends Comparable<? super T>> 32 //void sort(List<T> list) 33 Collections.sort(list); 34 System.out.println(list);//[101, 111, 123, 456, 789] 35 36 //static <T> void sort(List<T> list, Comparator<? super T> c) 37 Collections.sort(list, new Comparator () { 38 @Override 39 public int compare(Object o1, Object o2) { 40 if (o1 instanceof Integer && o2 instanceof Integer){ 41 Integer in1 = (Integer) o1; 42 Integer in2 = (Integer) o2; 43 return -Integer.compare(in1,in2); 44 } 45 else 46 throw new RuntimeException("传入数据类型部队"); 47 48 } 49 }); 50 System.out.println(list);//[789, 456, 123, 111, 101] 51 52 //static void swap(List<?> list, int i, int j) :交换指定列表中指定位置的元素。 53 Collections.swap(list,0,4); 54 System.out.println(list);//[101, 456, 123, 111, 789] 55 56 //static <T extends Object & Comparable<? super T>> 57 //T max(Collection<? extends T> coll) 58 Object m1 = Collections.max(list); 59 System.out.println(m1);//789 60 61 Object m2 = Collections.max(list, new Comparator() { 62 @Override 63 public int compare(Object o1, Object o2) { 64 if (o1 instanceof Integer && o2 instanceof Integer){ 65 Integer in1 = (Integer) o1; 66 Integer in2 = (Integer) o2; 67 return -Integer.compare(in1,in2); 68 } 69 else 70 throw new RuntimeException("传入数据类型部队"); 71 } 72 }); 73 System.out.println(m2);//101 74 75 //static <T extends Object & Comparable<? super T>> 76 //T min(Collection<? extends T> coll) 77 Object o1 = Collections.min(list); 78 System.out.println(m2);//101 79 80 //static int frequency(Collection<?> c, Object o) :static int frequency(Collection<?> c, Object o) 。 81 list.add(789); 82 list.add(789); 83 list.add(789); 84 int in1 = Collections.frequency(list,789); 85 System.out.println(in1);//4 86 87 //static <T> void copy(List<? super T> dest, List<? extends T> src) :将一个列表中的所有元素复制到另一个列表中。 88 List l1 = Arrays.asList(new Object[list.size()-3]); 89 Collections.copy(list,l1); 90 System.out.println(list);//[null, null, null, null, null, 789, 789, 789] 91 92 //static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) :将列表中某个指定值的所有出现替换为另一个指定值。 93 Collections.replaceAll(list,null,"good"); 94 System.out.println(list);//[good, good, good, good, good, 789, 789, 789] 95 96 97 } 98 }
六、HashMap’的常用API
增加、删除、修改操作:put( ),putAll( ),remove( ),clear( )
查询操作:get( ),containsKey( ),containsValue( ),size( ),isEmpty( ),equals( )
元视图操作:keySet( ),values( ),entrySet( )
1 import org.junit.Test; 2 3 import java.util.*; 4 5 /** 6 * @author vetstein 7 * @creat 2021-03-2021/3/2-22:49 8 */ 9 public class HashMapTest { 10 @Test 11 public void test1(){ 12 //添加,删除,修改操作 13 Map m = new HashMap(); 14 m.put("小赵",13); 15 m.put("小钱",14); 16 m.put("小孙",15); 17 m.put("小李",16); 18 System.out.println(m);//{小孙=15, 小李=16, 小钱=14, 小赵=13} 19 m.put("小赵",14); 20 System.out.println(m);//{小孙=15, 小李=16, 小钱=14, 小赵=14} 21 22 Map ma1 = new HashMap(); 23 ma1.put("小周",17); 24 ma1.put("小吴",18); 25 m.putAll(ma1); 26 System.out.println(m);//{小孙=15, 小周=17, 小李=16, 小钱=14, 小赵=14, 小吴=18} 27 28 m.remove("小孙"); 29 System.out.println(m);//{小周=17, 小李=16, 小钱=14, 小赵=14, 小吴=18} 30 31 m.clear(); 32 System.out.println(m);//{} 33 34 } 35 36 @Test 37 public void test2(){ 38 //元素查询的操作 39 Map m = new HashMap(); 40 m.put("小赵",13); 41 m.put("小钱",14); 42 m.put("小孙",15); 43 m.put("小李",16); 44 45 Object o = m.get("小李"); 46 System.out.println(o);//16 47 48 boolean bo1 = m.containsKey("小李"); 49 System.out.println(bo1);//true 50 51 boolean bo2 = m.containsValue(15); 52 System.out.println(bo2);//true 53 54 int in1 = m.size(); 55 System.out.println(in1);//4 56 57 boolean bo3 = m.isEmpty(); 58 System.out.println(bo3);//false 59 60 Map m2 = new HashMap(); 61 m2.put("小赵",14); 62 m2.put("小钱",14); 63 m2.put("小李",16); 64 m2.put("小周",17); 65 m2.put("小吴",18); 66 Boolean bo4 = m2.equals(m2); 67 System.out.println(bo4);//true 68 69 } 70 71 @Test 72 public void test3(){ 73 //元视图操作 74 Map m2 = new HashMap(); 75 m2.put("小赵",14); 76 m2.put("小钱",14); 77 m2.put("小李",16); 78 m2.put("小周",17); 79 m2.put("小吴",18); 80 System.out.println(m2); 81 82 Set s = m2.keySet(); 83 System.out.println(s); 84 Iterator iter1 = s.iterator(); 85 while (iter1.hasNext()){ 86 System.out.println(iter1.next()); 87 //17 88 //16 89 //14 90 //14 91 //18 92 } 93 Collection c = m2.values(); 94 Iterator iter2 = c.iterator(); 95 while (iter2.hasNext()){ 96 System.out.println(iter2.next());//[17, 16, 14, 14, 18] 97 } 98 System.out.println(c); 99 Set s1 = m2.entrySet(); 100 Iterator iter3 = s1.iterator(); 101 while (iter3.hasNext()){ 102 Map.Entry e = (Map.Entry) iter3.next(); 103 System.out.println("key "+e.getKey()+" Value "+e.getValue()); 104 //key 小周 Value 17 105 // key 小李 Value 16 106 //key 小钱 Value 14 107 //key 小赵 Value 14 108 //key 小吴 Value 18 109 } 110 111 Iterator iter4 = s.iterator(); 112 while (iter4.hasNext()){ 113 Object o = iter4.next(); 114 System.out.println(o+"value is "+m2.get(o));//小周value is 17 小李value is 16 小钱value is 14 小赵value is 14 115 //小吴value is 18 116 } 117 } 118 }