本文主要内容:
1.ArrayList與LinkList差別
2.泛型的基本使用
3.自動裝箱與拆箱
4.ArrayList類
5.楊輝三角
1.ArrayList 和 LinkedList 的差別是什麼?
ArrayList是封裝的數組,LinkList是封裝的連結清單,ArrayList可以支援随機通路,時間複雜度為1,LinkList的時間複雜度為n,且性能高。
2.泛型的基本使用:
泛型時編譯期間的魔法,類的位元組碼中沒有泛型,運作期間也沒有。
-
誕生的意義
順序表本身是一種抽象資料類型,儲存的資料不隻是int類型。如果沒有泛型的支援,我們必須為每一種要儲存的資料類型定義一個順序表。為了解決類似順序表的結構,支援通用類型元素的類型。為了解決這個問題:
第一階段:Object是所有類的基類
元素類型:Object類類型的引用,Object引用可以指向任意類的對象
第二階段:新的問題
無法在編譯期間快速找到一些問題,可能會出現運作時異常:ClassCastException
ArrayList list = new ArrayList();
list.add(new Person());
String o = (String)list.get(0);//(錯誤)運作期間會抛異常
為了讓錯誤盡可能在編譯期間出現,引入泛型:
ArrayList<Person> list = new ArrayList<>();
list.add(new Person());
String o = (String)list.get(0);//編譯時報錯
-
泛型類的使用
(1)如何使用泛型類
new ArrayList<String[類型變量的實參]>{}
1)嵌套
ArrayList<ArrayList<String>> q;
Set<Map.Entry<String,String>>[Map.Entey<String,String>是鍵值對]
2)類型推導
ArrayList<String> a = new ArrayList<String>();[可推導]
3)多類型參數
Map<String,Integer> grade;
(2)自己定義泛型類
class ArrayList<類型變量形參>{}
3.自動裝箱與自動拆箱[編譯期間的魔法]
(1)自動裝箱
class ArrayList<E>{
E[] array; //Object[] array
int size
}
順序表中的裡面的元素為int,怎麼辦?引出包裝類
int i = 10;
Integer i1 = i;//裝箱
Integer i2 = new Integer(i);//裝箱
基本資料類型的包裝類:大多數将首字母大寫。特殊:char(Character)、int(Integer)
(2)自動拆箱
Integer i = new Integer(10);//裝箱
int j = i;//拆箱
int m = i.intValue();//拆箱
4.List接口
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB9ENjpmTxkkeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zROBlLxQjNxUDM0UTM5EDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(1)ArrayList的構造方法
ArrayList() :構造一個初始容量為十的空清單。
ArrayList(Collection<? extends E> c) :構造一個包含指定集合的元素的清單,按照它們由集合的疊代器傳回的順序。
ArrayList(int initialCapacity) :構造具有指定初始容量的空清單。
(2)ArrayList的重要方法
add(E e) :将指定的元素追加到此清單的末尾。
void add(int index, E element) :在此清單中的指定位置插入指定的元素。
addAll(Collection<? extends E> c) :按指定集合的Iterator傳回的順序将指定集合中的所有元素追加到此清單的末尾。
void clear() :從清單中删除所有元素。
contains(Object o) :如果此清單包含指定的元素,則傳回 true 。
ensureCapacity(int minCapacity) :如果需要,增加此 ArrayList執行個體的容量,以確定它可以至少儲存最小容量參數指定的元素數。
get(int index) :傳回此清單中指定位置的元素。
int indexOf(Object o) :傳回此清單中指定元素的第一次出現的索引,如果此清單不包含元素,則傳回-1。
isEmpty() :如果此清單不包含元素,則傳回 true 。
代碼實作:
public class Test1 {
private static class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
list.add("Java");
list.add("C++");
list.add(2,1);
System.out.println(list);
Person person = new Person("小明",20);
list.add(person);
for(Object o:list){
System.out.println(o);
}
System.out.println(list.contains("Java"));
Object o = list.get(2);
System.out.println(o);
list.clear();
System.out.println(list.isEmpty());
}
}
//運作結果:
[Java, C++, 1]
Java
C++
1
Person{name='小明', age=20}
true
1
true
5.楊輝三角
public class Test2 {
//列印楊輝三角
public static List<List<Integer>> generate (int numRows){
List<List<Integer>> list = new ArrayList<>(numRows);
//list是一種引用,List類型的接口引用,list邏輯上是一個線性表,其元素類型為List<Integer>
for(int i = 0;i<numRows;i++){
List<Integer> arrayList = new ArrayList<>(i+1);
list.add(arrayList);
if(i == 0){
arrayList.add(1);
}else if(i == 1){
arrayList.add(1);
arrayList.add(1);
} else {
List<Integer> num = list.get(i);
num.add(1);
for(int j = 1;j < i;j++){
num.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
}
num.add(1);
}
}
return list;
}
public static List<List<Integer>> generate1 (int numRows) {
List<List<Integer>> list = new ArrayList<>(numRows);
for(int i = 0;i< numRows ;i++){
List<Integer> arrayList = new ArrayList<>(i+1);
list.add(arrayList);
arrayList.add(1);
for(int j = 1;j < i;j++){
arrayList.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
}
if(i != 0) {
arrayList.add(1);
}
}
return list;
}
public static void main(String[] args) {
List<List<Integer>> lists = generate(5);
System.out.println(lists);
List<List<Integer>> lists1 = generate1(5);
System.out.println(lists1);
}
}
//運作結果:
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
6.連結清單