Java中的集合

数组的特点

  1. 一旦初始化,长度就不可改变
  2. 数组元素是紧密排列的、有序的、可重复的

集合中的实现类

  1. Collection(接口):存储一个一个 的数据
    |
    |_ List(接口):存储有序的,可重复的数据(动态数组)
      |
      |__ArrayList(主要实现类):线程不安全,底层使用数组存储,在查询、添加数据时,效率较高;在插入、删除数据时,效率较低
      |
      |__LinkedList(实现类):底层使用双向链表的方式存储,在插入、删除数据时,效率较高;在查询、添加数据时,效率较低
      |
      |_Vector(实现类):不常用,线程安全
    |
    |
    Set(接口):存储无序的,不可重复的数据(一般用于过滤重复数据)
      |
      | _HashSet(主要实现类):底层使用的是HashMap,即使用数组+单向链表+红黑树结构存储。判断两个元素相同依据是重写equals和hashCode方法
        |
        |_LinkedHashSet(HashSet子类):在HashSet基础上增加个双向链表,用于记录添加元素的先后顺序。即,可以按照添加元素的先后顺序遍历,便于频繁的查询操作
      |
      |_TreeSet(实现类):底层使用红黑树存储,元素添加后,默认按照元素的指定属性的大小排序,且所有元素必须是同一个类型的,否则报错。判断两个元素是否相同依据是重写的comparable、comparator接口中的比较方法
  2. Map(接口):用于存储一对一对 的数据
    |
    |_ HashMap(主要实现类):线程不安全,可以添加null的key和value,底层使用数组+单向链表+红黑树结构存储
      |
      |_ LinkedHashMap:在HashMap基础上,增加了一对双向链表,用于记录元素的先后顺序
    |
    |_ TreeMap:底层使用红黑树存储,元素添加后,默认按照key的大小排序,且所有key必须是同一个类型的,否则报错。判断两个元素是否相同依据是重写的comparable、comparator接口中的比较方法
    |
    |_ Hashtable(不常用):线程安全,不可以添加null的key和value,底层使用数组+单向链表结构存储
      |
      |_ properties:键值对必须是String,常用来处理属性文件

Collection中的公共方法

  1. add(Object obj):向集合中添加"一个"元素

    java 复制代码
    Collection 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"]]
  2. addAll(Collection coll):向集合中添加一堆元素(平铺展开)

    java 复制代码
    Collection 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"]
  3. size():获取集合实际存储长度

    java 复制代码
    Collection coll = new ArrayList();
    coll.add(1);
    coll.add("a");
    System.out.println(coll.size()); // 2
  4. isEmpty():判断集合是否为空(Boolean)

  5. contains(Object obj)判断数组是否包含obj元素

    java 复制代码
    Collection 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方法,比的是内容
  6. containsAll(Collection coll):判断集合是否同时包含coll中所有的元素

    java 复制代码
    Collection 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
  7. equals(Object obj):判断集合是否跟obj相同

  8. clear():清空集合

  9. remove(Object obj):从当前集合中删除一个与obj相同的元素

    java 复制代码
    Collection coll = new ArrayList();
    coll.add(123);
    coll.add("abc");
    coll.remove("abc");
    System.out.println(coll); // [123]
  10. removeAll(Collection coll):从当前集合中删除所有与coll集合相同的元素

    java 复制代码
    Collection 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]
  11. retainAll(Collection coll):取两个集合的交集(操作源集合)

    java 复制代码
    Collection 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"]
  12. Arrays.asList(Object ... objs):数组转集合

    java 复制代码
    String[] 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
  13. hashCode():获取集合的哈希值

  14. iterator():返回迭代器对象,用于集合遍历

    java 复制代码
    Collection coll = new ArrayList();
    coll.add(123);
    coll.add("abc");
    Iterator iterator = coll.iterator();
    // 使用迭代器遍历集合
    while(iterator.hasNext()) {
    	System.out.println(iterator.next()); // next()作用:指针下移、将下移以后集合对应位置上的元素返回
    }
  15. removeIf(Predicate):传入predicate接口,删除指定的元素

    java 复制代码
    ArrayList<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中的独有方法(跟索引有关)

  1. get(int index):获取指定索引位置的元素
  2. set(int index, Object obj):将指定索引位置元素设置为obj
  3. add(int index, Object obj):在index位置插入obj元素
  4. addAll(int index, Collection coll):从index位置开始将coll中的所有元素插入进来
  5. subList(int fromIndex, int endIndex):获取[fromIndex, endIndex)索引区间的元素
  6. indexOf(Object obj):获取obj在集合中首次出现的索引(从左往右)
  7. lastIndexOf(Object obj):获取obj在集合中末次出现的索引(从左往右)
  8. remove(int index):删除index位置的元素

Map中的常用方法

  1. put(Object key, Object value):添加或者修改一个元素

  2. putAll(Map m):添加或修改多个元素

  3. remove(Object key):删除指定key的元素

  4. clear():清空集合

  5. get(Object key):获取键是key的元素值

  6. size():获取Map长度

  7. isEmpty():集合是否为空

  8. equals(Object obj):判断当前集合是否与obj相同

  9. keySet():遍历key

  10. values():遍历value

  11. entrySet():遍历entry

    java 复制代码
    HashMap 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
    }
  12. containsKey(Set key):是否包含指定的key

  13. containsValue(Object value):是否包含指定的value

Set集合(HashSet、LinkedHashSet)的无序性和不可重复性是怎么定义的?

  1. 无序性: 与添加元素的存储位置有关,是根据添加元素的哈希值计算出在集合中的存储位置,此位置不是紧密排列
  2. 不可重复性:添加到集合中的元素不能相同,判断标准是hashCode()和equals()都相同才算相同,如果hashCode相同,equals不同,则算是不同的元素,因为在同一个位置可能会有多个元素,多个元素是通过链表的方式相连的

HashMap中元素的特点

  1. 所有的key之间是不可重复的、无序的。key所在的类要重写hashCode()和equals()
  2. 所有的value之间是可重复的、无序的。value所在的类要重写equals()
  3. key和value就构成了一个entry
  4. 所有的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集合的工具类,常用方法如下

  1. reverse(List):反转

  2. shuffle(List):随机排序

  3. sort(List list, Comparator):自然排序 / 定制排序

  4. swap(List, int, int):交换两个位置的元素

  5. max(Collection, Comparator):获取集合中的最大值,可以定制排序

  6. min(Collection, Comparator):获取集合中的最小值,可以定制排序

  7. binarySearch(List, Object, Comparator):二分查找元素的下标(集合必须是有序的)

  8. frequency(Collection, Object):获取元素在集合中出现的次数

  9. copy(List dest, List src):将集合src中的元素复制到集合dest中

    java 复制代码
    List 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]
  10. 提供了多个unmodifiableList()方法,返回的List是只读的

    java 复制代码
    List list = Arrays.asList(4,5,6,7,8,9,10);
    List newList = Collections.unmodifiableList(list);
    newList.add(123); // 报错
  11. replaceAll(List list, Object oldVal, Object newVal):将所有oldVal元素替换为newVal元素

    java 复制代码
    List 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]
  12. addAll(Collection, ... e):将所有指定元素添加到collection中

  13. synchronizedList(List):返回线程安全的集合

相关推荐
Am心若依旧4098 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生11 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
Yan.love17 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶20 分钟前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥20 分钟前
java提高正则处理效率
java·开发语言
VBA633730 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~32 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳42 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it42 分钟前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
智慧老师1 小时前
Spring基础分析13-Spring Security框架
java·后端·spring