数组的特点
- 一旦初始化,长度就不可改变
- 数组元素是紧密排列的、有序的、可重复的
集合中的实现类
- Collection(接口):存储一个一个 的数据
|
|_ List(接口):存储有序的,可重复的数据(动态数组)
|
|__ArrayList(主要实现类):线程不安全,底层使用数组存储,在查询、添加数据时,效率较高;在插入、删除数据时,效率较低
|
|__LinkedList(实现类):底层使用双向链表的方式存储,在插入、删除数据时,效率较高;在查询、添加数据时,效率较低
|
|_Vector(实现类):不常用,线程安全
|
| Set(接口):存储无序的,不可重复的数据(一般用于过滤重复数据)
|
| _HashSet(主要实现类):底层使用的是HashMap,即使用数组+单向链表+红黑树结构存储。判断两个元素相同依据是重写equals和hashCode方法
|
|_LinkedHashSet(HashSet子类):在HashSet基础上增加个双向链表,用于记录添加元素的先后顺序。即,可以按照添加元素的先后顺序遍历,便于频繁的查询操作
|
|_TreeSet(实现类):底层使用红黑树存储,元素添加后,默认按照元素的指定属性的大小排序,且所有元素必须是同一个类型的,否则报错。判断两个元素是否相同依据是重写的comparable、comparator接口中的比较方法 - Map(接口):用于存储一对一对 的数据
|
|_ HashMap(主要实现类):线程不安全,可以添加null的key和value,底层使用数组+单向链表+红黑树结构存储
|
|_ LinkedHashMap:在HashMap基础上,增加了一对双向链表,用于记录元素的先后顺序
|
|_ TreeMap:底层使用红黑树存储,元素添加后,默认按照key的大小排序,且所有key必须是同一个类型的,否则报错。判断两个元素是否相同依据是重写的comparable、comparator接口中的比较方法
|
|_ Hashtable(不常用):线程安全,不可以添加null的key和value,底层使用数组+单向链表结构存储
|
|_ properties:键值对必须是String,常用来处理属性文件
Collection中的公共方法
-
add(Object obj)
:向集合中添加"一个"元素javaCollection coll = new ArrayList(); coll.add(1); // 自动装箱成Integer coll.add("ABC"); coll.add(new Object()); // 存储地址 Collection innerColl = new ArrayList(); innerColl.add("a"); innerColl.add("b"); coll.add(innerColl); // 添加一个ArrayList System.out.println(coll); // [1, "ABC", java.lang.Object@6debcae2, ["a", "b"]]
-
addAll(Collection coll)
:向集合中添加一堆元素(平铺展开)javaCollection coll = new ArrayList(); coll.add(1); coll.add("ABC"); Collection newColl = new ArrayList(); newColl.add("a"); newColl.add("b"); coll.addAll(newColl); System.out.println(coll); // [1, "ABC", "a", "b"]
-
size()
:获取集合实际存储长度javaCollection coll = new ArrayList(); coll.add(1); coll.add("a"); System.out.println(coll.size()); // 2
-
isEmpty()
:判断集合是否为空(Boolean) -
contains(Object obj)
判断数组是否包含obj元素javaCollection coll = new ArrayList(); coll.add(123); coll.add("abc"); coll.add(new Person("Tony", 18)); coll.add(new Person("Lisa", 20)); // 到此步骤,假如Person重写了equals方法 System.out.println(coll.contains(123)); // true System.out.println(coll.contains("abc")); // true,String重写了equals方法,比的是内容 System.out.println(coll.contains(new Person("Tony", 18))); // false,Person默认的equals方法比的是地址 System.out.println(coll.contains(new Person("Lisa", 20))); // true,Person重写了equals方法,比的是内容
-
containsAll(Collection coll)
:判断集合是否同时包含coll中所有的元素javaCollection coll = new ArrayList(); coll.add("123"); coll.add("bb"); coll.add("cc"); Collection newColl = new ArrayList(); newColl.add("123"); newColl.add("bb"); System.out.println(coll.containsAll(newColl)); // true
-
equals(Object obj)
:判断集合是否跟obj相同 -
clear()
:清空集合 -
remove(Object obj)
:从当前集合中删除一个与obj相同的元素javaCollection coll = new ArrayList(); coll.add(123); coll.add("abc"); coll.remove("abc"); System.out.println(coll); // [123]
-
removeAll(Collection coll)
:从当前集合中删除所有与coll集合相同的元素javaCollection coll = new ArrayList(); coll.add(123); coll.add("abc"); Object obj = new Object(); coll.add(obj); Collection coll1 = new ArrayList(); coll1.add(obj); coll1.add("abc"); coll.removeAll(coll1); System.out.println(coll); // [123]
-
retainAll(Collection coll)
:取两个集合的交集(操作源集合)javaCollection coll = new ArrayList(); coll.add(123); coll.add("abc"); Collection coll1 = new ArrayList(); coll1.add("abc"); coll1.add("666"); coll.retainAll(coll1); System.out.println(coll); // ["abc"] System.out.println(coll1); // ["abc", "666"] ```14. `toArray()`:集合转为数组 ```java Collection coll = new ArrayList(); coll.add(123); coll.add("abc"); Object[] arr = coll.toArray(); // 集合转数组 System.out.println(Arrays.toString(arr)); // [123, "abc"]
-
Arrays.asList(Object ... objs)
:数组转集合javaString[] arr = new String[]{"abc", "123", "ccc"}; List list1 = Arrays.asList(arr); // 方式一:传入数组 List list2 = Arrays.asList("xxx", "yyy", "zzz"); // 方式二:传入单个元素 System.out.println(list1); // ["abc", "123", "ccc"] System.out.println(list2); // ["xxx", "yyy", "zzz"] Integer[] integerArr = new Integer[]{1, 2, 3}; // 自动装箱 List list3 = Arrays.asList(integerArr); // 每个元素是Integer类型的,所以元素可以平铺展开放入集合中 int[] intArr = new int[]{1, 2, 3}; List list4 = Arrays.asList(intArr); // 每个元素是int类型的(不会自动装箱),因为集合必须放入引用类型数据,所以只能把数组当做一个元素放入集合中 System.out.println(list3); // [1, 2, 3] 长度为3 System.out.println(list4); // [[I@7ba4f24f] 长度为1
-
hashCode()
:获取集合的哈希值 -
iterator()
:返回迭代器对象,用于集合遍历javaCollection coll = new ArrayList(); coll.add(123); coll.add("abc"); Iterator iterator = coll.iterator(); // 使用迭代器遍历集合 while(iterator.hasNext()) { System.out.println(iterator.next()); // next()作用:指针下移、将下移以后集合对应位置上的元素返回 }
-
removeIf(Predicate)
:传入predicate接口,删除指定的元素javaArrayList<Integer> list = new ArrayList<>(); // 随机添加5个0-100整数到集合中 while(list.size() < 5) { int rNum = (int)Math.floor(Math.random() * 101); list.add(rNum); } System.out.println(list); // [83, 78, 93, 55, 38] // 去掉集合中的所有偶数 list.removeIf(new Predicate<Integer>(){ public boolean test(Integer i) { return i % 2 == 0; } }); System.out.println(list); // [83, 93, 55]
ArrayList中的独有方法(跟索引有关)
get(int index)
:获取指定索引位置的元素set(int index, Object obj)
:将指定索引位置元素设置为objadd(int index, Object obj)
:在index位置插入obj元素addAll(int index, Collection coll)
:从index位置开始将coll中的所有元素插入进来subList(int fromIndex, int endIndex)
:获取[fromIndex, endIndex)索引区间的元素indexOf(Object obj)
:获取obj在集合中首次出现的索引(从左往右)lastIndexOf(Object obj)
:获取obj在集合中末次出现的索引(从左往右)remove(int index)
:删除index位置的元素
Map中的常用方法
-
put(Object key, Object value)
:添加或者修改一个元素 -
putAll(Map m)
:添加或修改多个元素 -
remove(Object key)
:删除指定key的元素 -
clear()
:清空集合 -
get(Object key)
:获取键是key的元素值 -
size()
:获取Map长度 -
isEmpty()
:集合是否为空 -
equals(Object obj)
:判断当前集合是否与obj相同 -
keySet()
:遍历key -
values()
:遍历value -
entrySet()
:遍历entryjavaHashMap map = new HashMap(); map.put("name", "Lisa"); map.put("age", 18); Set entrySet = map.entrySet(); Iterator iterator = entrySet.iterator(); while(iterator.hasNext()) { Map.Entry entry = (Map.Entry)iterator.next(); System.out.println(entry.getKey()); // 获取entry中的key System.out.println(entry.getValue()); // 获取entry中的value }
-
containsKey(Set key)
:是否包含指定的key -
containsValue(Object value)
:是否包含指定的value
Set集合(HashSet、LinkedHashSet)的无序性和不可重复性是怎么定义的?
- 无序性: 与添加元素的存储位置有关,是根据添加元素的哈希值计算出在集合中的存储位置,此位置不是紧密排列
- 不可重复性:添加到集合中的元素不能相同,判断标准是hashCode()和equals()都相同才算相同,如果hashCode相同,equals不同,则算是不同的元素,因为在同一个位置可能会有多个元素,多个元素是通过链表的方式相连的
HashMap中元素的特点
- 所有的key之间是不可重复的、无序的。key所在的类要重写hashCode()和equals()
- 所有的value之间是可重复的、无序的。value所在的类要重写equals()
- key和value就构成了一个entry
- 所有的entry之间是不可重复的、无序的。所以可以看成是一个Set
集合、数组遍历方式:增强for循环(forEach)
说明:增强for循环的执行过程中,是将集合或数组中的元素依次赋值给临时变量,注意,循环体中对临时变量的修改,可能不会导致原有集合或数组中元素的修改
java
int[] arr = new int[]{1, 2, 3, 4};
for(int i : arr) {
System.out.println(i); // 依次打印 1 2 3 4
}
Collections工具类
是一个用于操作List、Set、Map集合的工具类,常用方法如下
-
reverse(List)
:反转 -
shuffle(List)
:随机排序 -
sort(List list, Comparator)
:自然排序 / 定制排序 -
swap(List, int, int)
:交换两个位置的元素 -
max(Collection, Comparator)
:获取集合中的最大值,可以定制排序 -
min(Collection, Comparator)
:获取集合中的最小值,可以定制排序 -
binarySearch(List, Object, Comparator)
:二分查找元素的下标(集合必须是有序的) -
frequency(Collection, Object)
:获取元素在集合中出现的次数 -
copy(List dest, List src)
:将集合src中的元素复制到集合dest中javaList src = Arrays.asList(4,5,6,7,8,9,10); List dest = Arrays.asList(new Object[src.size()]); // 目标集合的长度必须保证>=原集合,否则报错 Collections.copy(dest, src); System.out.println(dest); // [4,5,6,7,8,9,10]
-
提供了多个unmodifiableList()方法,返回的List是只读的
javaList list = Arrays.asList(4,5,6,7,8,9,10); List newList = Collections.unmodifiableList(list); newList.add(123); // 报错
-
replaceAll(List list, Object oldVal, Object newVal)
:将所有oldVal元素替换为newVal元素javaList list = Arrays.asList(4,5,6,7,8,9,10,6); Collections.replaceAll(list, 6, 11); System.out.println(list); // [4,5,11,7,8,9,10,11]
-
addAll(Collection, ... e)
:将所有指定元素添加到collection中 -
synchronizedList(List)
:返回线程安全的集合