欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中Array、List、Map相互轉換的方法詳解

 更新時間:2023年08月25日 10:56:23   作者:流蘇打  
這篇文章主要介紹了Java中Array、List、Map相互轉換的方法詳解,在實際項目開發(fā)中或者一些算法面試題目中經常需要用到Java中這三種類型的相互轉換,比如對于一個整型數(shù)組中尋找一個整數(shù)與所給的一個整數(shù)值相同,需要的朋友可以參考下

引言

在實際項目開發(fā)中或者一些算法面試題目中經常需要用到Java中這三種類型的相互轉換,比如對于一個整型數(shù)組中尋找一個整數(shù)與所給的一個整數(shù)值相同,正常情況下第一反應會想到用for循環(huán)直接遍歷這個數(shù)組就可以實現(xiàn),不過這種情況下時間復雜度將會是O(n),空間復雜度是O(1)。

如果再多加幾個條件還使用多層for循環(huán)嵌套的話也可以實現(xiàn),不過時間復雜度將會以指數(shù)級增長。

我們可以說多層for循環(huán)嵌套可以實現(xiàn)功能,但就執(zhí)行時間來說,它絕不會是一個好的解決方法。那么如何降低時間復雜度呢,這個時候我們可以考慮一下將這個整型數(shù)組轉換為一個Map,因為Map是以key,value鍵值對形式存儲,value允許重復,但是key不允許重復。

使用Map中map.containsKey()方法可以輕松實現(xiàn)對于key是否存在一個值的查找,此種方法時間復雜度為O(1),空間復雜度為O(n),其中 n是數(shù)組中的元素數(shù)量,主要為哈希表的開銷。

這就降低了方法的執(zhí)行時間,算是一種算法上的優(yōu)化。

補充

一個好的算法要求正確性、可讀性、健壯性、時間效率高而且空間使用率低、簡單性。

算法的復雜度分為時間復雜度和空間復雜度。

時間復雜度:

時間復雜度實際上是一個函數(shù),代表基本操作重復執(zhí)行的次數(shù),進而分析函數(shù)雖變量的變化來確定數(shù)量級,數(shù)量級用O表示,如O(1),O(n),O(n^2)等。

空間復雜度:

是對一個算法在運行過程中臨時占用存儲空間的度量,一個算法在計算機存儲器上所占用的存儲空間包括存儲算法本身所占用的空間,算數(shù)和輸入輸出所占用的存儲空間以及臨時占用存儲空間三個部分,算法的輸入輸出數(shù)據(jù)所占用的存儲空間是由待解決的問題來決定的,通過參數(shù)表由調用函數(shù)而來,它隨本算法的不同而改變,存儲算法本身所占用的存儲空間有算法的書寫長短成正比。算法在運行過程中占用的臨時空間由不同的算法決定。

時間復雜度與空間復雜度沒有必然聯(lián)系,但是也有以空間換時間或時間換空間,現(xiàn)今項目中一般要求效率,大部分需要降低執(zhí)行時間即降低時間復雜度,以空間換時間來提高效率。不過在這兩者之間取舍需要具體問題具體分析。

正文:

Array轉List:

有兩種方法可以將array轉為list,一種是使用Arrays.asList()方法直接轉換,不過此種方法的list長度固定,無法進行添加刪除操作。

另一種是使用for循環(huán)遍歷數(shù)組元素逐個添加進一個空的list中。

    /**
     * 方法一:使用Arrays.asList()方法將數(shù)組轉為list,不過此種方法有限制,返回的對象是Arrays的內部類
     * 對于轉換后的list操作仍然反映在原數(shù)組上,因此這個list是定長的,無法使用list的add()喝remove()方法
     */
    public static void array_list(String[] array){
       List<String> list = Arrays.asList(array);
        System.out.println("數(shù)組轉List 的第一種方法:"+list);
//        list.remove("李四");
//        list.add("劉六");
//        System.out.println(“修改后:”list);
    }
    /**
     * 方法二:正常情況下array轉換為list,使用for循環(huán)將數(shù)組中的元素逐個添加到一個空的list中
     */
    public static void array_list2(String[] array){
        List<String> list = new ArrayList<>();
        for (int i=0;i<array.length;i++){
                list.add(array[i]);
        }
        System.out.println("數(shù)組轉List 的第二種方法:"+list);
        list.remove("李四");
        list.add("劉六");
        System.out.println("修改后:"+list);
    }

