zoukankan      html  css  js  c++  java
  • 数组&集合

    数组

      数组是由同类型的对象组成的,这些对象可由索引来引用。

      数组的声明通常是在类型或标识符后面加上“[]”,“[]”的个数表示数组嵌套的层数。数组的嵌套实际上是将数组中的元素也是数组,这也就表明了数组中每个数组元素的长度可以不同。

      在声明数组时使用“{}”为数组赋初值。这种赋值不能在非声明场合使用。

      数组的初始化通过new运算实现,使用new运算初始化时需要在“[]”内设置数组的长度。

      数组的下标从0开始,到length-1。如果使用的下标不在[0, length-1]的范围内,则会抛出ArrayIndexOutOfBoundsException异常。

      数组可以通过“.length”语法获得当前数组的长度。

     1 @Test
     2 void testArray() {
     3     System.out.println("--数组元素长度不同的数组--");
     4     int[][] a = {{1, 2, 3}, {4, 5}};
     5     System.out.println("数组的长度:" + a.length);
     6     System.out.println("第一个数组元素的长度:" + a[0].length);
     7     System.out.println("第二个数组元素的长度:" + a[1].length);
     8     System.out.println("--数组元素长度相同的数组--");
     9     int[][] b = new int[2][3];
    10     System.out.println("数组的长度:" + b.length);
    11     System.out.println("第一个数组元素的长度:" + b[0].length);
    12     System.out.println("第二个数组元素的长度:" + b[1].length);
    13 }
    testArray

      输出结果:

      

    Arrays类

      java.util.Arrays类中提供了很多操作数组的方法。常用的有:

      1.static <T> List<T> asList(T... a):创建一个java.util.Arrays.ArrayList对象并将所有的参数放入该List中。该List不能添加和删除元素。

        a.传入的参数的类型必须相同。

        b.若传入的参数只有一个,且为数组,则会将数组内的所有元素添加到List中。

      2.static <T> T[] copyOfRange(T[] original, int from, int to):截取数组中[from, to)的元素(Arrays类中重载该方法以适用于任何类型的数组)。

      3.static void fill(Object[] a, int fromIndex, int toIndex, Object val):为数组中[fromIndex, toIndex)的元素统一赋值(Arrays类中重载该方法以适用于任何类型的数组)。

      4.static void sort(Object[] a, int fromIndex, int toIndex):将数组中的元素升序排列,元素类型必须是可比较的(Arrays类中重载该方法以适用于任何类型的数组)。

      5.static String toString(Object[] a):获取一维数组的字符串形式(Arrays类中重载该方法以适用于任何类型的数组)。

      6.static String deepToString(Object[] a):获取多维数组的字符串形式(Arrays类中重载该方法以适用于任何类型的数组)。

     1 @Test
     2 void testArrays() {
     3     int[][] a = {{1, 2, 3}, {4, 5, 6}, {9, 8, 7}};
     4     System.out.println("asList: " + Arrays.asList(a));
     5     System.out.println("toString: " + Arrays.toString(a));
     6     System.out.println("deepToString: " + Arrays.deepToString(a));
     7     Arrays.sort(a[2]);
     8     System.out.println(Arrays.deepToString(a));
     9     int[] b = new int[3];
    10     System.out.println(Arrays.toString(b));
    11     Arrays.fill(b, 5);
    12     System.out.println(Arrays.toString(b));
    13     b = Arrays.copyOfRange(a[1], 0, 3);
    14     System.out.println(Arrays.toString(b));
    15 }
    testArrays

      输出结果:

      

      Arrays.toString()方法用于打印一维数组,打印多维数组时只打印最外层数组,此时其中的元素视为数组元素。Arrays.deepToString()方法则可以把多维数组的元素打印。

    集合

      集合是把多个同一类型的元素放进一个单元中,形成一个对象,方便存储、读取、处理数据。常用的集合有:

      Set:集合中不包含重复元素。

      List:集合中的元素是有序的。

      Map:集合中的元素以键值对(key-value)的形式存储。

    Collection接口

      java.util.Collection接口定义了Set、List和Queue这三种集合的公共行为。

      Collection接口常用的方法有:

      1.int size():获取集合的大小(集合中元素的个数)。

      2.boolean isEmpty():判断集合是否为空(集合中是否没有元素)。

      3.Iterator<E> iterator():获取Iterator对象。

      4.Object[] toArray():将所有元素放进Object数组中。

      5.boolean add(E e):在集合末尾新增元素。

      6.boolean remove(Object o):将指定元素删除。

      7.void clear():清空集合。

      8.boolean contains(Object o):判断集合中是否存在指定元素。

     1 @Test
     2 void testCollection() {
     3     Collection<Character> collection = new HashSet<Character>(Set.of('a', 'b', 'c'));
     4     System.out.println("初始集合:" + collection + "	大小:" + collection.size());
     5     System.out.println("集合是否为空:" + collection.isEmpty());
     6     System.out.println("集合中是否存在元素'i':" + collection.contains('i'));
     7     collection.clear();   // 清空集合
     8     System.out.println("集合是否为空:" + collection.isEmpty());
     9     System.out.println("插入元素'i':" + collection.add('i'));
    10     System.out.println("集合中是否存在元素'i':" + collection.contains('i'));
    11     System.out.println("删除元素'j':" + collection.remove('j'));
    12 }
    testCollection

      输出结果:

      

    Iterator接口

      java.util.Iterator接口用于遍历Collection对象。可以调用Collection的iterator()方法获取Iterator对象。

      Iterator接口常用的方法有:

      1.boolean hasNext():判断是否还有下一个元素。

      2.E next():获取下一个元素。

    1 @Test
    2 void testIterator() {
    3     Collection<Character> collection = new HashSet<Character>(Set.of('a', 'b', 'c'));
    4     Iterator<Character> iterator = collection.iterator();
    5     while (iterator.hasNext()) {
    6         System.out.println(iterator.next());
    7     }
    8 }
    testIterator

      输出结果:

      

    Set接口

      Set是不包含重复元素的集合。java.util.Set接口实现了Collection接口。

      常用的Set实现类有:

      HashSet:元素按哈希值排列。

      TreeSet:元素按元素值排列。TreeSet中存放的元素类型必须是可比较的,即对应类必须直接或间接实现Comparable接口。

      LinkedHashSet:元素按插入顺序排列。

     1 @Test
     2 void testSet() {
     3     Set<String> set = Set.of("Anna", "Bob", "Namy", "Nancy");
     4     System.out.println("AbstractImmutableSet: " + set);
     5     // 将set中的元素插入到hashSet中
     6     Set<String> hashSet = new HashSet<String>(set);
     7     System.out.println("HashSet: " + hashSet);
     8     // 将set中的元素插入到treeSet中
     9     Set<String> treeSet = new TreeSet<String>(set);
    10     System.out.println("TreeSet: " + treeSet);
    11     // 将set中的元素插入到linkedHashSet中
    12     Set<String> linkedHashSet = new LinkedHashSet<String>(set);
    13     System.out.println("LinkedHashSet: " + linkedHashSet);
    14 }
    testSet

      输出结果:

        

      可以看到:AbstractImmutableSet存放的元素是无序的;HashSet按照哈希值顺序排列;TreeSet按照元素值顺序排列;LinkedHashSet按照插入顺序排列,所以跟AbstractImmutableSet的顺序一致。

    List接口

      List是有序的集合。java.util.List接口实现了Collection接口,除了Collection接口的方法之外,还有以下常用的方法:

      1.E get(int index):获取指定位标的元素。

      2.E set(int index, E element):为指定位标的元素重新赋值,返回原来的值。

      3.void add(int index, E element):在指定位标中添加元素。

      4.E remove(int index):删除指定位标的元素。

      5.int indexOf(Object o):获取指定元素在List中第一个位标。

      6.int lastIndexOf(Object o):获取指定元素在List中最后一个位标。

      7.ListIterator<E> listIterator():获取ListIterator对象。

      8.List<E> subList(int fromIndex, int toIndex):截取List中[fromIndex, toIndex)之间的元素,创建一个新的List。

      常用的List实现类有:

      ArrayList:将元素存放在数组中。访问和删除性能较好。

      LinkedList:将元素存放在链表中。插入性能较好。

     1 @Test
     2 void testList() {
     3     List<String> list = List.of("Anna", "Bob", "Namy", "Nancy");
     4     ArrayList<String> arrayList = new ArrayList<String>(list);
     5     LinkedList<String> linkedList = new LinkedList<String>(list);
     6 
     7     long start, end;
     8     // 测试访问时间
     9     start = System.nanoTime();
    10     arrayList.get(2);
    11     end = System.nanoTime();
    12     System.out.println("ArrayList访问元素运行时间:" + (end - start) + "ns");
    13     start = System.nanoTime();
    14     linkedList.get(2);
    15     end = System.nanoTime();
    16     System.out.println("LinkedList访问元素运行时间:" + (end - start) + "ns");
    17     // 测试插入时间
    18     start = System.nanoTime();
    19     arrayList.add("David");
    20     end = System.nanoTime();
    21     System.out.println("ArrayList插入元素运行时间:" + (end - start) + "ns");
    22     start = System.nanoTime();
    23     linkedList.add("David");
    24     end = System.nanoTime();
    25     System.out.println("LinkedList插入元素运行时间:" + (end - start) + "ns");
    26     // 测试删除时间
    27     start = System.nanoTime();
    28     arrayList.remove(0);
    29     end = System.nanoTime();
    30     System.out.println("ArrayList删除元素运行时间:" + (end - start) + "ns");
    31     start = System.nanoTime();
    32     linkedList.remove();
    33     end = System.nanoTime();
    34     System.out.println("LinkedList删除元素运行时间:" + (end - start) + "ns");
    35 }
    testList

      输出结果:

       

      可以看到:ArrayList访问元素和删除元素的速度要比LinkedList快;而插入元素的速度则比LinkedList慢。

    Map接口

      Map是键值对的集合。一个键映射一个值,一个值可以由多个键映射。Map中不能包含重复的键。java.util.Map接口中定义了一个内部接口Entry,用于保存键值对信息。

      Map接口中常用的方法有:

      1.int size():获取Map的大小(Map中键值对个数)。

      2.boolean isEmpty():判断Map是否为空(Map中没有键值对)。

      3.boolean containsKey(Object key):判断Map中是否有指定键的键值对。

      4.boolean containsValue(Object value):判断Map中是否有指定值的键值对。

      5.V get(Object key):根据键获取值。

      6.V put(K key, V value):向Map中插入键值对,并返回键值对的键原先映射的值。

      7.V remove(Object key):删除指定键的键值对,并返回删除的键值对的值。

      8.void clear():清空Map。

      9.Set<K> keySet():获取Map中的所有键,返回一个Set对象。

      10.Collection<V> values():获取Map中的所有值,返回一个Collection对象。

      11.Set<Map.Entry<K, V>> entrySet():获取Map中所有键值对,返回一个Set对象。

      Entry接口中常用的方法有:

      1.K getKey():获取键。

      2.V getValue():获取值。

      3.V setValue(V value):设置值,返回原先的值。

      常用的Map实现类有:

      HashMap:键值对按键的哈希值排列。

      TreeMap:键值对按键的元素值排列。TreeMap存放的键值对的键的类型必须是可比较的,即对应类必须直接或间接实现Comparable接口。

      LinkedHashMap:键值对按插入顺序排列。

     1 @Test
     2 void testMap() {
     3     Map<String, Integer> map = Map.ofEntries(Map.entry("Anna", 1), Map.entry("Bob", 2), Map.entry("Namy", 3), Map.entry("Nancy", 4));
     4     System.out.println(map);
     5     HashMap<String, Integer> hashMap = new HashMap<String, Integer>(map);
     6     System.out.println(hashMap);
     7     TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>(map);
     8     System.out.println(treeMap);
     9     LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>(map);
    10     System.out.println(linkedHashMap);
    11 
    12     // 测试Map的方法
    13     map = hashMap;
    14     System.out.println("Map的大小:" + map.size());
    15     System.out.println("Map是否为空:" + map.isEmpty());
    16     System.out.println("Map是否包含键”Anna“:" + map.containsKey("Anna"));
    17     System.out.println("Map是否包含值5:" + map.containsValue(5));
    18     System.out.println("Map中所有键:" + map.keySet());
    19     System.out.println("Map中所有值:" + map.values());
    20     System.out.println("Map中所有键值对:");
    21     for (Entry<?, ?> entry : map.entrySet()) {
    22         System.out.println(entry + "	key: " + entry.getKey() + "	value: " + entry.getValue());
    23     }
    24     map.clear();   // 清空Map
    25     System.out.println("Map是否为空:" + map.isEmpty());
    26     System.out.println("插入键值对:" + map.put("David", 5));
    27     System.out.println("获取键“David”的值:" + map.get("David"));
    28     System.out.println("删除键值对:" + map.remove("David"));
    29 }
    testMap

      输出结果:

      

    Collections类

      java.util.Collections类中提供了很多操作集合的方法。常用的有:

      1.static <T extends Comparable<? super T>> void sort(List<T> list):对List中的元素升序排列。

      2.static void reverse(List<?> list):将List中的元素反转。

      3.static void shuffle(List<?> list):将List中的元素排序随机打乱。

      4.static void swap(List<?> list, int i, int j):将List中指定的两个位标的元素交换。

      5.static <T> void fill(List<? super T> list, T obj):为List中的元素统一赋值。

      6.static <T> void copy(List<? super T> dest, List<? extends T> src):拷贝List。注意dest的大小不能小于src的大小。

        该方法与在创建对象时传入List的区别是:

        a.Collections.copy()方法是将dest中[0, src.size())的元素替换为src中相应的元素。也就是说,dest中[src.size(), dest.size())的元素不会发生改变,还是原先的值。

        b.在创建对象时传入List是将参数List中的元素都插入到创建完的List对象中。也就是说,创建完的List的大小与参数List的大小相同。

      7.static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll):获取Collection中最小的元素。

      8.static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll):获取Collection中最大的元素。

     1 @Test
     2 void testCollections() {
     3     List<Integer> list = new ArrayList<Integer>(List.of(3, 1, 2, 4, 7, 5, 8, 6, 9));
     4     System.out.println("原先的List:" + list);
     5     Collections.reverse(list);
     6     System.out.println("反转后的List:" + list);
     7     Collections.shuffle(list);
     8     System.out.println("打乱后的List:" + list);
     9     Collections.swap(list, 0, 8);
    10     System.out.println("将0号元素和8号元素交换:" + list);
    11     Collections.sort(list);
    12     System.out.println("升序排列后的List:" + list);
    13     System.out.println("List中的最小值:" + Collections.min(list));
    14     System.out.println("List中的最大值:" + Collections.max(list));
    15     List<Integer> l = new ArrayList<Integer>(Arrays.asList(new Integer[list.size()]));
    16     System.out.println("原先的l:" + l);
    17     Collections.fill(l, 3);
    18     System.out.println("填充值后的l:" + l);
    19     Collections.copy(l, list);
    20     System.out.println("复制后的l:" + l);
    21 }
    testCollections

      输出结果:

      

    不可变的集合

      JDK 9之后的版本新增了java.util.ImmutableCollections类,用来表示不可变的集合。不可变的集合指的是集合声明之后不能对其元素进行任何操作(插入、删除、重新赋值等),只能获取元素。该类中定义了AbstractImmutableSet、AbstractImmutableList和AbstractImmutableMap,分别对应Set、List和Map这三种集合。

      作为不可变的集合,AbstractImmutableSet、AbstractImmutableList和AbstractImmutableMap对象不能对其元素进行操作,所以在调用与元素操作相关的方法时,会抛出UnsupportedOperationException异常。

      JDK 9之后的版本在Set接口、List接口和Map接口中定义了创建不可变集合的方法,这些方法都是将传入的参数作为元素插入不可变集合中:

        Set接口:static <E> Set<E> of(E... elements)

        List接口:static <E> List<E> of(E... elements)

        Map接口:static <K, V> Map<K, V> ofEntries(Entry<? extends K, ? extends V>... entries)

                static <K, V> Entry<K, V> entry(K k, V v)

      JDK 10之后的版本在Set接口、List接口和Map接口中又定义了新的创建不可变集合的方法,这些方法是将传入的集合中的元素插入不可变集合中:

        Set接口:static <E> Set<E> copyOf(Collection<? extends E> coll)

        List接口:static <E> List<E> copyOf(Collection<? extends E> coll)

        Map接口:static <K, V> Map<K, V> copyOf(Map<? extends K, ? extends V> map)

  • 相关阅读:
    POJ 1502 MPI Maelstrom
    BNUOJ4359 无爱编号
    BNUOJ 6727 Bone Collector
    SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考
    聊聊C语言和ABAP
    小技巧:不用任何媒体处理软件进行视频压缩
    如何处理Docker错误消息:please add——insecure-registry
    如何处理Docker的错误消息request canceled:Docker代理问题
    推荐一个高大上的网易云音乐命令行播放工具:musicbox
    Windows下使用python库 curses遇到错误消息的解决方案
  • 原文地址:https://www.cnblogs.com/lqkStudy/p/11192332.html
Copyright © 2011-2022 走看看