【Java】集合

xiaoxiao2021-02-28  15

概述

  Java集合可分为Set、List、Queue和Map四种体系,其中Set代表无序、不可重复的集合;List代表有序、可重复的集合;Map代表具有映射关系的集合;Java5又增加了Queue体系集合,代表一种队列集合实现。   Java集合就像一个容器,可以把多个对象(实际上是对象的引用)存入容器中。在Java5之前,Java集合会丢失容器中所有对象的数据类型,把所有对象都当成Object类型处理;从Java5增加了泛型以后,Java集合可以记住容器中对象的数据类型,从而可以编写出更简洁、健壮的代码。所有的集合类都位于java.util包下。   Java的集合类主要由两个接口派生:Collection和Map,它们是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。如图1-1所示:

图1-1 非完全集合类图

访问方式

  如果访问List集合中的元素,可以直接根据元素的索引来访问;如果访问Map集合中的元素,可以根据每项元素的key来访问其value;如果访问Set集合中的元素,则只能根据元素本身来访问(这也是Set集合里元素不允许重复的原因)。

Collection

  Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法可以操作Set、List和Queue集合。Collection接口中定义了如下操作集合元素的方法。

方法名功能boolean add(Object o)向集合中添加一个元素boolean addAll(Collection c)把集合c里的所有元素添加到指定集合void clear()清除集合里的所有元素,将集合长度变为0boolean contains(Object o)判断集合中是否包含指定元素boolean containsAll(Collection c)判断集合中是否包含集合c里的所有元素boolean isEmpty()判断集合是否为空Iterator iterator()返回一个Iterator对象,用于遍历集合里的元素boolean remove(Object o)删除集合中指定元素o,当集合有多个o时,也仅删除第一个符合条件的元素boolean removeAll(Collection c)从集合中删除集合c里包含的所有元素int size()返回集合里元素个数Object[] toArray()把集合转换成一个数组

示例

数据源 public static void main(String[] args){ Collection names = new HashSet(); // Collection names = new ArrayList(); // Collection names = new LinkedList(); // Collection names = new ArrayDeque(); names.add("张三"); names.add("李四"); names.add("王五"); } 集合遍历 //1.使用Lambda表达式 names.forEach(System.out::println); //2.增强for循环 for(Object obj :names){ String name = (String)obj; System.out.println(name); } //3.借助Iterator Iterator it = names.iterator(); //3.1使用Lambda表达式遍历Iterator it.forEachRemaining(System.out::println); //3.2使用next while (it.hasNext()){ String name = (String)it.next(); System.out.println(name); } 批量删除 Java8起,Collection集合新增了一个removeIf(Predicate filter)方法,该方法将会批量删除符合filter条件的所有元素。 System.out.println(names.size()); names.removeIf( name -> ((String)name).length() == 2); System.out.println(names.size()); 集合打印 System.out.println(names); // [李四, 张三, 王五]

Map

  Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。Map接口中定义了如下方法。

方法名功能void clear()删除Map对象中的所有key-value对boolean containsKey(Object key)查询Map中是否包含指定的keyboolean containsValue(Object value)查询Map中是否包含一个或多个指定的valueSet entrySet()返回Map中包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry对象Object get(Object key)返回指定key对应的value。如果此key不存在,则返回nullboolean isEmpty()判断Map是否为空Set keySet()返回Map中所有key组成的Set集合Object put(Object key,Object value)添加一个key-value对,如果当前Map中已有一个与该key相等的key-value,则覆盖void putAll(Map m)将指定Map中的key-value对复制到本Map中Object remove(Object key)删除指定key所对应的key-value对,返回被删除的key对应的value,若key不存在,返回nullboolean remove(Object key,Object value)java8新增,删除指定的key-value对int size()返回该Map里的key-value对的个数Collection values()返回该Map里所有value组成的Collection

Map中包括一个内部类Entry,该类封装了一个key-value对。Entry包含如下三个方法:

方法名功能Object getKey()返回该Entry里包含的key值Object getValue()返回该Entry里包含的value值Object setValue(V value)设置该Entry里包含的value值,并返回新设置的value值

示例

数据源 Map map = new HashMap(); map.put("张三",3); map.put("李四",4); map.put("王五",5); 遍历 //foreach for (Object key:map.keySet() ) { System.out.println(key + "->"+ map.get(key)); } //lambda map.keySet().forEach(x -> System.out.println(x + "->" + map.get(x))); 打印 System.out.println(map); // {李四=4, 张三=3, 王五=5}

Collections

  Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。

List集合的排序操作 方法名功能void reverse(List list)反转指定List集合中元素的顺序void shuffle(List list)对List集合元素进行随机排序(洗牌)void sort(List list)根据元素的自然顺序对指定List集合的元素按升序进行排序void sort(List list,Comparator c)根据指定Comparator产生的顺序对List集合元素进行排序void swap(List list,int i,int j)将指定List集合中的i处元素和j处元素进行交换void rotate(List list,int distance)distance为正数,将list集合后的distance个元素整体移到前面;为负,逆操作。 查找替换操作 方法名功能int binarySearch(List list,Object key)利用二分法从集合中取出key对应的索引。前提:List有序Object max(Collection coll)根据元素的自然顺序,返回给定集合中的最大元素Object max(Collection coll,Comparator comp)根据Comparator指定的顺序,返回集合中最大元素Object min(Collection coll)根据元素的自然顺序,返回给定集合中的最小元素Object min(Collection coll,Comparator comp)根据Comparator指定的顺序,返回集合中最小元素void fill(List list,Object obj)使用指定元素obj替换指定List集合中的所有元素int frequency(Collection c,Object o)返回指定集合中指定元素出现的次数int indexOfSubList(List source,List target)返回子集合在父集合中第一次出现的位置索引;无此子集合,返回-1int lastIndexOfSubList(List source,List target)最后一次出现的位置索引;无此子集合,返回-1boolean replaceAll(List list,Object oldVal,Object newVal)使用一个新值newVal替换List对象的所有旧值oldVal 同步控制 Collections类中提供了多个synchronizedXxxx()方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。Java中常用的集合框架中的实现类HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap和TreeMap都是线程不安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则存在线程安全问题。Collections提供了多个类方法可以把它们包装成线程同步的集合。下面的示例,直接将新创建的集合对象传给了Collections的synchronizedXxx方法,这样就可以直接获取List、Set和Map的线程安全实现版本。 Collection c = Collections.synchronizedCollection(new ArrayList()); List list = Collections.synchronizedList(new ArrayList()); Set set = Collections.synchronizedSet(new HashSet()); Map m = Collections.synchronizedMap(new HashMap());
转载请注明原文地址: https://www.6miu.com/read-2249999.html

最新回复(0)