List轉為Array:

使用list.toArray()將List直接轉換為Array

    //List轉Array
    public static void list_array(List<String> list){
        String[] array =list.toArray(new String[list.size()]);
        System.out.println("List轉數(shù)組:"+array);
    }

Array轉Map:

當數(shù)組是一維數(shù)組時,奇數(shù)位是key鍵,偶數(shù)位是value值。數(shù)組有奇數(shù)個元素時,舍棄最后一個元素。

    //Array轉Map
    /**
     *一維數(shù)組時,奇數(shù)位為key鍵,偶數(shù)位為value,如果有奇數(shù)個元素,最后一個舍掉
     */
    public static void array_map(String[] array) {
        Map map = MapUtils.putAll(new HashMap(),array);
        System.out.println("數(shù)組轉Map:"+map);
    }

當數(shù)組是二維數(shù)組時,可以看作兩個一維數(shù)組,使用ArrayUtils.toMap()方法轉換

    /**
     * 二維數(shù)組時,當成兩個一維數(shù)組,使用ArrayUtils.toMap()方法轉換
     */
    public static void array_map2(String[][] array2){
        Map map2 = ArrayUtils.toMap(array2);
        map2.put("南昌","江西");
        System.out.println("二維數(shù)組轉Map:"+map2);
    }

Map轉Array

Map只需要value值時,將Map的values轉為一維數(shù)組:

使用map.values().toArray()方法將map轉為object類型的數(shù)組,特定類型數(shù)組需要再次轉換。

    //Map轉Array
    /**
     *Map只需要value值時,將Map的values轉為一維數(shù)組
     *使用map.values().toArray()將map轉為object數(shù)組,如果想要轉為特定類型的數(shù)組需要再進一步轉換
     */
    public static void map_array(Map<Integer,String> map){
        Object[] obj =  map.values().toArray();
        /**
         * 第一種,使用Arrays.copyOf()方法將原數(shù)組內的元素拷貝到一個新的String類型的數(shù)組
         * Arrays.copyOf(原數(shù)組,復制的長度,指定轉換的類型)
         */
        String[] array = Arrays.copyOf(obj,obj.length,String[].class);
        System.out.println("Map轉Array的第一種方法:"+array);
        /**
         * 第二種方法,直接強制轉換數(shù)組為指定類型
         * 此處toArray()中的參數(shù)需要一個T[] a,new String[0]相當于開辟了一個長度為0的String[],并且指定了泛型。
         * 這里的用new String[0]只是為了指定函數(shù)的形參數(shù),最終返回的String[]的長度是由你的list存儲內容的長度決定了。
         * new String[0]就是起一個模板的作用,指定了返回數(shù)組的類型,0是為了節(jié)省空間,因為它只是為了說明返回的類型。
         * 因此list.toArray()方法中的參數(shù)也可以使用String[0]來指代
         */
        String[] array2 =map.values().toArray(new String[0]);
        System.out.println("Map轉Array的第二種方法:"+array2);
        /**
         * 第三種方法,使用Java8中Arrays.stream()方法,將對象數(shù)組轉為順序Stream,然后使用toArray方法將流的元素累積到新的字符串數(shù)組中
         * String[]::new 是Java8中新定義的一種寫法叫做方法引用,以下這種寫法是調用了構造器引用,為了生成一個String類型數(shù)組
         */
        String[] array3 = Arrays.stream(obj).toArray(String[]::new);
        System.out.println("Map轉Array的第三種方法:"+array3);
    }

