中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中List集合數據修改方式是什么

發布時間:2023-02-09 09:25:48 來源:億速云 閱讀:157 作者:iii 欄目:開發技術

這篇文章主要介紹“Java中List集合數據修改方式是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java中List集合數據修改方式是什么”文章能幫助大家解決問題。

    Java中List集合數據修改

    這里是我循環賦值的語句

    public Map<String, Object> importSQL(@RequestBody String c, HttpServletRequest request) throws Exception {
        java.util.Map<String, Object> map = new HashMap<>();
        java.util.Map<String, Object> poiMap = new HashMap<>();
        // 對Excel表格操作的工具類
        PoiExcel poiExcel = new PoiExcel();
        // 保存從Excel讀取出來信息
        List<Attendance> attList = new ArrayList<Attendance>();
        List<String> string = new ArrayList<String>();
        Attendance att = new Attendance();
        try {
            List<Relation> relationList = new ArrayList<Relation>();
            JSONObject strj = new JSONObject(c);
            // 獲取讀取Excel表格開始行數
            int startRow = strj.getInt("start");
            // 獲取用戶自定義匹配數據
            String json = strj.getJSONArray("matchData").toString();
            // 獲取用戶上傳excel表格保存路徑
            String filePath = strj.getString("filePath");
            filePath = "1230.xls";
            // 將用戶自定義匹配數據放入relationList中,便于取值
            relationList = com.alibaba.fastjson.JSONArray.parseArray(json, Relation.class);
            /**
             * 測試使用
             */
            for (int i = 0; i < relationList.size(); i++) {
                System.out.println("第"+i+"次執行");
                /**
                 * 匹配查詢 filePath:文件名字 startRow:開始查詢行數
                 * relationList.get(i).getColumnNum():查詢列值
                 * 返回map類型數據,數據類型多樣,統一返回值 返回值是List類型數據,工具類中暫時只有一個String類型,測試使用
                 */
                string = (List<String>) poiExcel.ExcelRead(filePath, startRow, relationList.get(i).getColumnNum())
                        .get("list");
                // 初始化集合
                if (i == 0) {
                    for (int a = 0; a < string.size(); a++) {
                        attList.add(att);
                    }
                }
                if (relationList.get(i).getDescribe().equals("學號")) {
                    System.out.println("學號");
                    // 循環賦值
                    for (int j = 0; j < string.size(); j++) {
                        attList.get(j).setStuid(string.get(j));
                    }
                } else if (relationList.get(i).getDescribe().equals("姓名")) {
                    System.out.println("姓名");
                    // 循環賦值
                    for (int j = 0; j < string.size(); j++) {
                        attList.get(j).setName(string.get(j));
                    }
                } else {
                    System.out.println("分數");
                    for (int j = 0; j < string.size(); j++) {
                        attList.get(j).setScore(Integer.parseInt(string.get(j)));
                    }
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        /**
         * 以上為for循環遍歷Excel表格數據,以下為測試輸出,遍歷是否正確
         */
        for (int x = 0; x < attList.size(); x++) {
            System.out.println("讀取Excel表格信息為:" + attList.get(x).toString());
        }
        return map;
    }

    我的想法是先初始化集合,確定集合size和集合屬性,但是突然出現一個問題就是我遍歷出來的數據在循環賦值的時候attList里面的屬性全部變成最新一次的屬性,然后我就debug調試,發現每次賦值前面對應的值也都會更改,當時腦子里面就冒出了一個念頭:值類型和引用類型傳遞!!!于是,我做了如下更改:

        if (i == 0) {
            for (int a = 0; a < string.size(); a++) {
                Attendance att = new Attendance();
                attList.add(att);
            }
        }

    將new 對象這句話放到for循環里面

    運行之后值就對了,唉,開發經驗太少,竟然被這種問題困擾了一天

    下面是我百度的值類型和引用類型區別:

    引用類型表示你操作的數據是同一個,也就是說當你傳一個參數給另一個方法時,你在另一個方法中改變這個變量的值,那么調用這個方法是傳入的變量的值也將改變.

    值類型表示復制一個當前變量傳給方法,當你在這個方法中改變這個變量的值時,最初生命的變量的值不會變.

    引用傳遞:傳的是地址,就是將實參的地址傳遞給形參,形參改變了,實參當然被改變了,因為他們指向相同的地址。

    最后,一定要記住,當引用一個集合的時候,集合里面有n個對象,這個時候肯定要new n對象,否則,這些對象是引用的同一個!!!!

    Java中List集合的介紹

    List 是什么

    JavaList集合是指由JavaList接口以及List接口的所有實現類組成的集合。

    List集合中的元素允許重復,各元素的順序放是對象插入的順序. 類似Java中的數組,用戶可通過使用索引(元素在集合中的位置)來訪問集合中的元素.

    1.Java集合介紹

    Java集合就像一個容器,可以存儲任何類型的數據,也可以結合泛型來存儲具體的類型對象。在程序運行時,Java集合可以動態的進行擴展,隨著元素的增加而擴大。在Java中,集合類通常存在于java.util包中。

    Java集合主要由2大體系構成,分別是Collection體系和Map體系,其中Collection和Map分別是2大體系中的頂層接口。

    Collection主要有三個子接口,分別為List(列表)、Set(集)、Queue(隊列)。其中,List、Queue中的元素有序可重復,而Set中的元素無序不可重復。

    List中主要有ArrayList、LinkedList兩個實現類;Set中則是有HashSet實現類;而Queue是在JDK1.5后才出現的新集合,主要以數組和鏈表兩種形式存在。

    Map同屬于java.util包中,是集合的一部分,但與Collection是相互獨立的,沒有任何關系。Map中都是以key-value的形式存在,其中key必須唯一,主要有HashMap、HashTable、treeMap三個實現類。

    Java中List集合數據修改方式是什么

    2.List介紹

    Collection中,List集合是有序的,可對其中每個元素的插入位置進行精確地控制,可以通過索引來訪問元素,遍歷元素。

    在List集合中,我們常用到ArrayListLinkedList這兩個類

    2.1 ArrayList集合

    • ArrayList底層通過數組實現,隨著元素的增加而動態擴容。

    • ArrayList是Java集合框架中使用最多的一個類,是一個數組隊列,線程不安全集合。它繼承于AbstractList,實現了List, RandomAccess, Cloneable, Serializable接口。

    • ArrayList實現List,得到了List集合框架基礎功能;

    • ArrayList實現RandomAccess,獲得了快速隨機訪問存儲元素的功能,RandomAccess是一個標記接口,沒有任何方法;

    • ArrayList實現Cloneable,得到了clone()方法,可以實現克隆功能;

    • ArrayList實現Serializable,表示可以被序列化,通過序列化去傳輸,典型的應用就是hessian協議。

    ArrayList集合的特點:

    • 容量不固定,隨著容量的增加而動態擴容(閾值基本不會達到)

    • 有序集合(插入的順序==輸出的順序)

    • 插入的元素可以為null

    • 增刪改查效率更高(相對于LinkedList來說)

    • 線程不安全

    ArrayList的底層數據結構:

    Java中List集合數據修改方式是什么

    2.2 LinkedList集合

    • LinkedList底層通過鏈表來實現,隨著元素的增加不斷向鏈表的后端增加節點。

    • LinkedList是一個雙向鏈表,每一個節點都擁有指向前后節點的引用。相比于ArrayList來說,LinkedList的隨機訪問效率更低。它繼承AbstractSequentialList,實現了List, Deque, Cloneable, Serializable接口。

    • LinkedList實現List,得到了List集合框架基礎功能;

    • LinkedList實現Deque,Deque 是一個雙向隊列,也就是既可以先入先出,又可以先入后出,說簡單點就是既可以在頭部添加元素,也可以在尾部添加元素;

    • LinkedList實現Cloneable,得到了clone()方法,可以實現克隆功能;

    • LinkedList實現Serializable,表示可以被序列化,通過序列化去傳輸,典型的應用就是hessian協議。

    LinkedList集合的底層數據結構:

    Java中List集合數據修改方式是什么

    3.List常用方法

    A:添加功能
    boolean add(E e):向集合中添加一個元素
    void add(int index, E element):在指定位置添加元素
    boolean addAll(Collection<? extends E> c):向集合中添加一個集合的元素。
    
    B:刪除功能
    void clear():刪除集合中的所有元素
    E remove(int index):根據指定索引刪除元素,并把刪除的元素返回
    boolean remove(Object o):從集合中刪除指定的元素
    boolean removeAll(Collection<?> c):從集合中刪除一個指定的集合元素。
    
    C:修改功能
    E set(int index, E element):把指定索引位置的元素修改為指定的值,返回修改前的值。
    
    D:獲取功能
    E get(int index):獲取指定位置的元素
    Iterator iterator():就是用來獲取集合中每一個元素。
    
    E:判斷功能
    boolean isEmpty():判斷集合是否為空。
    boolean contains(Object o):判斷集合中是否存在指定的元素。
    boolean containsAll(Collection<?> c):判斷集合中是否存在指定的一個集合中的元素。
    
    F:長度功能
    int size():獲取集合中的元素個數
    
    G:把集合轉換成數組
    Object[] toArray():把集合變成數組。

    3.1 ArrayList 基本操作

    public class ArrayListTest {
        public static void main(String[] agrs){
            //創建ArrayList集合:
            List<String> list = new ArrayList<String>();
            System.out.println("ArrayList集合初始化容量:"+list.size());
    		// ArrayList集合初始化容量:0
            
            //添加功能:
            list.add("Hello");
            list.add("world");
            list.add(2,"!");
            System.out.println("ArrayList當前容量:"+list.size());
            // ArrayList當前容量:3
    
            //修改功能:
            list.set(0,"my");
            list.set(1,"name");
            System.out.println("ArrayList當前內容:"+list.toString());
            // ArrayList當前內容:[my, name, !]
    
            //獲取功能:
            String element = list.get(0);
            System.out.println(element);
            // my
    
            //迭代器遍歷集合:(ArrayList實際的跌倒器是Itr對象)
            Iterator<String> iterator =  list.iterator();
            while(iterator.hasNext()){
                String next = iterator.next();
                System.out.println(next);
            }
            /**  
            	my
                name
                !
            */
    
            //for循環迭代集合:
            for(String str:list){
                System.out.println(str);
            }
            /**  
            	my
                name
                !
            */
    
            //判斷功能:
            boolean isEmpty = list.isEmpty();
            boolean isContain = list.contains("my");
    
            //長度功能:
            int size = list.size();
    
            //把集合轉換成數組:
            String[] strArray = list.toArray(new String[]{});
    
            //刪除功能:
            list.remove(0);
            list.remove("world");
            list.clear();
            System.out.println("ArrayList當前容量:"+list.size());
            // ArrayList當前容量:0
        }
    }

    3.2 LinkedList 基本操作

    public class LinkedListTest {
        public static void main(String[] agrs){
            List<String> linkedList = new LinkedList<String>();
            System.out.println("LinkedList初始容量:"+linkedList.size());
            // LinkedList初始容量:0
    
            //添加功能:
            linkedList.add("my");
            linkedList.add("name");
            linkedList.add("is");
            linkedList.add("jiaboyan");
            System.out.println("LinkedList當前容量:"+ linkedList.size());
            // LinkedList當前容量:4
    
            //修改功能:
            linkedList.set(0,"hello");
            linkedList.set(1,"world");
            System.out.println("LinkedList當前內容:"+ linkedList.toString());
            // LinkedList當前內容:[hello, world, is, jiaboyan]
    
            //獲取功能:
            String element = linkedList.get(0);
            System.out.println(element);
            // hello
    
            //遍歷集合:(LinkedList實際的迭代器是ListItr對象)
            Iterator<String> iterator =  linkedList.iterator();
            while(iterator.hasNext()){
                String next = iterator.next();
                System.out.println(next);
            }
            /**
            	hello
                world
                is
                jiaboyan
            */
            
            //for循環迭代集合:
            for(String str:linkedList){
                System.out.println(str);
            }
            /**
            	hello
                world
                is
                jiaboyan
            */
    
            //判斷功能:
            boolean isEmpty = linkedList.isEmpty();
            boolean isContains = linkedList.contains("jiaboyan");
    
            //長度功能:
            int size = linkedList.size();
    
            //刪除功能:
            linkedList.remove(0);
            linkedList.remove("jiaboyan");
            linkedList.clear();
            System.out.println("LinkedList當前容量:" + linkedList.size());
            // LinkedList當前容量:0
        }
    }

    4.ArrayList和LinkedList比較

    元素新增性能比較

    網上很多說的是,在做新增操作時,ArrayList的效率遠不如LinkedList,因為Arraylist底層時數組實現的,在動態擴容時,性能會有所損耗,而LinkedList不存在數組擴容機制,所以LinkedList的新增性能較好。究竟時哪個好呢,我們用實踐得到結果。

    public class ListTest{
        // 迭代次數
        public static int ITERATION_NUM = 100000;
    
        public static void main(String[] args) {
            try{
                insertPerformanceCompare();
            }catch (Exception e){}
        }
    
        //新增性能比較:
        public static void insertPerformanceCompare() throws InterruptedException {
            Thread.sleep(5000);
    
            long start = System.nanoTime();
            List<Integer> linkedList = new LinkedList<Integer>();
            for (int x = 0; x < ITERATION_NUM; x++) {
                linkedList.add(x);
            }
            long end = System.nanoTime();
            System.out.println("LinkedList獲取測試開始 " + (end - start));
    
            start = System.nanoTime();
            List<Integer> arrayList = new ArrayList<Integer>();
            for (int x = 0; x < ITERATION_NUM; x++) {
                arrayList.add(x);
            }
            end = System.nanoTime();
            System.out.println("ArrayList獲取測試開始 " + (end - start));
        }
    }

    測試結果:

    第一次:
    LinkedList新增測試開始 10873720
    ArrayList新增測試開始 5535277
    第二次:
    LinkedList新增測試開始 13097503
    ArrayList新增測試開始 6046139
    第三次:
    LinkedList新增測試開始 12004669
    ArrayList新增測試開始 6509783

    結果與預想的有些不太一樣,ArrayList的新增性能并不低。

    原因:

    可能是經過JDK近幾年的更新發展,對于數組復制的實現進行了優化,以至于ArrayList的性能也得到了提高。

    元素獲取比較

    由于LinkedList是鏈表結構,沒有角標的概念,沒有實現RandomAccess接口,不具備隨機元素訪問功能,所以在get方面表現的差強人意,ArrayList再一次完勝。

    public class ListTest {
        //迭代次數,集合大小:
        public static int ITERATION_NUM = 100000;
    
        public static void main(String[] agrs) {
           try{
                getPerformanceCompare();
            }catch (Exception e){}
        }
    
        //獲取性能比較:
        public static void getPerformanceCompare()throws InterruptedException {
            Thread.sleep(5000);
    
            //填充ArrayList集合:
            List<Integer> arrayList = new ArrayList<Integer>();
            for (int x = 0; x < ITERATION_NUM; x++) {
                arrayList.add(x);
            }
    
            //填充LinkedList集合:
            List<Integer> linkedList = new LinkedList<Integer>();
            for (int x = 0; x < ITERATION_NUM; x++) {
                linkedList.add(x);
            }
    
            //創建隨機數對象:
            Random random = new Random();
    
            long start = System.nanoTime();
            for (int x = 0; x < ITERATION_NUM; x++) {
                int j = random.nextInt(x + 1);
                int k = linkedList.get(j);
            }
            long end = System.nanoTime();
            System.out.println("LinkedList獲取測試開始 " + (end - start));
    
            start = System.nanoTime();
            for (int x = 0; x < ITERATION_NUM; x++) {
                int j = random.nextInt(x + 1);
                int k = arrayList.get(j);
            }
            end = System.nanoTime();
            System.out.println("ArrayList獲取測試開始 " + (end - start));
        }
    }

    測試結果:

    第一次:
    LinkedList獲取測試開始 8190063123
    ArrayList獲取測試開始 8590205
    第二次:
    LinkedList獲取測試開始 8100623160
    ArrayList獲取測試開始 11948919
    第三次:
    LinkedList獲取測試開始 8237722833
    ArrayList獲取測試開始 6333427

    關于“Java中List集合數據修改方式是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    嘉义市| 克拉玛依市| 扬州市| 湄潭县| 垣曲县| 三都| 扎鲁特旗| 鲁甸县| 汪清县| 黑水县| 行唐县| 西华县| 平泉县| 西丰县| 吕梁市| 射洪县| 彰武县| 获嘉县| 尉氏县| 英德市| 寿阳县| 柳河县| 翼城县| 广灵县| 内丘县| 冀州市| 普格县| 山东省| 托克托县| 报价| 汾西县| 铜川市| 济阳县| 贺兰县| 子长县| 罗源县| 深泽县| 淄博市| 嘉义市| 连州市| 修文县|