Java基础之集合框架系列(五)

Java集合框架是什么?说出一些集合框架的优点? 干货太重,且文字比较多。需要花费时间与耐心细细咀嚼,但是真的能收获到很多。 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。 1... 阅读详情

1.集合工具类概述

2.Collections类

专门对集合进行操作的工具类,里面全都是静态方法,可以直接调用。

1.排序

使用场景:List系列集合可以存储相同的元素,但是无法进行排序,这时就可以使用Collelctions的静态方法进行排序操作

static <T extends Comparable<? super T>> void sort(List<T>list)
根据元素的自然顺序,对指定列表按升序进行排序。

说明:使用以上排序方法时,要求被比较的元素必须实现comparable接口

static <T> void sort(List<T> list, Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序。

说明:使用以上排序方法时,不要求被比较的元素实现comparable接口,因为排序方式可以在比较器Comparator中进行规定。

示例代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

//自定义比较器-根据字符串长度进行排序
class StrLenComp implements Comparator<String>{

    @Override
    public int compare(String o1, String o2) {
        if(o1.length()>o2.length())
            return 1;
        if(o1.length()==o2.length())
            return o1.compareTo(o2);//当字符串长度相等时将自然顺序作为排序依据
        else
            return -1;
    }

}

//测试用类
public class CollectionsDemo {

    public static void main(String[] args) {
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);

        //使用工具类中的方法对List进行自然排序
        Collections.sort(al);
        System.out.println("自然排序后的集合:"+al);

        //使用工具类中的方法对List进行排序-按照字符串的长度
        Collections.sort(al, new StrLenComp());
        System.out.println("传入自定义比较器排序后的集合"+al);
    }

}

程序运行结果:

原始集合:[python, R, java, js, ruby]
自然排序后的集合:[R, java, js, python, ruby]
传入自定义比较器排序后的集合[R, js, java, ruby, python]

2.最值

static <T extends Object & Comparable<? super T>>
T max(Collection<? extends T> coll)
根据元素的自然顺序,返回给定 collection 的最大元素。

static <T extends Object & Comparable<? super T>>
T min(Collection<? extends T> coll)
根据元素的自然顺序 返回给定 collection 的最小元素。

说明:使用以上方法时,要求集合中的元素必须实现Comparable接口

static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
根据指定比较器产生的顺序,返回给定 collection 的最大元素。
static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp)
根据指定比较器产生的顺序,返回给定 collection 的最小元素。

说明:使用以上排序方法时,不要求被比较的元素实现comparable接口。因为排序方式可以在比较器中进行规定。

示例代码:

        //部分代码-本例中的自定义比较器与排序中的比较器类一致,此处省略
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);
        //根据元素的自然顺序,返回给定List的最大、最小元素。
        String maxStr=Collections.max(al);
        String minStr=Collections.min(al);

        System.out.println("自然顺序下的最大元素:"+maxStr);
        System.out.println("自然顺序下的最小元素:"+minStr);

        //根据指定比较器的排序依据,返回List中的最大、最小元素
        String maxStrByComp=Collections.max(al, new StrLenComp());
        String minStrByComp=Collections.min(al,new StrLenComp());

        System.out.println("按照比较器顺序获得的最大元素:"+maxStrByComp);
        System.out.println("按照比较器顺序获得的最小元素:"+minStrByComp);

程序运行结果:

原始集合:[python, R, java, js, ruby]
自然顺序下的最大元素:ruby
自然顺序下的最小元素:R
按照比较器顺序获得的最大元素:python
按照比较器顺序获得的最小元素:R

3.二分查找

static<T> int binarySearch(List<? extends Comparable<? super T>>list, T key)
使用二分搜索法搜索指定列表,以获得指定对象。被操作的List对象需要实现Comparable接口,即自身具备比较性。

static <T> int binarySearch(List<? extends T> list,
T key,Comparator<? super T> c)
使用二分搜索法搜索指定列表,以获得指定对象。被操作的List对象不必实现Comparable接口,但该方法需要传入一个比较器对象,即通过比较器对List集合中的元素进行排序。