Map需要保留key與value時,將Map轉為二維數(shù)組:

    /**
     * 第二種:使用for循環(huán)和迭代器遍歷這個map,將它的key與value逐個添加到一個定長的二維數(shù)組中
     */
        public static void map_array2(Map<Integer,String> map){
            if (map!=null && !map.isEmpty()){
                //以map的長度作為二維數(shù)組的長度,其中每個元素就是一個長度為2的小數(shù)組存放key與value
                Object[][] obj = new Object[map.size()][2];
                /**
                 * map.entrySet()是把HashMap類型的數(shù)據(jù)轉換成集合類型
                 * map.entrySet().iterator()是去獲得這個集合的迭代器,保存在iterator里面。
                 */
                Iterator iterator = map.entrySet().iterator();
               for(int i=0;i<map.size();i++){
                    Map.Entry entry = (Map.Entry) iterator.next();
                    Object key = entry.getKey();
                    Object value = entry.getValue();
                    obj[i][0] = key;
                    obj[i][1] = value;
                }
                System.out.println("Map轉為二維數(shù)組Array:"+obj);
            }
        }

List轉Map:

通常情況下我們從數(shù)據(jù)庫中獲取的都是多條數(shù)據(jù)的list,即多條指定對象格式數(shù)據(jù)來轉換Map。

這時候需要使用一個Student(int id,int age,String name,String sex)來輔助我們實現(xiàn)。

  //List轉Map
    /**
     *通常情況下我們都是充數(shù)據(jù)庫中查出一個具體對象多條數(shù)據(jù)的list,以下我們就使用一個Student類來輔助實現(xiàn)
     */
    public static void list_map(List<Student> studentList){
        //第一種方法:使用for循環(huán)遍歷list逐個插入map中
        Map<Integer,Object> map = new HashMap<>();
        for(Student student:studentList){
            map.put(student.getId(),student);
        }
        System.out.println("List轉Map的第一種方法:"+map);
        /**
         *  第二種方法,使用Java8中stream中的Collectors.toMap方法進行轉換。
         *  如果你的key鍵沒有設定唯一值,防止key鍵重復,使用Java8新特性中的lambda表達式來表示如果重復,后面就就會覆蓋
         */
        Map<Integer,String> map2 = studentList.stream().collect
                (Collectors.toMap(Student::getId,Student::getName,(key1,key2)->key2));
        System.out.println("List轉Map的第二種方法:"+map2);
    }

Map轉List:

Map中的value值轉List就直接轉換即可

    //Map轉List
    public static void map_list(Map<Integer,String> map){
        List<String> list = new ArrayList(map.values());
        System.out.println("Map轉List:"+list);
    }

完整工具類代碼:array_map_list

package com.example.demo.utils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.ArrayUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author zhangqianwei
 * @date 2021/9/6 15:38
 */
