<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                java在安卓的開發中是非常重要的,所以今天我總結了一下java的基礎知識,當然,還有一些沒有總結完,例如網絡編程,io流等,將會在下一篇博文中寫出。 ## 概述 javac :負責的是編譯的部分 java :負責運行的部分.會啟動 jvm.加載運行時所需的類庫,并對 class 文件進行執行 ## 語法規則 ### 數據類型 1 1 ): 基本數據類型:byte(1個字節)、short(2)、int(4)、long(8)、float(4)、double(8)、char(2)、boolean。 1個字節占8位 2 2 ): 引用數據 類型: 數組、類、接口。 ### 運算符 > *+ - * / % %:任何整數模 2 不是 0 就是 1,所以只要改變被模數就可以實現開關運算 > &: 只有兩邊都為 true 結果是 true。否則就是 false。 > |:只要兩邊都為 false 結果是 false,否則就是 true > & 和 && 區別: & :無論左邊結果是什么,右邊都參與運算。 &&: 短路與,如果左邊為 false,那么右邊不參數與運算。 > | 和 || 區別:|:兩邊都運算。 || : 短路或,如果左邊為 true,那么右邊不參與運算。 > ++X(–X)表示在使用x之前,先使x的值增(減)1 ### 語句 If switch do while while for 當判斷固定個數的值的時候,建議使用 switch,效率相對較高。 當判斷數據范圍,獲取判斷運算結果 boolean 類型時,需要使用 if。 當某些語句需要執行很多次時,就用循環結構,建議使用 for。因為 for 循環完畢,變量在內存中釋放。 ### 函數 重載的定義是:在一個類中,如果出現了兩個或者兩個以上的同名函數,只要它們的參數的個數,或者參數的 類型不同,即可稱之為該函數重載了。 如何區分重載:當函數同名時,只看參數列表。和返回值類型沒關系。 ### 數據 ~~~ // 二分查找法。必須有前提: 數組中的元素要有序。 public static int halfSeach_2(int[] arr,int key){ int min,max,mid; min = 0; max = arr.length-1; mid = (max+min)>>1; //(max+min)/2; while(arr[mid]!=key){ if(key>arr[mid]){ min = mid + 1; } else if(key<arr[mid]) max = mid - 1; if(max<min) return -1; mid = (max+min)>>1; } return mid; } ~~~ java 分了 5 5 片內存。 1 :寄存器。2 :本地方法區。3 :方法區。4 :棧。5 :堆。 ~~~ 棧:存儲的都是局部變量 ( 函數中定義的變量,函數上的參數,語句中的變量 ); 只要數據運算完成所在的區域結束,該數據就會被釋放。后進先出。 堆:用于存儲數組和對象,也就是 實體。啥是實體啊?就是用于封裝多個數據的。 1 :每一個實體都有內存首地址值。 2 :堆內存中的變量都有默認初始化值。因為數據類型不同,值也不一樣。 3 :垃圾回收機制。 ~~~ ## 面向對象 ### 類 屬性是用于存儲數據的 , 直接被訪問,容易出現安全隱患 , 所以,類中的屬性通 常被私有化,并對外提供公共的訪問方法。 這個方法一般有兩個,規范寫法:對于屬性 xxx ,可以使用 setXXX(),getXXX() 對其進行操作 主函數的存在,僅為該類是否需要獨立運行 , 如果不需要,主函數是不用定義的。 主函數的解釋:保證所在類的獨立運行,是程序的入口,被 jvm 調用。 構造函數是在對象創建時,就被調用,用于初始化, 而且初始化動作只執行一次。 一般函數,是對象創建后,需要調用才執行,可以被調用多次。 ### 封裝 將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問。 ### this 用 this 調用構造函數,必須定義在構造函數的第一行。因為構造函數是用于初始化的,所以初 始化動作一定要執行。 否則編譯失敗。 ### static ~~~ 關鍵字,是一個修飾符 , 用于修飾成員( ( 成員變量和成員函數) ) 靜態方法只能訪問靜態成員,不可以訪問非靜態成員。 靜態方法中不能使用 this ,super 關鍵字。 成員變量可以稱為對象的特有數據,靜態變量稱為對象的共享數據。 靜態代碼塊、構造代碼塊、構造函數同時存在時的執行順序: 靜態代碼塊 à? 構造代碼塊 à? 構造函數 ~~~ ### 單例設計模式 保證一個類在內存中的對象唯一性。 步驟: 1 1 ,因為創建對象都需要構造函數初始化 ,只要將本類中的構造函數私有化,其他程序就無法 再 創建 該類對象; 2 2 ,就在類中創建一個本類的對象 ; 3 3 ,定義一個方法,。 返回該對象,讓其他程序可以通過方法就得到本類對象。 (作用:可控) 代碼體現: 1 1 ,私有化構造函數 ; 2 2 ,創建私有并靜態的本類對象 ; 3 3 ,定義公有并靜態的方法,返回該對象 ~~~ //餓漢式 class Single{ private Single(){} // 私有化構造函數。 private static Single s = new Single(); // 創建私有并靜態的本類對象。 public static Single getInstance(){ // 定義公有并靜態的方法,返回該對象。 return s; } } //懶漢式:延遲加載方式。 class Single2{ private Single2(){} private static Single2 s = null; public static Single2 getInstance(){ if(s==null) s = new Single2(); return s; } } ~~~ ### 繼承 java 中對于繼承,java 只支持單繼承。java 雖然不直接支持多繼承,但是保留了這種多繼承機制,進行改良。 java 支持多重繼承。A 繼承 B B 繼承 C C 繼承 D。 子類在進行對象初始化時,先調用父類的構造函數,這就是子類的實例化過程。 super()和 和 this() 不可以同時出現的構造函數中。 在方法覆蓋時,注意兩點: 1:子類覆蓋父類時,必須要保證,子類方法的權限必須大于等于父類方法權限可以實現繼承。否則,編譯 失敗。 2:覆蓋時,要么都靜態,要么都不靜態。 (靜態只能覆蓋靜態,或者被靜態覆蓋) ### final 可以修飾類,方法,變量。不可以被繼承、覆蓋。 ### 抽象類 抽象類的特點: 1 1 : 抽象方法只能定義在 抽象類中 , 抽象類和抽象方法必須由 t abstract 關鍵字修飾 (可以描述類和 ) 方法,不可以描述變量) 。 2 2 : 抽象方法只定義方法聲明,并不定義方法實現。 3 3 : 抽象類不可以被創建對象( ( 實例化) ) 。 4 4 : 只有通過子類繼承抽象類并覆蓋了抽象類中的 所有 抽象方法后,該子類 才 可以實例化。否則, 該子類還是一個抽象類。 抽象類可以大一非抽象方法,抽象類中有構造函數。 ### 接口 接口中有抽象方法,接口不可以實例化。 接口的子類必須實現了接口 中 所有的抽象方法后,該子類才可以實例化。否則,該子類還是一個抽象類。 類與類之間存在著繼承關系,類與接口中間存在的是 實現關系。 繼承用 extends ; 實現用 implements ### 多態 體現: 父類引用或者接口的引用指向了自己的子類對象。 //Animal a = new Cat(); instanceof ;// 判斷對象是否實現了指定的接口或繼承了指定的類 ### Object ~~~ public boolean equals(Object obj){ if(!(obj instanceof Person)) return false; Person p = (Person)obj; return this.age == p.age; } ~~~ 通常 equals , toString , hashCode ,在應用中都會被復寫 , 建立具體對象的特有的內容。 ### 內部類 如果 A 類需要直接訪問 B 類中的成員,而 B 類又需要建立 A 類的對象。這時,為了方便設計和訪問, 直接將 A 類定義在 B 類中。就可以了。A 類就稱為 內部類。內部類可以直接訪問外部類中的成員。而外部類想要 訪問內部類,必須要建立內部類的對象。 ~~~ class Outer{ int num = 4; class Inner { void show(){ System.out.println("inner show run "+num); } } public void method(){ Inner in = new Inner();//創建內部類的對象。 in.show();//調用內部類的方法。 } } ~~~ 匿名內部類: 當函數的參數是接口類型引用時,如果接口中的方法不超過 3 個。可以通過匿名內部類來完成參數的傳遞。 ### 異常 > 通過 throws 關鍵字完成, 格式: throws 異常類名, , 異常類名 > throw 用于拋出異常對象,后面跟的是異常對象;throw 用在函數內。 throws 用于拋出異常類,后面跟的異常類名,可以跟多個,用逗號隔開。throws 用在函數上。 > 運行時異常,其中 Exception 有一個特殊的子類 RuntimeException,以及 RuntimeException 的子類是運 行異常,也就說這個異常是編譯時不被檢查的異常。 > finally 很有用,只要用戶關閉資源。無論是否發生異常,資源都必須進行關閉。 System.exit(0); //退出 jvm,只有這種情況 finally 不執行。 常見 異常 : 1、腳標越界異常(IndexOutOfBoundsException)包括數組、字符串; 空指針異常(NullPointerException) 2、類型轉換異常:ClassCastException 3、不支持操作異常; ### 包 常見的軟件包: > java.lang : language java 的核心包,Object System String Throwable jdk1.2 版本后,該 包中的類自動被導入。 > java.awt : 定義的都是用于 java 圖形界面開發的對象。 > javax.swing: : 提供所有的 windows 桌面應用程序包括的控件, 比如: Frame , Dialog, Table, List 等等, , 就是 java 的圖形界面庫 。 > java.net : 用于 java 網絡編程方面的對象都在該包中。 > java.io : input output 用于操作設備上數據的對象都在該包中。比如:讀取硬盤數據,往硬盤寫 入數據。 > java.util a : java 的工具包,時間對象 , 集合框架。 > java.applet : application+let 端 客戶端 a java 小程序。 server+let – > servlet 端 服務端 java 小程序 ### 多線程 創建線程: 方法1: ~~~ 步驟: 1,定義類繼承 Thread 類; 2,目的是復寫 run 方法,將要讓線程運行的代碼都存儲到 run 方法中; 3,通過創建 Thread 類的子類對象,創建線程對象; 4,調用線程的 start 方法,開啟線程,并執行 run 方法。 ~~~ 方法2: ~~~ 步驟: 1,定義類實現 Runnable 接口。 2,覆蓋接口中的 run 方法(用于封裝線程要運行的代碼)。 3,通過 Thread 類創建線程對象; 4,將實現了 Runnable 接口的子類對象作為實際參數傳遞給 Thread 類中的構造函數。 為什么要傳遞呢?因為要讓線程對象明確要運行的 run 方法所屬的對象。 5,調用 Thread 對象的 start 方法。開啟線程,并運行 Runnable 接口子類中的 run 方法。 Ticket t = new Ticket(); /* 直接創建 Ticket 對象,并不是創建線程對象。 因為創建對象只能通過 new Thread 類,或者 new Thread 類的子類才可以。 所以最終想要創建線程。既然沒有了 Thread 類的子類,就只能用 Thread 類。 `*/` Thread t1 = new Thread(t); //創建線程。 /* 只要將 t 作為 Thread 類的構造函數的實際參數傳入即可完成線程對象和 t 之間的關聯 為什么要將 t 傳給 Thread 類的構造函數呢?其實就是為了明確線程要運行的代碼 run 方法。 `*/` t1.start(); ~~~ ### 同步 同步函數:其實就是將同步關鍵字定義在函數上,讓函數具備了同步性。 同步函數使用的鎖是 this , 靜態同步函數的鎖是 該類的字節碼文件對象。 同步是隱示的鎖操作,而 k Lock 對象是顯示的鎖操作,它的出現就替代了同步。 ## API ### 字符串 ~~~ parseInt(string,radix); //將給定的數轉成指定的基數進制; 在 在 5 jdk1.5 版本后,對基本數據類型對象包裝類進行升級。在升級中,使用基本數據類型對象包裝類可 以像使用基本數據類型一樣,進行運算。 Integer i = new Integer(4); 5 //1.5 版本之前的寫法; Integer i = 4; // 自動裝箱 ,5 1.5 版本后的寫法; i = i + 5; //i 對象是不能直接和 5 相加的,其實底層先將 i 轉成 int 類型,在和 5 相加。而轉成 int 類型的操作是隱 式的。 自動拆箱:拆箱的原理就是 i.intValue();i+5 運算完是一個 int 整數。 ~~~ ### 集合框架 1:對象封裝數據,對象多了也需要存儲。 集合用于存儲對象。 2:對象的個數確定可以使用數組,但是不確定怎么辦?可以用集合。因為 ### List接口 ~~~ List : 有序( ( 元素存入集合的順序和取出的順序一致) ) ,元素都有索引。元素可以重復。 | | -- ArrayList : 底層的數據結構 是數組, , 線程不同步 ,A At rrayList 了 替代了 Vector , 查詢元素的速 度非常快。 | | -- LinkedList : 底層的數據結構是鏈表 , 線程不同步 , 增刪元素的速度非常快。 | | -- Vector : 底層的數據結構就是數組 , 線程同步的 ,r Vector 無論查詢和增刪都巨慢。 ~~~ 對于 t list 集合,底層判斷元素是否相同,其實用的是元素自身的 s equals 方法完成的。所以建議 元素都要復寫 s equals ~~~ LinkedList : 的特有方法。 addFirst(); addLast(); 在 jdk1.6 以后。 offerFirst(); offerLast(); getFirst():獲取鏈表中的第一個元素。如果鏈表為空,拋出 NoSuchElementException; getLast(); 在 jdk1.6 以后。 peekFirst();獲取鏈表中的第一個元素。如果鏈表為空,返回 null。 peekLast(); removeFirst():獲取鏈表中的第一個元素,但是會刪除鏈表中的第一個元素。如果鏈表為空,拋出 NoSuchElementException removeLast(); 在 jdk1.6 以后。 pollFirst();獲取鏈表中的第一個元素,但是會刪除鏈表中的第一個元素。如果鏈表為空,返回 null。 pollLast(); ~~~ ### Set接口 當元素的 hashCode 值相同時,才繼續判斷元素的 equals 是否為 true。 ~~~ TreeSet: 用于對 Set 集合進行元素的指定順序排序,排序需要依據元素自身具備的比較性。 如果元素不具備比較性,在運行時會發生 n ClassCastException 異常。 所以需要元素 實現 e Comparable 接口,強制讓元素具備比較性, 復寫 o compareTo 方法。 ~~~ ### Map集合 – Hashtable :底層是哈希表數據結構,是線程同步的。不可以存儲 null 鍵,null 值。 – HashMap :底層是哈希表數據結構,是線程不同步的。可以存儲 null 鍵,null 值。替代了 Hashtable. – TreeMap :底層是二叉樹結構,可以對 map 集合中的鍵進行指定順序的排序。 ### 把 把 p map 集合轉成 t set 的方法 Set keySet(); Set entrySet(); //取的是鍵和值的映射關系。 ~~~ 取出 p map 集合中所有元素的方式一 : keySet() 方法。 可以將 map 集合中的鍵都取出存放到 set 集合中。對 set 集合進行迭代。迭代完成,再通過 get 方法對獲取 到的鍵進行值的獲取。 Set keySet = map.keySet(); Iterator it = keySet.iterator(); w w hile(it.hasNext()) { { Object key = it.next(); Object value = map.get(key); System.out.println(key+":"+value); } } 取出 p map 集合中所有元素的方式 二 : entry Set() 方法。 Set entrySet = map.entrySet(); Iterator it = entrySet.iterator(); while(it.hasNext()) { Map.Entry me = (Map.Entry)it.next(); System.out.println(me. getKey()+"::::"+me. getValue()); ~~~ ### 使用集合的技巧: ~~~ 看到 Array 就是數組結構,有角標,查詢速度很快。 看到 link 就是鏈表結構:增刪速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast(); 看到 hash 就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到該結構的中的元素必須覆蓋 hashCode,equals 方法。 看到 tree 就是二叉樹,就要想到排序,就想要用到比較。 比較的兩種方式 : 一個是 Comparable : 覆蓋 o compareTo 方法 ; 一個是 Comparator : 覆蓋 e compare 方法。 LinkedHashSet,LinkedHashMap:這兩個集合可以保證哈希表有存入順序和取出順序一致,保證哈希表有序。 集合什么時候用? 當存儲的是一個元素時,就用 Collection。當存儲對象之間存在著映射關系時,就使用 Map 集合。 保證唯一,就用 Set 。不保證唯一 , 就用 List ~~~ ### 雙列集合 Map ~~~ Map map = new HashMap(); map.put("a", "aaa"); // 傳統方式:必須掌握這種方式 Set entrys = map.entrySet(); // 1.獲得所有的鍵值對 Entry 對象 iter = entrys.iterator(); // 2.迭代出所有的 entry while(iter.hasNext()) { Map.Entry entry = (Entry) iter.next(); String key = (String) entry.getKey(); // 分別獲得 key 和 value String value = (String) entry.getValue(); System.out.println(key + "=" + value); } ~~~ ### 泛型 當類中的操作的引用數據類型不確定的時候,以前用的 t Object 來進行擴展的,現在可以用泛型來表示。這樣可以避免強轉的麻煩,而且將運行問題轉移到的編譯時期。 ~~~ class Tool<Q> { private Q obj; public void setObject(Q obj) { this.obj = obj; } public Q getObject() { return obj; } } ~~~ ### Data和日歷類 將日期字符串轉換成日期對象 :是 使用的就是 DateFormat 方法中的 Date parse(String source) ~~~ public static void method(){ Calendar c = Calendar.getInstance(); System.out.println(c.get(Calendar.YEAR)+"年"+(c.get(Calendar.MONTH)+1)+"月" +getNum(c.get(Calendar.DAY_OF_MONTH))+"日" +"星期"+getWeek(c.get(Calendar.DAY_OF_WEEK))); } public static String getNum(int num){ return num>9 ? num+"" : "0"+num; } public static String getWeek(int index){ /* 查表法:建立數據的對應關系. 最好:數據個數是確定的,而且有對應關系。如果對應關系的一方,是數字,而且可以作為角標,那么可以 通過數組來作為表。 */ String[] weeks = {"","日","一","二","三","四","五","六"}; return weeks[index]; } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看