1. 程式人生 > >java第16天----TreeMap的注意點,增強for迴圈,Arrays和Collecttions工具類,多執行緒簡介

java第16天----TreeMap的注意點,增強for迴圈,Arrays和Collecttions工具類,多執行緒簡介

昨天知識總結

  • 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;
	}
}