方法说明:如果搜索的元素包含在List中,则返回搜索值的索引;否则返回 (-(插入点) - 1)。插入点被定义为将键插入列表的那一点,即第一个大于此键的元素索引。如果列表中的所有元素都小于指定的键,则为 list.size(),即插入点位于List尾部。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。

注意:以上方法只能查找List系列集合中的指定元素,因为使用二分法查找元素要求操作索引。并且操作的对象必须是先进行相应排序后的有序集合。

示例代码:

        //部分代码-本例中的自定义比较器与排序中的比较器类一致,此处省略
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);

        //对集合进行自然排序
        Collections.sort(al);
        System.out.println("自然排序后的集合:"+al);
        //使用二分查找法按照自然顺序查找List集合中的特定元素
        int existIndex=Collections.binarySearch(al,"js");
        int notExistindex=Collections.binarySearch(al,"javas");

        System.out.println("按自然顺序查找存在的特定元素:"+existIndex);
        System.out.println("按自然顺序查找不存在的特定元素:"+notExistindex);

        //对集合进行自定义比较器排序
        Collections.sort(al, new StrLenComp());
        System.out.println("传入自定义比较器排序后的集合"+al);
        //使用二分查找法按照自定义比较器顺序查找List集合的特定元素
        int existIndexByComp=Collections.binarySearch(al, "js", new StrLenComp());

        System.out.println("按照自定义比较器的顺序查找存在的元素:"+existIndexByComp);

程序运行结果:

原始集合:[python, R, java, js, ruby]
自然排序后的集合:[R, java, js, python, ruby]
按自然顺序查找存在的特定元素:2
按自然顺序查找不存在的特定元素:-3
传入自定义比较器排序后的集合[R, js, java, ruby, python]
按照自定义比较器的顺序查找存在的元素:1

4.元素互换

static void swap(List<?> list, int i, int j)
在指定列表的指定位置处交换元素。

示例代码:

        //部分代码
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);
        //交换集合中索引为1和3的两个元素
        Collections.swap(al, 1, 3);
        System.out.println("交换元素后的集合:"+al);

程序运行结果:

原始集合:[python, R, java, js, ruby]
交换元素后的集合:[python, js, java, R, ruby]

5.批量填充

static <T> void fill(List<? super T> list, T obj)
使用指定元素替换指定列表中的所有元素。

示例代码:

        //部分代码
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al); 
        //使用demo填充集合中的所有元素
        Collections.fill(al,"demo");
        System.out.println("经过填充后的集合:"+al);

程序运行结果:

原始集合:[python, R, java, js, ruby]
经过填充后的集合:[demo, demo, demo, demo, demo]

6.批量代替

static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
使用另一个值替换列表中出现的所有某一指定值。

示例代码:

        //部分代码
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al); 

        //将集合中的java替换为demo
        Collections.replaceAll(al, "java", "demo");
        System.out.println("经过代替后的集合:"+al);

程序运行结果:

原始集合:[python, R, java, js, ruby]
经过代替后的集合:[python, R, demo, js, ruby]

7.反转集合

static void reverse(List<?> list)
反转指定列表中元素的顺序。

示例代码:

        //部分代码
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);         
        //对集合进行反转
        Collections.reverse(al);
        System.out.println("反转后的集合:"+al);   

程序运行结果:

原始集合:[python, R, java, js, ruby]
反转后的集合:[ruby, js, java, R, python]

8.反转比较器

static <T> Comparator<T> reverseOrder()
返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。
static<T> Comparator<T> reverseOrder(Comparator<T>cmp)
返回一个比较器,它强行逆转指定比较器的顺序。

示例代码:

        //部分代码
        //新建装载String对象的TreeSet数组
        TreeSet<String> ts=new TreeSet<String>();
        ts.add("python");
        ts.add("java");
        ts.add("js");
        ts.add("R");
        ts.add("ruby");
        System.out.println("原始集合:"+ts);

        //新建传入逆向自然顺序比较器的TreeSet
        TreeSet<String> reTs=new TreeSet<String>(Collections.reverseOrder());
        reTs.add("python");
        reTs.add("java");
        reTs.add("js");
        reTs.add("R");
        reTs.add("ruby");
        System.out.println("传入逆向比较器的集合:"+reTs); 

程序运行结果:

