1.泛型
1.1.泛型的定義,T 不指定類型的時候,就是Object類型。
public class TestGeneric<T> {
T x;
T y;
@Override
public String toString() {
return "TestGeneric{" +
"x=" + x +
", y=" + y +
'}';
}
public static void main(String[] args) {
TestGeneric<String> tg = new TestGeneric<String>();
tg.x = "10";
tg.y = "20";
System.out.println(tg);
}
}
1.2.泛型的注意點,
- 泛型的前後類型必須一致,1.7之後,後面的可以不寫
- 泛型是沒有繼承的 ArrayList<Object> arrayList= new ArrayList<String>(); 報錯。
- 泛型是語法糖,真正編譯的時候,還是Object類型。(class 強轉類型)
1.3.泛型類,
- 在類上面定義的泛型,創建的時候需要指定泛型的類型,沒有指明就是Object類型。
- 泛型類中定義的泛型方法,不能使用在static修飾,因爲靜態方法是類名調用的,泛型在對象創建的時候才指定類型。
1.4.自定義泛型方法,方法單獨使用泛型,必須得有參數纔有意義。
public class TestGenericMethod {
<T> void test(T a) {
System.out.println(a.getClass());
}
static <E> void test2(E name) {
System.out.println(name.getClass());
}
public static void main(String[] args) {
TestGenericMethod genericMethod = new TestGenericMethod();
genericMethod.test("a");
TestGenericMethod.test2("haoren");
}
}
1.5.泛型通配符,只能作接收操作,不能做添加
public class TestWildcardCharacter {
static void test1(List<?> list) {
}
static void test2(List<? extends Number> list) {
}
static void test3(List<? super Number> list) {
}
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
test1(arrayList);
}
}
1.6.泛型的上限和下限,
- extends泛型的上限,用來限定元素的類型必須是Number的子類。
- super泛型的下限,用來限定元素的類型必須是Number的父類。
1.7.泛型的擦除,把泛型給去掉了,把原來有泛型的list賦值給沒有泛型的list,泛型沒有了。
2.list和數組的轉換
- Arrays.asList轉成集合之後不能添加和刪除元素,而且把數組裏面的元素整體當成一個對象。
- 一般不會把基本數據類型的數組轉成集合,引用數據類型纔去轉成集合。
- new String[10] ,靜態開闢空間。如果空間不夠,自動創建和size一樣大小的空間。
public class TestTransfer {
public static void main(String[] args) {
//數組轉集合
int[] arr = {1, 2, 3, 4};
List<int[]> list=Arrays.asList(arr);
System.out.println(list);
Integer[] arr2 ={10,20,30,40};
List<Integer> list2=Arrays.asList(arr2);
System.out.println(list2);
//集合轉數組
List<String> list3=new ArrayList<>();
list3.add("a");
list3.add("b");
Object[] obj=list3.toArray();
String[] strs=list3.toArray(new String[10]);
System.out.println(Arrays.asList(strs));
}
}
3.set是無序的(元素添加的順序),不重複的,對象的去重,重寫equals方法和hashCode方法,可以去重。
- HashSet
- TreeSet
4.hashCode,每一個對象都有一個hashCode值。跟內存地址對應的編號。每一個對象的hashCode值都不一樣。
5.HashSet去重原理
- 每次調用add方法,添加對象的時候,每次都生成不同的hashcode值。
- 當添加的對象hashcode值相同的時候,纔會調用equals方法,如果對象是相同的則返回false,不允許添加
6. LinkedHashSet
- 是HashSet的子類
- 底層是鏈表實現,保證元素怎麼存怎麼出。是Set集合唯一的保證順序的集合。
7.隨機生成10個1~20之間隨機數,不重複,代碼如下,
Random random = new Random();
TreeSet treeSet = new TreeSet();
while (treeSet.size()<10){
int num = random.nextInt(20) + 1;
treeSet.add(num);
}
System.out.println(treeSet.toString());
8.TreeSet用來對元素進行排序,按照數字大小,按照字母順序,按照Unicode(包含了assic碼)
- TreeSet存放的類型必須是相同的類型
- 自定義的對象不能添加到TreeSet當中,對象必須實現Comparable接口,並且重寫compareTo方法
- compareTo的返回值,爲0的話,只添加第一個元素,爲正數,就是順序添加,順序顯示,負數,就是倒序顯示。
- 二叉樹實現的,在添加元素的時候,會調用compareTo方法,返回正數就是 大於根元素,放在右邊。
- 二叉樹從左往右取
9.treeset添加自定義對象實例如下,自定義compareTo屬性,源碼TreeSet自定義屬性比較
10.TreeSet比較器