public class array_map_list {
    //Array、Map、List相互轉換
    public static void main(String[] args) {
        String[] array = {"張三","李四","王五"};
        //Array轉List
        array_list(array);
        array_list2(array);
        //List轉Array
        List<String> list = new ArrayList<>();
        list.add("手機");
        list.add("電腦");
        list.add("平板");
        list_array(list);
        //Array轉Map
        array_map(array);
        String[][] array2 = { { "南京", "江蘇" }, { "武漢", "湖北" },
                { "合肥", "安徽" }, { "杭州", "浙江" }, { "長沙", "湖南" } };
        array_map2(array2);
        //Map轉Array
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"一");
        map.put(2,"二");
        map.put(3,"三");
        map_array(map);
        map_array2(map);
        //List轉Map
        Student student = new Student();
        student.setId(1);
        student.setName("小張");
        student.setAge(18);
        student.setSex("男");
        Student student2 = new Student();
        student2.setId(2);
        student2.setName("小王");
        student2.setAge(19);
        student2.setSex("男");
        Student student3 = new Student();
        student3.setId(3);
        student3.setName("小李");
        student3.setAge(17);
        student3.setSex("女");
        List<Student> studentList = new ArrayList<>();
        studentList.add(student);
        studentList.add(student2);
        studentList.add(student3);
        list_map(studentList);
        //Map轉List
        map_list(map);
    }
    //數(shù)組Array轉List
    /**
     * 方法一:使用Arrays.asList()方法將數(shù)組轉為list,不過此種方法有限制,返回的對象是Arrays的內部類
     * 對于轉換后的list操作仍然反映在原數(shù)組上,因此這個list是定長的,無法使用list的add()喝remove()方法
     */
    public static void array_list(String[] array){
       List<String> list = Arrays.asList(array);
        System.out.println("數(shù)組轉List 的第一種方法:"+list);
//        list.remove("李四");
//        list.add("劉六");
//        System.out.println(“修改后:”list);
    }
    /**
     * 方法二:正常情況下array轉換為list,使用for循環(huán)將數(shù)組中的元素逐個添加到一個空的list中
     */
    public static void array_list2(String[] array){
        List<String> list = new ArrayList<>();
        for (int i=0;i<array.length;i++){
                list.add(array[i]);
        }
        System.out.println("數(shù)組轉List 的第二種方法:"+list);
        list.remove("李四");
        list.add("劉六");
        System.out.println("修改后:"+list);
    }
    //List轉Array
    public static void list_array(List<String> list){
        String[] array =list.toArray(new String[list.size()]);
        System.out.println("List轉數(shù)組:"+array);
    }
    //Array轉Map
    /**
     *一維數(shù)組時,奇數(shù)位為key鍵,偶數(shù)位為value,如果有奇數(shù)個元素,最后一個舍掉
     */
    public static void array_map(String[] array) {
        Map map = MapUtils.putAll(new HashMap(),array);
        System.out.println("數(shù)組轉Map:"+map);
    }
    /**
     * 二維數(shù)組時,當成兩個一維數(shù)組,使用ArrayUtils.toMap()方法轉換
     */
    public static void array_map2(String[][] array2){
        Map map2 = ArrayUtils.toMap(array2);
        map2.put("南昌","江西");
        System.out.println("二維數(shù)組轉Map:"+map2);
    }
    //Map轉Array
    /**
     * Map只需要value值時,將Map的values轉為一維數(shù)組
     *使用map.values().toArray()將map轉為object數(shù)組,如果想要轉為特定類型的數(shù)組需要再進一步轉換
     */
    public static void map_array(Map<Integer,String> map){
        Object[] obj =  map.values().toArray();
        /**
         * 第一種,使用Arrays.copyOf()方法將原數(shù)組內的元素拷貝到一個新的String類型的數(shù)組
         * Arrays.copyOf(原數(shù)組,復制的長度,指定轉換的類型)
         */
        String[] array = Arrays.copyOf(obj,obj.length,String[].class);
        System.out.println("Map轉Array的第一種方法:"+array);
        /**
         * 第二種方法,直接強制轉換數(shù)組為指定類型
         * 此處toArray()中的參數(shù)需要一個T[] a,new String[0]相當于開辟了一個長度為0的String[],并且指定了泛型。
         * 這里的用new String[0]只是為了指定函數(shù)的形參數(shù),最終返回的String[]的長度是由你的list存儲內容的長度決定了。
         * new String[0]就是起一個模板的作用,指定了返回數(shù)組的類型,0是為了節(jié)省空間,因為它只是為了說明返回的類型。
         * 因此list.toArray()方法中的參數(shù)也可以使用String[0]來指代
         */
        String[] array2 =map.values().toArray(new String[0]);
        System.out.println("Map轉Array的第二種方法:"+array2);
        /**
         * 第三種方法,使用Java8中Arrays.stream()方法,將對象數(shù)組轉為順序Stream,然后使用toArray方法將流的元素累積到新的字符串數(shù)組中
         * String[]::new 是Java8中新定義的一種寫法叫做方法引用,以下這種寫法是調用了構造器引用,為了生成一個String類型數(shù)組
         */
        String[] array3 = Arrays.stream(obj).toArray(String[]::new);
        System.out.println("Map轉Array的第三種方法:"+array3);
    }
    /**
     * 第二種:使用for循環(huán)和迭代器遍歷這個map,將它的key與value逐個添加到一個定長的二維數(shù)組中
     */
        public static void map_array2(Map<Integer,String> map){
            if (map!=null && !map.isEmpty()){
                //以map的長度作為二維數(shù)組的長度,其中每個元素就是一個長度為2的小數(shù)組存放key與value
                Object[][] obj = new Object[map.size()][2];
                /**
                 * map.entrySet()是把HashMap類型的數(shù)據(jù)轉換成集合類型
                 * map.entrySet().iterator()是去獲得這個集合的迭代器,保存在iterator里面。
                 */
                Iterator iterator = map.entrySet().iterator();
               for(int i=0;i<map.size();i++){
                    Map.Entry entry = (Map.Entry) iterator.next();
                    Object key = entry.getKey();
                    Object value = entry.getValue();
                    obj[i][0] = key;
                    obj[i][1] = value;
                }
                System.out.println("Map轉為二維數(shù)組Array:"+obj);
            }
        }
    //List轉Map
    /**
     *通常情況下我們都是充數(shù)據(jù)庫中查出一個具體對象多條數(shù)據(jù)的list,以下我們就使用一個Student類來輔助實現(xiàn)
     */
    public static void list_map(List<Student> studentList){
        //第一種方法:使用for循環(huán)遍歷list逐個插入map中
        Map<Integer,Object> map = new HashMap<>();
        for(Student student:studentList){
            map.put(student.getId(),student);
        }
        System.out.println("List轉Map的第一種方法:"+map);
        /**
         *  第二種方法,使用Java8中stream中的Collectors.toMap方法進行轉換。
         *  如果你的key鍵沒有設定唯一值,防止key鍵重復,使用Java8新特性中的lambda表達式來表示如果重復,后面就就會覆蓋
         */
        Map<Integer,String> map2 = studentList.stream().collect
                (Collectors.toMap(Student::getId,Student::getName,(key1,key2)->key2));
        System.out.println("List轉Map的第二種方法:"+map2);
    }
    //Map轉List
    public static void map_list(Map<Integer,String> map){
        List<String> list = new ArrayList(map.values());
        System.out.println("Map轉List:"+list);
    }
}