原始集合:[R, java, js, python, ruby]
传入逆向比较器的集合:[ruby, python, js, java, R]

9.随机置换

即随机打乱集合的顺序:

static void shuffle(List<?> list)
使用默认随机源对指定列表进行置换。
static void shuffle(List<?> list, Random rnd)
使用指定的随机源对指定列表进行置换。

示例代码:

        //部分代码
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);                 
        //对集合进行随机置换
        Collections.shuffle(al);
        System.out.println("随机置换后的集合:"+al); 
        //再次对集合进行随机置换
        Collections.shuffle(al);
        System.out.println("再次随机置换后的集合:"+al);       

程序运行结果:

原始集合:[python, R, java, js, ruby]
随机置换后的集合:[ruby, java, js, R, python]
再次随机置换后的集合:[java, python, ruby, js, R]

10.集合线程安全性

static <T> Collection<T>
synchronizedCollection(Collection<T> c)
返回指定 collection 支持的同步collection(线程安全的)。

static <T> List<T>
synchronizedList(List<T> list)
返回指定List支持的同步List(线程安全的)。

static <K,V> Map<K,V>
synchronizedMap(Map<K,V> m)
返回由指定Map支持的同步Map(线程安全的)。

static <T> Set<T> synchronizedSet(Set<T> s)
返回指定 Set 支持的同步Set(线程安全的)。

说明:将非线程同步的集合对象转换为线程同步的集合返回,使得集合的线程安全性问题得到解决。

3.Arrays类

用于操作数组的工具类,里面全是静态方法,可以直接调用。

1.相关方法

static <T> List<T> asList(T… a)
返回一个受指定数组支持的固定大小的列表。


二分查找:

static int binarySearch(byte[] a, byte key)
使用二分搜索法来搜索指定的 byte 型数组,以获得指定的值。
static int binarySearch(byte[] a, int fromIndex, int toIndex, byte key)
使用二分搜索法来搜索指定的 byte 型数组的范围,以获得指定的值。
static int binarySearch(char[] a, char key)
使用二分搜索法来搜索指定的 char 型数组,以获得指定的值。
static int binarySearch(char[] a, int fromIndex, int toIndex, char key)
使用二分搜索法来搜索指定的 char 型数组的范围,以获得指定的值。
static int binarySearch(double[] a, double key)
使用二分搜索法来搜索指定的 double 型数组,以获得指定的值。
static int binarySearch(double[] a, int fromIndex, int toIndex, double key)
使用二分搜索法来搜索指定的 double 型数组的范围,以获得指定的值。
static int binarySearch(float[] a, float key)
使用二分搜索法来搜索指定的 float 型数组,以获得指定的值。
static int binarySearch(float[] a, int fromIndex, int toIndex, float key)
使用二分搜索法来搜索指定的 float 型数组的范围,以获得指定的值。
static int binarySearch(int[] a, int key)
使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。
static int binarySearch(int[] a, int fromIndex, int toIndex, int key)
使用二分搜索法来搜索指定的 int 型数组的范围,以获得指定的值。
static int binarySearch(long[] a, int fromIndex, int toIndex, long key)
使用二分搜索法来搜索指定的 long 型数组的范围,以获得指定的值。
static int binarySearch(long[] a, long key)
使用二分搜索法来搜索指定的 long 型数组,以获得指定的值。
static int binarySearch(Object[] a, int fromIndex, int toIndex, Object key)
使用二分搜索法来搜索指定数组的范围,以获得指定对象。
static int binarySearch(Object[] a, Object key)
使用二分搜索法来搜索指定数组,以获得指定对象。
static int binarySearch(short[] a, int fromIndex, int toIndex, short key)
使用二分搜索法来搜索指定的 short 型数组的范围,以获得指定的值。
static int binarySearch(short[] a, short key)
使用二分搜索法来搜索指定的 short 型数组,以获得指定的值。
static<T> int
binarySearch(T[] a, int fromIndex, int toIndex, T key, Comparator<? super T> c)
使用二分搜索法来搜索指定数组的范围,以获得指定对象。
static <T> int
binarySearch(T[] a, T key, Comparator<? super T> c)
使用二分搜索法来搜索指定数组,以获得指定对象。


