java第16天----TreeMap的注意點,增強for迴圈,Arrays和Collecttions工具類,多執行緒簡介
阿新 • • 發佈:2018-12-13
昨天知識總結
- 1.泛型
- 泛型的定義
- 泛型的基礎
- 泛型在類上,介面上,方法上的使用
- 泛型–限制上限,限制下線 2.Map
- Map與Collection的比較
- Map介面常用方法
- Map的遍歷----會—重點
- HashMap的去重和TreeMap的排序
TreeMap的注意點
1.什麼型別的資料可以作為TreeMap的key
- 答:實現了Comparable介面,或者使用了比較器(實現了Comparator介面)的元素,常見:String,Integer,Double
- 不行的型別:ArrayList,陣列,因為他們本身都沒有實現Comparable介面
2.作為key的型別,與他的內部有沒有關係
- 答:沒有關係,元素能不能充當key,與它內部無關,只看他有沒有實現comparable介面
增強for迴圈
- 增強for迴圈使用的場景:陣列,集合
- 用於陣列,Collection的遍歷,直接使用
- 用於Map的遍歷,我們需要得到Map的set形式,再遍歷
- 增強for迴圈的構成:
- for(元素型別 變數:陣列/Collection){
-
迴圈體
- }
public static void main(String[] args) {
//遍歷陣列
int[] arr = new int[] {3,5,35,684,86};
for (int i : arr) {
System. out.println("陣列:"+i);
}
//遍歷Collection
ArrayList<String> list = new ArrayList<>();
list.add("java");
list.add("html");
for (String string : list) {
System.out.println("字串"+string);
}
//遍歷Map
HashMap<String, String> map = new HashMap<>();
map.put("01", "java" );
map.put("02", "html");
map.put("03", "ios");
map.put("04", "BigData");
//1.先得到Set集合
Set<Map.Entry<String, String>> set = map.entrySet();
//3.遍歷
for (Map.Entry<String, String> entry : set) {
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
}
}
Arrays工具類
- Arrays:陣列工具類,內部封裝了大量運算元組的方法,包括排序,查詢,求最大值等
- 幾種常用的方法
public static void main(String[] args) {
//1.簡單資料型別轉成字串----方便檢視內容
int[] arr = new int[] {3,5,8,9,3};
System.out.println(arr.toString());//預設列印的是陣列的地址
String str = Arrays.toString(arr);
System.out.println(str);//陣列被轉化成了字串
//2.陣列專集合?----結合方法多,操作便捷
//簡單資料型別轉集合
int[] arr2 = new int[] {3,5,8,9,3};
Arrays.asList(arr2);
System.out.println(Arrays.asList(arr2));//1.說明對應簡單資料型別的陣列,aslist方法會將整體當作集合的一個元素
//引用資料型別轉集合
String[] strings = {"a,","b","c"};
List<String> list2 = Arrays.asList(strings);
System.out.println(list2.size());//3.說明對於引用資料型別的陣列,asList()方法會將陣列的一個元素作為集合的一個元素
//陣列轉集合的注意點:轉成的集合的元素個數是固定的,所以不能進行新增和刪除,可以進行修改和遍歷
//list2.add("java");//執行報異常UnsupportedOperationException
list2.set(0,"d");
System.out.println(list2);
//二分查詢--陣列必須有序
int[] arr3 = {2,4,6,8,90};
int index = Arrays.binarySearch(arr3, 5);
System.out.println(index);
可變引數
- 可變引數:引數的個數可以改變
- 作用:簡化程式碼,方便操作
- 構成:資料型別加… 可變引數可以直接理解成陣列 int[] = int…
注意點:
- 1.給可變引數傳值的實參,可以直接是多個值
- 2.包括可變引數在內,有多個引數時,可變引數必須放在最後,並且一個方法只能同時有一個可變引數
- 3.當固定引數的方法與可變引數的方法是過載時,固定引數的優先順序高於可變引數的方法
public static void main(String[] args) {
int[] arr = {3,5,7,6,1};
System.out.println(sum1(arr));
System.out.println(sum1(2,5,486,464,64,6));
System.out.println(sum2(3,4,3));
System.out.println(sum3(3,4));//這裡呼叫的是固定引數的方法
}
public static int sum1(int...a) {
int sum = 0;
for (int i : a) {
sum += i;
}
return sum;
}
//包括可變引數在內,有多個引數時,可變引數必須放在最後,並且一個方法只能同時有一個可變引數
public static int sum2(int b,int...a) {
int sum = 0;
for (int i : a) {
sum += i;
}
return sum;
}
//下面的兩個方法是過載的關係
//當固定引數的方法與可變引數的方法是過載時,固定引數的優先順序高於可變引數
public static int sum3(int b,int...a) {
int sum = 0;
for (int i : a) {
sum += i;
}
return sum;
}
public static int sum3(int a,int b) {
return a;
}
Collections
- Collections:集合工具類,封裝了大量操作集合的方法
- 例項:要求儲存多個數據,資料可以排序,也可以重複
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("java");
list.add("html");
list.add("python");
list.add("ios");
list.add("BigDota");
//自然順序
System.out.println("自然順序:"+list);
//按照字典排序--預設都是升序
//這裡要向實現排序,要求元素必須實現Compar介面的compareTo方法
Collections.sort(list);
System.out.println("字典順序:"+list);
//這裡從短到長排序---預設的方法無法實現,創造自己的方法
ComWithLength comWithLength = new ComWithLength();
Collections.sort(list, comWithLength);
System.out.println("從短到長排序:"+list);
//按照從長到短排序--利用現有的從短到長的比較器得到新的比較器物件
Comparator<String> comparator= Collections.reverseOrder(comWithLength);
Collections.sort(list, comparator);
System.out.println("從長到短排序");
//字典順序的倒敘
Comparator<String> comparator2 = Collections.reverseOrder();
Collections.sort(list, comparator2);
System.out.println(list);
//現有順序的倒敘
Collections.reverse(list);
System.out.println(list);
//求最大值
String max1 = Collections.max(list);
System.out.println("預設字典排序的最大值:"+max1);
String max2 = Collections.max(list,comWithLength);
System.out.println("從短到長排序的最大值:"+max2);
}
}
//創造自己的比較器類---字串從長到短
class ComWithLength implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
int num = o1.length() - o2.length();
return num==0?o1.compareTo(o2):num;
}
}
多執行緒
- 多執行緒:
- 程式:是一個可執行檔案
- 程序:是一個正在執行的程式,在記憶體中開闢了一塊空間
- 執行緒:負責程式的執行,可以看做是程式執行的一條通道,或者一個執行單元,我們通常將程序的工作理解成執行緒的工作
- 程序中可不可以沒有執行緒? 必須有執行緒,至少有一個,當有一個執行緒存在的時候,我們稱為單執行緒,這個惟一的執行緒就是主執行緒(main執行緒)
- 當有一個以上的執行緒存在的時候,我們成為多執行緒
- 多執行緒存在的意義:為了實現同一時間做多個事情。
- 任務區:我們將執行緒完成工作的方法稱為任務區,
- 每一個執行緒都有自己的任務區
- JVM是多執行緒?
- 一定是多執行緒
- 至少有兩個
- 主執行緒的任務區:main方法
- 垃圾回收執行緒:finallize()方法
- 執行緒是隨著任務的開始而開始,結束而結束,只要任務沒有結束,執行緒就不會結束,當執行緒還在工作的時候,程序沒有辦法結束
- 多個執行緒是搶cup的關係,CPU有隨機性
- 自己建立執行緒的原因:系統的執行緒無法完成我們自己的功能,我們就自己建立執行緒,系統將執行緒面向物件了,形成的類就是Thred
- Thread的任務區是run()方法
- 注意:如果我們想讓run(0方法作為任務區,必須通過start方法,讓run自動執行 *兩種建立執行緒的方式:
- 1.通過Thread直接建立執行緒
public static void main(String[] args) {
Thread thread1 = newh Tread();
Thread thread2 = new Thread();
thread1.start();
thread2.start();//這裡有三個執行緒,兩個子執行緒,一個主執行緒
System.out.println("main");
}
2.通過建立Thread的子類
public static void main(String[] args) {
//1.通過Thread子類建立執行緒
//建立兩個執行緒
Thread thread1 = new MyThread("bingbing");//thread-0
Thread thread2 = new MyThread("yingying");//thread-1
//通過start方法讓執行緒工作
thread1.start();
thread2.start();//這裡有三個執行緒,兩個子執行緒,一個主執行緒
for(int i = 0;i < 10;i++) {
System.out.println(Thread.currentThread().getName()+" main i"+i);
}
/*
* 當手動呼叫時,run變成了普通方法,失去了任務區的功能
* run內部對應的執行緒就是run方法或手動呼叫的位置對應的執行緒
*/
}
}
class MyThread extends Thread{
String myname;
public void run() {
/*
* 重寫run方法,作為任務區
* Thread.currentThread():獲取當前執行緒
* Thread.currentThread(.getname():獲取的是當前執行緒的名字,系統給的名字
*/
for(int i = 0;i < 10;i++) {
System.out.println(Thread.currentThread().getName()+" "+myname+" i:"+i);
}
}
public MyThread(String myname) {
super();
this.myname = myname;
}
}