結果顯示:

到此這篇關于Java中Array、List、Map相互轉換的方法詳解的文章就介紹到這了,更多相關Java中集合的轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于java四舍五入方法的基礎學習

    關于java四舍五入方法的基礎學習

    這篇文章主要給大家介紹了關于java四舍五入方法的基礎學習,這是最近做算法題的時候碰到的這個問題,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • 淺析Java8新特性Lambda表達式和函數(shù)式接口

    淺析Java8新特性Lambda表達式和函數(shù)式接口

    Lambda表達式理解為是 一段可以傳遞的代碼。最直觀的是使用Lambda表達式之后不用再寫大量的匿名內部類,簡化代碼,提高了代碼的可讀性
    2017-08-08
  • 一文搞懂Java中的日期類

    一文搞懂Java中的日期類

    在程序的開發(fā)中我們經常會遇到日期類型的操作,Java對日期類型的操作提供了很好的支持。本文將通過示例來聊聊Java中日期類的使用,需要的可以參考一下
    2022-09-09
  • 如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id

    如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id

    這篇文章主要介紹了如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java實現(xiàn)斗地主最簡代碼實例

    Java實現(xiàn)斗地主最簡代碼實例

    在本篇文章里小編給各位分享的是關于Java實現(xiàn)斗地主最簡代碼實例,有興趣的朋友們可以參考下。
    2020-05-05
  • springboot簡單接入websocket的操作方法

    springboot簡單接入websocket的操作方法

    這篇文章主要介紹了springboot簡單接入websocket的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Java中notify和notifyAll的區(qū)別及何時使用

    Java中notify和notifyAll的區(qū)別及何時使用

    本文主要介紹了Java中notify和notifyAll的區(qū)別及何時使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot3安全管理操作方法

    SpringBoot3安全管理操作方法

    這篇文章主要介紹了SpringBoot3安全管理,在實際開發(fā)中,最常用的是登錄驗證和權限體系兩大功能,在登錄時完成身份的驗證,加載相關信息和角色權限,在訪問其他系統(tǒng)資源時,進行權限的驗證,保護系統(tǒng)的安全,文中有詳細的操作步驟,需要的朋友可以參考下
    2023-08-08
  • SpringBoot控制配置類加載順序方式

    SpringBoot控制配置類加載順序方式

    這篇文章主要介紹了SpringBoot控制配置類加載順序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳解處理Java中的大對象的方法

    詳解處理Java中的大對象的方法

    本文我們將講解一下對于“大對象”的優(yōu)化。這里的“大對象”,是一個泛化概念,它可能存放在?JVM?中,也可能正在網絡上傳輸,也可能存在于數(shù)據(jù)庫中,快跟隨小編一起學習一下
    2022-04-04

最新評論