数组复制:

static boolean[] copyOf(boolean[] original, int newLength)
复制指定的数组,截取或用 false 填充(如有必要),以使副本具有指定的长度。
static byte[] copyOf(byte[] original, int newLength)
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
static char[] copyOf(char[] original, int newLength)
复制指定的数组,截取或用 null 字符填充(如有必要),以使副本具有指定的长度。
static double[] copyOf(double[] original, int newLength)
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
static float[] copyOf(float[] original, int newLength)
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
static int[] copyOf(int[] original, int newLength)
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
static long[] copyOf(long[] original, int newLength)
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
static short[] copyOf(short[] original, int newLength)
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
static <T> T[]
copyOf(T[] original, int newLength)
复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度。
static <T,U> T[]
copyOf(U[] original, int newLength, Class<? extends T[]> newType)
复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度。


数组范围复制:

static boolean[] copyOfRange(boolean[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
static byte[] copyOfRange(byte[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
static char[] copyOfRange(char[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
static double[] copyOfRange(double[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
static float[] copyOfRange(float[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
static int[] copyOfRange(int[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
static long[] copyOfRange(long[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
static short[] copyOfRange(short[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
static<T> T[]
copyOfRange(T[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。
static<T,U> T[]
copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType)
将指定数组的指定范围复制到一个新数组。


数组比较:

static boolean deepEquals(Object[] a1, Object[] a2)
如果两个指定数组彼此是深层相等 的,则返回 true。
static int deepHashCode(Object[] a)
基于指定数组的“深层内容”返回哈希码。
static String deepToString(Object[] a)
返回指定数组“深层内容”的字符串表示形式。
static boolean equals(boolean[] a, boolean[] a2)
如果两个指定的 boolean 型数组彼此相等,则返回 true。
static boolean equals(byte[] a, byte[] a2)
如果两个指定的 byte 型数组彼此相等,则返回 true。
static boolean equals(char[] a, char[] a2)
如果两个指定的 char 型数组彼此相等,则返回 true。
static boolean equals(double[] a, double[] a2)
如果两个指定的 double 型数组彼此相等,则返回 true。
static boolean equals(float[] a, float[] a2)
如果两个指定的 float 型数组彼此相等,则返回 true。
static boolean equals(int[] a, int[] a2)
如果两个指定的 int 型数组彼此相等,则返回 true。
static boolean equals(long[] a, long[] a2)
如果两个指定的 long 型数组彼此相等,则返回 true。
static boolean equals(Object[] a, Object[] a2)
如果两个指定的 Objects 数组彼此相等,则返回 true。
static boolean equals(short[] a, short[] a2)
如果两个指定的 short 型数组彼此相等,则返回 true。


填充数组:

static void fill(boolean[] a, boolean val)
将指定的 boolean 值分配给指定 boolean 型数组的每个元素。
static void fill(boolean[] a, int fromIndex, int toIndex, boolean val)
将指定的 boolean 值分配给指定 boolean 型数组指定范围中的每个元素。
static void fill(byte[] a, byte val)
将指定的 byte 值分配给指定 byte 节型数组的每个元素。
static void fill(byte[] a, int fromIndex, int toIndex, byte val)
将指定的 byte 值分配给指定 byte 型数组指定范围中的每个元素。
static void fill(char[] a, char val)
将指定的 char 值分配给指定 char 型数组的每个元素。
static void fill(char[] a, int fromIndex, int toIndex, char val)
将指定的 char 值分配给指定 char 型数组指定范围中的每个元素。
static void fill(double[] a, double val)
将指定的 double 值分配给指定 double 型数组的每个元素。
static void fill(double[] a, int fromIndex, int toIndex, double val)
将指定的 double 值分配给指定 double 型数组指定范围中的每个元素。
static void fill(float[] a, float val)
将指定的 float 值分配给指定 float 型数组的每个元素。
static void fill(float[] a, int fromIndex, int toIndex, float val)
将指定的 float 值分配给指定 float 型数组指定范围中的每个元素。
static void fill(int[] a, int val)
将指定的 int 值分配给指定 int 型数组的每个元素。
static void fill(int[] a, int fromIndex, int toIndex, int val)
将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。
static void fill(long[] a, int fromIndex, int toIndex, long val)
将指定的 long 值分配给指定 long 型数组指定范围中的每个元素。
static void fill(long[] a, long val)
将指定的 long 值分配给指定 long 型数组的每个元素。
static void fill(Object[] a, int fromIndex, int toIndex, Object val)
将指定的 Object 引用分配给指定 Object 数组指定范围中的每个元素。
static void fill(Object[] a, Object val)
将指定的 Object 引用分配给指定 Object 数组的每个元素。
static void fill(short[] a, int fromIndex, int toIndex, short val)
将指定的 short 值分配给指定 short 型数组指定范围中的每个元素。
static void fill(short[] a, short val)
将指定的 short 值分配给指定 short 型数组的每个元素。


获取哈希码:

static int hashCode(boolean[] a)
基于指定数组的内容返回哈希码。
static int hashCode(byte[] a)
基于指定数组的内容返回哈希码。
static int hashCode(char[] a)
基于指定数组的内容返回哈希码。
static int hashCode(double[] a)
基于指定数组的内容返回哈希码。
static int hashCode(float[] a)
基于指定数组的内容返回哈希码。
static int hashCode(int[] a)
基于指定数组的内容返回哈希码。
static int hashCode(long[] a)
基于指定数组的内容返回哈希码。
static int hashCode(Object[] a)
基于指定数组的内容返回哈希码。
static int hashCode(short[] a)
基于指定数组的内容返回哈希码。


数组排序:
static void sort(byte[] a)
对指定的 byte 型数组按数字升序进行排序。
static void sort(byte[] a, int fromIndex, int toIndex)
对指定 byte 型数组的指定范围按数字升序进行排序。
static void sort(char[] a)
对指定的 char 型数组按数字升序进行排序。
static void sort(char[] a, int fromIndex, int toIndex)
对指定 char 型数组的指定范围按数字升序进行排序。
static void sort(double[] a)
对指定的 double 型数组按数字升序进行排序。
static void sort(double[] a, int fromIndex, int toIndex)
对指定 double 型数组的指定范围按数字升序进行排序。
static void sort(float[] a)
对指定的 float 型数组按数字升序进行排序。
static void sort(float[] a, int fromIndex, int toIndex)
对指定 float 型数组的指定范围按数字升序进行排序。
static void sort(int[] a)
对指定的 int 型数组按数字升序进行排序。
static void sort(int[] a, int fromIndex, int toIndex)
对指定 int 型数组的指定范围按数字升序进行排序。
static void sort(long[] a)
对指定的 long 型数组按数字升序进行排序。
static void sort(long[] a, int fromIndex, int toIndex)
对指定 long 型数组的指定范围按数字升序进行排序。
static void sort(Object[] a)
根据元素的自然顺序对指定对象数组按升序进行排序。
static void sort(Object[] a, int fromIndex, int toIndex)
根据元素的自然顺序对指定对象数组的指定范围按升序进行排序。
static void sort(short[] a)
对指定的 short 型数组按数字升序进行排序。
static void sort(short[] a, int fromIndex, int toIndex)
对指定 short 型数组的指定范围按数字升序进行排序。
static <T> void
sort(T[] a, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组进行排序。
static <T> void
sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。


数组转化为字符串:

static String toString(boolean[] a)
返回指定数组内容的字符串表示形式。
static String toString(byte[] a)
返回指定数组内容的字符串表示形式。
static String toString(char[] a)
返回指定数组内容的字符串表示形式。
static String toString(double[] a)
返回指定数组内容的字符串表示形式。
static String toString(float[] a)
返回指定数组内容的字符串表示形式。
static String toString(int[] a)
返回指定数组内容的字符串表示形式。
static String toString(long[] a)
返回指定数组内容的字符串表示形式。
static String toString(Object[] a)
返回指定数组内容的字符串表示形式。
static String toString(short[] a)
返回指定数组内容的字符串表示形式。

2.数组变为字符串

static String toString(int[] a)
返回指定数组内容的字符串表示形式。

示例代码:

        //部分代码
        int[] numStr={2,15,48,95};
        //通过Arrays中的静态方法将数组转化为字符串
        String strNum=Arrays.toString(numStr);
        System.out.println(numStr);
        System.out.println(strNum);

程序运行结果:

[I@139a55
[2, 15, 48, 95]

说明:以上代码演示了将int型数组转化为String字符串的操作。其他的类型的数组转化与之类似。

3.数组变为集合

static <T> List<T> asList(T… a)
返回一个受指定数组支持的固定大小的List。

注意:通过这个方法转化后的集合不可以使用增删方法,因为数组的长度是固定的,获取到的List也是固定大小的。

这样做的好处:可以使用操作集合的方法来对数组进行操作,可以避免手动封装相关操作造成的麻烦。

示例代码:

        //部分代码
        String[] strArr={"python","ruby","java","js"};
        //通过Arrays中的静态方法将数组转化为集合
        List<String> strList=Arrays.asList(strArr);
        System.out.println("集合的元素个数为:"+strList.size());
        //通过迭代器对集合中的元素进行取出
        Iterator<String> it=strList.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

程序运行结果:

集合的元素个数为:4
python
ruby
java
js

特殊情况:

        //部分代码
        int[] numStr={2,15,48,95};
        List<int[]> numList=Arrays.asList(numStr);
        System.out.println("集合中的元素个数:"+numList.size());
        System.out.println(numList);

程序运行结果:

集合中的元素个数:1
[[I@139a55]

说明:如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的一个元素存在(如上例中的int数组)。如果数组中的元素都是对象,那么转化为集合时,数组中的元素就直接转化为集合中的元素。

如果想要将数组中的基本数据分别作为一个元素存入List集合中,则需要使用基本数据类型的包装类。

改进的方法:将基本类型数组改为其包装类对象数组

改进后的代码:

        //部分代码
        Integer[] numArr={2,15,48,95};//自动装箱
        List<Integer> numList=Arrays.asList(numArr);
        System.out.println("集合中的元素个数:"+numList.size());
        System.out.println(numList);

程序运行结果:

集合中的元素个数:4
[2, 15, 48, 95]

4.集合转成数组

使用Collection接口中的toArray方法

Object[] toArray()
返回包含此 collection 中所有元素的数组。

<T> T[] toArray(T[] a)
返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

说明:当指定类型的数组长度小于集合长度时,该方法内部会创建一个新的数组,其长度等于集合的长度;当指定类型的数组长度大于集合长度时,就不会创建新的数组了,而是使用传递进来的数组,且对多余的部分使用null进行填充。因此,建议将传入的数组长度设置为集合的长度。

示例代码:

        //部分代码
        //新建ArrayList集合
        ArrayList<String> al = new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");
        System.out.println("原始集合:" + al);               

        //通过List集合的toArray()方法将集合转化为数组
        String[] strArr=al.toArray(new String[al.size()]);
        System.out.println(strArr.length);
        //对集合进行循环输出
        for(int i=0;i<strArr.length;i++)
            System.out.println(strArr[i]);

程序运行结果:

原始集合:[python, R, java, js, ruby]
5
python
R
java
js
ruby

为什么要将集合转化为数组?
这样做实际上是为了限定集合使用者对元素的操作,一般这就代表着不需要或不建议使用者对集合进行增删操作。


相关阅读:
菜鸟猿大战Java之集合框架系列(一)
菜鸟猿大战Java之集合框架系列(二)
菜鸟猿大战Java之集合框架系列(三)
菜鸟猿大战Java之集合框架系列(四)

Java基础知识之什么是集合框架 Java基础知识之什么是集合框架,Java基础知识之集合Collection概述,前面的文章,我们已经学习了Java的一些基础知识,比如泛型、注解等等内容,接着本博客继续学习Java中一个很常见的内容,集合。Java Collections 框架由接口和类组成,集合框架是用于存储数据和操作一组对象的统一架构 阅读详情

相关推荐

logisim实验——通过2个半加器实现1-bit全加器,通过4个一位全加器构成4-bit加法器(详解)

一、由异或门和与门所构成的半加器: 二、由两个半加器构成的1-bit全加器: ..

zep 1万+

Java数据结构学习—Collections类

java.util 类 Collections java.lang.Object java.util.Collections public class Collectionsextends Object 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装

技术何 782

Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感

Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感

冲击10w 1万+

Java Collections常用方法

方法 描述 static <T> boolean addAll(Collection<? super T> c, T… elements) 将所有指定的元素添加到指定的集合中。 static <T> Queue<T> asLifoQueue(Deque<T> deque) 以后进Deque先出(Lifo)的形式 返回a...

书香水墨 426

华为P30/pro (ELE-AL00) 鸿蒙4.2降级 EMUI 9

分享

m0_52356707的博客 1万+

手把手教你用Cadence Virtuoso仿真一个5GHz CMOS分频器:从原理图到后仿,避开那些教科书上没写的坑

本文详细介绍了在Cadence Virtuoso环境中设计5GHz CMOS分频器的完整流程,从原理图设计到后仿真优化,特别关注实际工程中容易被忽视的关键问题。内容涵盖分频器核心指标解析、锁存器拓扑选择、接口设计匹配以及后仿真优化策略,为射频集成电路设计提供实用避坑指南。

weixin_26934905的博客 263

Collections集合工具的总结

Collections是一个操作List,Set和Map集合的工具类: 增加元素: static <T> boolean addAll(Collection<? super T> c, T... elements) 将所有指定的元素添加到指定的集合。 List<Integer> list = new ArrayList<>(); Collec...

a137771035的博客 292

Android-音频配置文件详解

前言:   Android P 引入了一种新的音频政策配置文件格式 (XML),用于描述音频拓扑。新的 XML 文件支持定义输出输入流配置文件、可用于播放和捕获的设备以及音频属性的数量和类型。但是每个项目的代码里面都有很多音频配置文件,具体使用的是哪个文件呢?本文将详细讲述。 1. 查看运行时具体使用的xml adb shell dumpsys media.audio_policy | grep -iE "Config source:" 结果如下: Config source: /vendor

cheriyou_的博客 3947

功能强大-Collections

import java.util.*; public class Practice_1 { public static <K, V> void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("ab...

djv13876的博客 131

lvgl 实现表格table,并且固定表头

嵌入式实现table,lvgl 实现原生表格table组件

m0_61704502的博客 1273

电能质量仿真:电能质量改善措施仿真_(12).电能质量改善措施综合仿真案例

假设我们有一个微电网系统,该系统包含分布式电源(如光伏板、风力发电机)、储能设备、负荷和电网连接。电压波动:由于负荷的波动和分布式电源的间歇性输出,系统电压出现了不稳定的情况。谐波污染:非线性负荷和逆变器的运行导致系统中出现了显著的谐波污染。频率偏差:分布式电源的波动和负荷的突变导致系统频率出现了偏差。我们需要通过仿真来评估这些问题的影响,并提出相应的改善措施。

2401_87715305的博客 1360

Java基础(十九):集合框架

Set接口是Collection的子接口,Set接口相较于Collection接口没有提供额外的方法Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败Set集合支持的遍历方式和Collection集合一样:foreach和IteratorSet的常用实现类有:HashSet、TreeSet、LinkedHashSetHashSet 是 Set 接口的主要实现类,大多数时候使用 Set 集合时都使用这个实现类。

java开发 3963

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 110

【JavaSE系列】Java集合框架之Collection,Map接口

本篇文章带大家认识Java基础知识——集合框架,从本篇文章开始正式拉开数据结构的序幕,要深入了解一件事,那必然先得见个面,本文带大家认识Java集合框长什么样,以及怎么使用Collection和Map接口。

未见花闻的博客 1832

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java集合框架源码详解系列(一)

之前写过关于 C++ STL 的四篇文章,现在开始写一下关于Java集合框架的文章,该系列博客将会写很长时间。不管是C++的STL也好,Java的集合框架也好,这两者其实都是将一些基本的数据结构进行了封装实现,从现在开始博主将带领大家遨游在Java集合框架的源码世界,准备好了吗?Go!!!

晴空๓ 4307

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java 集合框架 基础 总结 - lenyan

在 Java 编程中,集合框架是一个非常重要的部分,它提供了一组用于存储、操作和处理数据的类和接口。集合框架可以大大简化我们处理数据集合的工作,提高编程效率和代码质量。本文将对 Java 集合框架的基础内容进行总结,包括常见的集合类型、接口及其特点、常用方法等。Java 集合框架位于java.utilCollectionMap和Iterator。Collection是一个用来存储一组对象的接口,它有几个重要的子接口,如ListSet和Queue。Map则是用于存储键值对的数据结构。Iterator。

lenyan~的博客 1324

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java基础系列八 集合框架

集合概念 Iterable接口-Collection接口-List接口:LinkedList类、ArrayList类,Set接口:HashSet类、TreeSet类,Map接口:HashMap类、TreeMap类,Iterator接口 与 ListIterator接口

653

Java集合框架全面详解

集合框架是一个统一的架构,用于表示和操作集合,使集合能够独立于其实现细节进行操作。Java集合框架提供了一系列接口和类,用于存储、检索、操作和传输数据对象。尽管Java集合框架提供了丰富的实现,但有时您可能需要创建自定义的集合类。扩展现有集合类@Override@Override实现集合接口size = 0;@Override@Override@Override// 省略其他必要的方法实现...使用组合而非继承@Override。

qq_38830315的博客 2211

Java集合系列详解

一,集合简介 Java中的集合可以分为四种体系: List:代表有序、重复的集合 Set:代表无序、不可重复的集合 Map:代表具有映射关系的集合 Queue:体系集合,代表一种队列集合实现 二,Java集合类的关系 Java中的集合类主要有两个接口派生:Collection和Map Collection类图如下: Map类图如下: 三,Collection接口 1,Set体系 Set是一种...

wang_yong_hui_1234的博客 5990

[ Java 基础系列 ]很详细很详细的 Java 集合框架教程!

新手引导 集合在我们日常开发使用的次数数不胜数,ArrayList/LinkedList/HashMap/HashSet······信手拈来,抬手就拿来用,在IDE上龙飞凤舞,但是作为一名合格的优雅的程序猿,仅仅了解怎么使用API是远远不够的,如果在调用API时,知道它内部发生了什么事情,就像开了透视外挂一样,洞穿一切,这种感觉才真的爽,而且这样就不是集合提供什么功能给我们使用,而是我们选择使用它的什么功能了。 集合框架总览 下图堪称集合框架的上帝视角,讲到集合框架不得不看的就是这幅图,当然,你会觉得眼花

欢迎来到「小菠萝」的博客 625

Java集合框架解析:从基础到底层源码

单线程环境快速查询:ArrayList/HashMap频繁增删:LinkedList需要排序:TreeSet/TreeMap高并发场景读多写少:CopyOnWriteArrayList写多读少:ConcurrentHashMap严格一致性:Collections.synchronized系列函数式编程使用Stream API进行链式处理优先选择不可变集合(Guava/Java9+)彩蛋知识点。

Hello World!你好世界! 2866

Java21下的 Java 集合框架

本文深入解析Java集合框架的核心概念、体系结构与常用方法,涵盖Collection接口的通用操作、迭代器遍历及Java21新增的SequencedCollection接口,通过代码示例演示集合的增删改查、反转与遍历技巧,助你掌握高效数据管理与操作。

m0_73941339的博客 1678

Java基础08-集合框架—单列集合

TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方式来指定比较规则。方式一:让自定义的类( 如学生类)实现Comparable接口,重写里面的compareTo方法来指定比较规则。方式二:通过调用TreeSet集合有参数构造器,可以设置Comparator对象( 比较器对象,用于指定比较规则。//学生类(通过实现 Comparable 接口来自定义规则)//重写compareTo方法实现安装规则排序@Override。

qq_57340195的博客 1008

Java集合框架解析

Java集合框架(Java Collections Framework, JCF)位于java.utilCollection:单列数据集合的根接口List:有序可重复集合Set:无序不可重复集合Queue:队列集合Map:双列键值对集合Iterator:集合遍历接口。

qq_45351273的博客 2058

Java基础系列文章-集合框架体系

坚持最初的梦想,年轻没有失败。

相信自己有能力,那么你就真的会有! 891
上一篇: java知识点之静态导入
下一篇: Java基础之常用对象(一)
CodingEnding
博客等级 码龄11年 86粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值