CoreJava 5.3 泛型数组列表
生活随笔
收集整理的這篇文章主要介紹了
CoreJava 5.3 泛型数组列表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、為了解決運行時動態更改數組的問題,使用ArrayList類;它與數組很相似,但在增加或刪除元素時具有自動調節數組容量的功能。
2、ArrayList是采用類型參數的泛型類。用法:ArrayList<Class Name> ArrayList<Employee> staff = new ArrayList<Employee>();
3、使用add方法添加元素: staff.add(new Employee("Harry", ...)); staff.add(new Employee("Tome", ....)); 如果調用add且內部數組已滿時,數組列表就會自動創建一個更大容量的數組,并將小數組中的對象全部拷貝到大數組中。
4、預先分配容量大小:如果可以準確的預計數組可能存儲的元素數量,可以在填充數組前調用ensureCapacity方法: staff.ensureCapacity(100); ? ?//分配一個包含100個對象的內部數組。 這里如過調用100add,是不會重新分配空間的。
5、把初始容量傳遞給構造器: ArrayList<Employee> staff = new ArrayList<Employee>(100); 警告: 分配數組列表:new ArrayList<Employee>(100);與新數組分配空間:new Employee[100];不同。
數組列表的容量與數組的大小不同:數組分配100個存儲空間就表明這個數組有100個空位置可用(即用或不用那100個空間都會擺在那,不多不少);而容量為100的數組列表僅表明它擁有保存100個元素的潛力(所謂潛力就是可能超越100,可能不足100.這要實際運行中動態決定是否會重新分配容量),但是可以確定的是數組列表在完成初始化構造時不含任何元素。
6、size方法將返回數組列表實際元素個數:staff.size();返回staff數組列表的當前元素個數,等價于a.length; 當確定數組列表不再增刪元素時可以使用trimToSize方法。這個方法將存儲空間調整為當前元素所用空間,多于的交給垃圾回收器回收。注意:一定是確定數組列表大小不變后才使用該方法,因為使用該方法后再添加新元素就要花時間再次移動存儲塊,時間開銷較大。
5.3.1 訪問數組列表元素 1、ArrayList類不是Java的一部分。而是由某些人編寫且被放到標準庫中的一個實用類。
2、使用get和set方法訪問和改變數組元素,不能采用數組的[]語法格式。 例如:改變第i個元素:staff.set(i, harry); 等價于a[i] = harry; 警告:使用add方法添加新的元素,set方法只能改變已有元素的內容。
使用get訪問數組列表的元素:Employee e = staff.get(i); 等價于:Employee e = a[i];
3、介紹個技巧,即可靈活的擴展數組,又可以方便的訪問數組元素。 1)創建一個數組列表,并添加所有元素: ArrayList<X> list = ArrayList<X>(); while (...) { ? ? x = ...; ? ? list.add(x); }
2)使用toArray方法將數組列表元素拷貝到一個數組中: x[] a = new x[list.size()]; list.toArray(a);
3)除了在尾部追加元素之外,使用帶索引參數的add方法插入新元素: int n = staff.size() / 2; staff.add(n, e); 插入新元素后位于n后的所有元素自動向后移動,若超出容量將會重新分配存儲空間。
4)刪除元素:Emplouyee e = staff.remove(n);
5)使用“for each”循環對數組列表遍歷: for (Employee e : staff) ? ? //do something with e;
4、源代碼:例5-4,將Employee[]數組替換成ArrayList<Employee>。 注意變化: 不必指出數組的大小; 使用add想數組列表添加任意多的元素; 使用size代替length計算元素個數; 使用get[i]代替a[i]訪問元素。
ArrayListTest.java: [java] view plaincopypackage?com.vicent.corejava.arraylisttest;?? ?? import?java.util.ArrayList;?? ?? public?class?ArrayListTest?{?? ????public?static?void?main(String[]?args)?{?? ????????ArrayList<Employee>?staff?=?new?ArrayList<Employee>();?? ?????????? ????????staff.add(new?Employee("Carl",?7500,?1987,?12,?15));?? ????????staff.add(new?Employee("Harry",?5000,?1989,?10,?1));?? ????????staff.add(new?Employee("Tony",?4000,?1990,?3,?15));?? ?????????? ????????for?(Employee?e?:?staff)?? ????????????e.raiseSalary(5);?? ?????????? ????????for?(Employee?e?:?staff)?? ????????????System.out.println("name:?"?+?e.getName()?? ????????????????????+?",?salary:?"?+?e.getSalary()?? ????????????????????+?",?hireDay:?"?+?e.getHireDay());?? ?????????????? ????}?? ?? }??
Employee.java: [java] view plaincopypackage?com.vicent.corejava.arraylisttest;?? ?? import?java.util.Date;?? import?java.util.GregorianCalendar;?? ?? public?class?Employee?{?? ?? ????private?String?name;?? ????private?double?salary;?? ????private?Date?hireDay;?? ????private?double?raise;?? ?? ????public?Employee(String?aName,?double?aSalary,?int?year,?int?month,?int?day)?{?? ????????name?=?aName;?? ????????salary?=?aSalary;?? ????????GregorianCalendar?calendar?=?new?GregorianCalendar(year,?month?-?1,?day);?? ????????hireDay?=?calendar.getTime();?? ????}?? ?????? ????public?String?getName()?{?? ????????return?name;?? ????}?? ?????? ????public?double?getSalary()?{?? ????????return?salary;?? ????}?? ?????? ????public?Date?getHireDay()?{?? ????????return?hireDay;?? ????}?? ?????? ????public?void?raiseSalary(double?byPercent)?{?? ????????raise?=?salary?*?byPercent?/?100;?? ????????salary?+=?raise;?? ????}?? ?? }??
運行結果: name: Carl, salary: 7875.0, hireDay: Tue Dec 15 00:00:00 CST 1987 name: Harry, salary: 5250.0, hireDay: Sun Oct 01 00:00:00 CST 1989 name: Tony, salary: 4200.0, hireDay: Thu Mar 15 00:00:00 CST 1990
2、ArrayList是采用類型參數的泛型類。用法:ArrayList<Class Name> ArrayList<Employee> staff = new ArrayList<Employee>();
3、使用add方法添加元素: staff.add(new Employee("Harry", ...)); staff.add(new Employee("Tome", ....)); 如果調用add且內部數組已滿時,數組列表就會自動創建一個更大容量的數組,并將小數組中的對象全部拷貝到大數組中。
4、預先分配容量大小:如果可以準確的預計數組可能存儲的元素數量,可以在填充數組前調用ensureCapacity方法: staff.ensureCapacity(100); ? ?//分配一個包含100個對象的內部數組。 這里如過調用100add,是不會重新分配空間的。
5、把初始容量傳遞給構造器: ArrayList<Employee> staff = new ArrayList<Employee>(100); 警告: 分配數組列表:new ArrayList<Employee>(100);與新數組分配空間:new Employee[100];不同。
數組列表的容量與數組的大小不同:數組分配100個存儲空間就表明這個數組有100個空位置可用(即用或不用那100個空間都會擺在那,不多不少);而容量為100的數組列表僅表明它擁有保存100個元素的潛力(所謂潛力就是可能超越100,可能不足100.這要實際運行中動態決定是否會重新分配容量),但是可以確定的是數組列表在完成初始化構造時不含任何元素。
6、size方法將返回數組列表實際元素個數:staff.size();返回staff數組列表的當前元素個數,等價于a.length; 當確定數組列表不再增刪元素時可以使用trimToSize方法。這個方法將存儲空間調整為當前元素所用空間,多于的交給垃圾回收器回收。注意:一定是確定數組列表大小不變后才使用該方法,因為使用該方法后再添加新元素就要花時間再次移動存儲塊,時間開銷較大。
5.3.1 訪問數組列表元素 1、ArrayList類不是Java的一部分。而是由某些人編寫且被放到標準庫中的一個實用類。
2、使用get和set方法訪問和改變數組元素,不能采用數組的[]語法格式。 例如:改變第i個元素:staff.set(i, harry); 等價于a[i] = harry; 警告:使用add方法添加新的元素,set方法只能改變已有元素的內容。
使用get訪問數組列表的元素:Employee e = staff.get(i); 等價于:Employee e = a[i];
3、介紹個技巧,即可靈活的擴展數組,又可以方便的訪問數組元素。 1)創建一個數組列表,并添加所有元素: ArrayList<X> list = ArrayList<X>(); while (...) { ? ? x = ...; ? ? list.add(x); }
2)使用toArray方法將數組列表元素拷貝到一個數組中: x[] a = new x[list.size()]; list.toArray(a);
3)除了在尾部追加元素之外,使用帶索引參數的add方法插入新元素: int n = staff.size() / 2; staff.add(n, e); 插入新元素后位于n后的所有元素自動向后移動,若超出容量將會重新分配存儲空間。
4)刪除元素:Emplouyee e = staff.remove(n);
5)使用“for each”循環對數組列表遍歷: for (Employee e : staff) ? ? //do something with e;
4、源代碼:例5-4,將Employee[]數組替換成ArrayList<Employee>。 注意變化: 不必指出數組的大小; 使用add想數組列表添加任意多的元素; 使用size代替length計算元素個數; 使用get[i]代替a[i]訪問元素。
ArrayListTest.java: [java] view plaincopy
Employee.java: [java] view plaincopy
運行結果: name: Carl, salary: 7875.0, hireDay: Tue Dec 15 00:00:00 CST 1987 name: Harry, salary: 5250.0, hireDay: Sun Oct 01 00:00:00 CST 1989 name: Tony, salary: 4200.0, hireDay: Thu Mar 15 00:00:00 CST 1990
轉載于:https://www.cnblogs.com/vincent-hv/archive/2013/02/28/2958553.html
總結
以上是生活随笔為你收集整理的CoreJava 5.3 泛型数组列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stringstream精度问题
- 下一篇: 【原创】数据库中时间字段的值读取到Dat