java基礎(一)基礎認識、資料型別
基礎知識
1.所有的java程式碼必須寫在類裡面,java的入口函式 main方法
public static void main(String[] args){ }
public ----訪問修飾符
static ----方法是靜態的
final 最終的修飾變數的時候需要賦初始值, 並且在修飾類的時候 該類是不能被繼承的;
main-----方法名
String[] args -----引數;
變數和常量
eg: a=1; a=2; 變數a --- 隨時可變 常量 12 ----不可變
2.宣告一個變數的方式為:
資料型別 變數名; 也可以一開始給以個變數賦值,
資料型別 變數名 = 常量(或者另一個變數);
3.class類:
通過類建立物件的方式: 資料型別 變數名=new 構造方法();
this關鍵詞 指向使用物件; 當引數名和屬性名相同的時候主要用來區分引數名和屬性名,加了this代表屬性名;
原則:屬性私有化,方法公開化;如果寫公共的方法與類沒關係的方法可以
使用static方法,缺點,靜態方法不能使用類當中的非靜態成員; 一檔被修飾靜態成員,可以直接用類名來呼叫;
4.JVM 分為堆 棧 方法區3部分
堆:以new關鍵詞建立的物件;JDK1.7開始 字串常量池也移到堆區中存放;
棧:以棧幀的形式存在,每呼叫一個方法,建立一個站幀,其中儲存臨時變數和引數;
方法區:儲存所有靜態成員,(static修飾的);所有類的資訊;如果引數是基本型別,那麼傳遞的是值,如果是引用型別,傳遞的是指向堆區中的記憶體地址;
5.陣列:在定義的時候必須宣告陣列的長度;陣列在使用中 可以使用for迴圈;
還可以使用 for(int i : a){ i一個一個便利陣列a中的值
}
對陣列中的值進行排序;氣泡排序:規則,相鄰元素兩兩比較交換位置;
選擇排序:先選出一個最小的或者最大的 放到邊界;
6.數學函式:Math.pow(a,b); a代表的是底數. b代表的是指數;
7.Scanner 掃描器 java.util包下;
Scanner scanner = new Scanner(System.in);從控制檯接收輸入的內容;
.next();接收下面一次要輸入的內容;(一行為單位)
.nextInt();接收輸入下面要輸入的一次數字;(以行為單位)
.nextLine();接收下一次輸入的一行內的資料;(以行為單位)
.next()和nextInt() 不能和nextLine()同時使用
每一行結束的時候,我們手動輸入了 換行"\r" 但是用next() 和nextInt()接收的時候,只會接收前面輸入的內容, 而把"\r"留下, 而nextLine() 只要見了"\r" 就會預設有一行(會接收);
8.異常:執行期出現的錯誤:觀察錯誤的名字和行號最重要;
java異常是java提供的處理程式中錯誤的一種機制,程式在執行過程中出現了異常事件,可以生成一個異常類物件,改異常物件封裝了異常事件的資訊並將被提交給java執行時系統這一過程成為丟擲(throw)異常;
當java執行時系統接收到異常物件時,會尋找能處理這一異常的程式碼,並吧當前的異常物件交給處理,這一過程稱為 捕獲(catch)異常;
.try{可能出現異常的程式碼;
}catch(cException ae){
一旦try中出現了異常,則執行catch
}finally{
無論怎麼都會執行final;
}
catch塊中必須有和try塊中相同的return();並且先finally之後 最後返回return;
異常分類(Throwable)
Error : 稱為錯誤,有JVM丟擲,包括動態連結失敗,虛擬機器錯誤等,程式不對其做處理;
Exception : 所異常類的父類,一般需要使用者顯式的宣告或者捕獲
RuntimeException:一類特殊的異常,如陣列下標超出等,產生比較頻繁,處理麻煩,(一般可以有系統自動檢測使用者可不必對其處理)
9.Math類 java.lang.Math;提供了一系列靜態方法用來科學計算,方法的引數和返回值一般為double型別;
abs()絕對值
acos,asin,atan,cos,sin,tan
sqrt()平方根;
pow(double a,double b)a 的b次冪;
log();自然對數;
max(double a,double b);
min(double a,double b);
random()返回0.0---1.0的隨機數;
toDegrees(double angrad);弧度-->角度;
toRadians(double angdeg);角度--->弧度;
10.Enum列舉型別
只能夠取待定值中的一個;
使用enum關鍵字;
是java.lang.Enum型別;
11.重寫equals()
來比較兩個物件是不是相同,其中判斷的規則可以根據需求自己定義;
12.Comparable 泛型介面
compareTo() 用來自定義排序規則; 大於 rerun 1 等於 return 0 小於 return-1;
資料型別
java的資料型別分兩種
1.基本型別:
byte 1位元組 8位
short 2位元組 16位
int 4位元組 32位
long 8位元組 64位
float 4位元組
double 8位元組
boolean 1位元組
char 2位元組
2.引用型別:
類 (string 屬於類)
陣列
介面
3.原始碼 反碼 補碼
原始碼-----原數本身;
反碼------符號位不變,其他位取反
補碼------反碼+1
補碼專門用來表示負數,負數的補碼為反碼+1, 正數的補碼就是自己本身;
4.運算子:
數學運算子:+ - * / % ++ --; a++先運算 後增加,++a 先加價再運算;
關係運算符:> < == <= >= != 計算出的結果是boolean型別
邏輯運算子: ! && || & | 對boolean型別進行計算
短路語: 只要前一個條件能計算出表示式的值後面都不會再進行;
全路語: | & 需要走完全部的路程;
位運算: & | ^ >> << >>> <<< 全部2進位制位數都移動
5.if條件語句/迴圈語句;(迴圈三要素:計數器 迴圈條件 計數器更新)
switch case: 迴圈,break;
迴圈
while() for(); do{程式碼塊} while{迴圈條件};
6.強制型別轉換;
int i=128;
byte j=(byte)i;
char a=(char)i; a計算出的為ASCII碼;
7.String(字串)型別
String name = new String(); 使用new 建立;
String name = "張三"; 直接賦值, String 的底層是字元陣列;
String 之間可以運算, 實現字串的拼接;
String a="asdf";
String b="ads";
方法:toUpperCase() 大寫轉換;
float 精確為小數點之後7位;
double
8.包裝類(在比較數字的時候一定要拆包裝, 使用)integer在進行比較的時候,如果在8位
以內(-128---127)預設有一個快取,物件會指向快取的地址;
通常情況下,類下的屬性都應該定義成包裝類;
包裝類都是引用型別;
byte 1位元組 Byte
short 2位元組 Shot
int 4位元組 Integer
long 8位元組 Long
float 4位元組 Float
double 8位元組 Double
boolean 1位元組 Boolean
char 2位元組 Character
Integer.paseInt(str); 將字串中數字轉換成Int資料型別的數字;
9.String字串:
底層是char陣列:
equals() 比較兩個字串的值是不是一致;
String.valueOf();強制型別轉換; 引數為Object;
陣列的長度length();
substring();擷取字串;一個引數的時候為開始擷取的位置到結束.當引數為兩個的時候,第一個為開始的位置,第二個引數為結束的位置;
replace();替換陣列中的元素;第一個引數傳要被替換的字元,第二個引數傳替換之後的字元;
replaceAll();替換陣列中全部選定的元素;第一個引數傳 匹配的正則表示式,第二個引數傳替換成什麼字串;
拼接字串:
StringBuilder(); 非執行緒安全; 單執行緒拼接的時候使用;
append(" ");追加字元;
StringBuffer(); 執行緒安全; 多執行緒拼接的時候使用;
append(" ");
String+=的拼接方式 在jdk1.8的時候已經被優化,效能已經等同於StringBuilder();但是在開發中禁止使用;
instanceof 判斷型別是否相同
陣列
1.定義:在堆區中建立一個連續的記憶體空間來儲存物件或者變數;
2.定義方式:
資料型別+[] 物件名=new 資料型別+[陣列長度] //定義的時候不賦值
資料型別+[] 物件名={元素,元素} //定義的時候賦值
訪問方式
物件名[陣列的下標] 下標從0開始;
陣列長度
陣列名.length
增強for
for(資料型別 變數 : 陣列物件){
方法體
}
3.排序:
氣泡排序,相鄰兩數互相比較,兩兩交換;
選擇排序:用第一個和後面每一個比較;
陣列的缺點:長度是固定的; 陣列在擴容的時候不方便;
用final 修飾的String 是不能被繼承的
4.集合
(1) ArrayList()------屬於java.util包;若要提升效能,可以在引數中直接寫出要新增的個數,固定size();的長度即可;
List ----------------
構造方法---如果不傳引數,預設底層陣列的長度是10;
如果有引數,底層陣列長度和所傳引數相同;
add()方法--代表向集合中新增元素,每新增一個 size 加1;
--當有兩個引數的時候第一個為索引值,第二個為資料值
remove()方法,引數為索引值,
list.contains()傳入一個元素,判斷是否存在這個元素;
size方法--返回集合的長度(新增才算) 一旦長度超過底層陣列長度 這自動擴充套件,每次擴充套件的容量為 原長度的1.5倍;
get方法--傳下標,
ArrayList---遍歷,
增強for
for(Object a:array){}
普通
for(int i=0;i<arr.size();i++ {}
迭代器迭代:
Iterator it = list.iterator();
while(it.hasNexe()){
Syso(it.next);
}
(2).HashSet(); 無序 去重複; 不能通過get()取出;
Set();
remove(); 引數傳遞的是數值;
(3).HashMap();
對映----鍵值對;
put( , )方法--存放---引數的型別為Object---存放的過程中(鍵)key不可重複; 值可以重複;
get(key)方法----獲取---獲取的過程引數為key;
containsKey();判斷是不是存在這個key;
containsValue(); 判斷是不是存在這個值value ;
hashMap()不支援增強for迴圈;
HashMap map = new HashMap();
5.二維陣列:看成以陣列為元素的陣列----多維陣列的宣告和初始化,應該從高維到低維的順序進 行;
靜態初始化: int intA[][] = {{1,2},{2,3},{3,4,5}};
動態初始化: int a[][] = new int[3][5];
int b[][] = new int[3][];
b[0] = new int[2];
b[1] = new int[3];
陣列的拷貝:
使用java.lang.System類的靜態方法;arraycopy
System.arraycopy(s,0,sbak,0,s.length)各引數分別代表 s為從哪個陣列複製,0代表從s的0號索引開始複製 , 然後複製到 sbak陣列的0號索引開始,長度為s.length;
6.泛型集合:
規範了資料型別的集合;再定義的時候型別後用<規定的型別> 注意.泛型中不能使用基本型別;(但是可以用包裝類替代)
例如 List <String> list = new ArrayList(); 規範了該物件只能存放String型別的元素,從Jdk1.7之後支援泛型推導,但是在在JKD1.7之前是不能被識別的,必須完整寫,例如:
List <String> list = new ArrayList<String>();
Set<String> set = new HsahSet<String>();
Map<Integer , String> map = new HashMap<Integer , String>();
7.二分查詢
前提條件:一個排序完整的陣列才可以使用;