1.Math.random Math.random()*10 輸出隨機變數方法,使用:"Math.random()*數量" 如:(int)(Math.random()*10); //隨機取一個10以內的整數 例如:定義一個隨機1到5(取不到5)的變數 [1,5) Math.random()*(n-m ...
1.Math.random
Math.random()*10 輸出隨機變數方法,使用:"Math.random()*數量"
如:(int)(Math.random()*10); //隨機取一個10以內的整數
例如:定義一個隨機1到5(取不到5)的變數 [1,5)
Math.random()*(n-m)+m,生成大於等於m小於n的隨機數;
int number=(int)(Math.random()(5-1)+1); int number = (int)(Math.random()4+1);取值正好是[1,5)
2.length
length() 方法用於返回字元串的長度。
1 //例 2 public class Test { 3 public static void main(String args[]) { 4 String Str1 = new String("www.runoob.com"); 5 String Str2 = new String("runoob" ); 6 7 System.out.print("字元串 Str1 長度 :"); 8 System.out.println(Str1.length()); 9 System.out.print("字元串 Str2 長度 :"); 10 System.out.println(Str2.length()); 11 } 12 } 13 //隨機輸入一個100以內數組 14 int[] arr=new int[10]; 15 for(int i=0;i<arr.length;i++){ 16 int value= (int)Math.random()*100; 17 arr[i]=value; 18 } 19 System.out.println(Arrays.toString(arr));
(Scanner/if/equals)
1.equals
使用方法 ''變數1.equals(變數2)” //變數一定要保證有一個具體的數據,排除null值
2.Math.pow
Math.pow(數字,幾次冪) 使用:sum=Math.pow(3,2);
3.Math.PI=3.14
4.Sanner
Sanner input = new Scanner(System.in); //需要導包,程式開頭加 "import java.util.*";(*可以換成Scanner)
*使用:int 變數 = input.nextInt(); //讀一個int netxDouble/Float/Byte/Short() 只能讀取空格之前的內容(空格後的數據會保留傳給下一個變數),游標依然在10的後面 String 變數 = input.nextLine(); //讀一個字元串 String 變數 = input.next(); //只能讀取空格之前的內容(空格後的數據會保留傳給下一個變數)
*如果使用netxLine之前有netxDouble/Float/Byte/Short/next(),nextLine只能讀到一個換行,不讓用戶錄入數據,使用netLine()或者添加一行"input.nextIine();"解決
5.boolean嵌套
合理使用boolean嵌套,優化程式
6.debug部分快捷鍵
debug調試:雙擊添加斷點,F6:逐行運行程式,F5:進入底層代碼,F8:運行到下一個斷點
*input.close()//關閉該變數,會關閉該程式所有的該變數
>簡單登入系統??
1 while("n".equals(answer)) { 2 System.out.println("輸入賬號"); 3 answer = input.nextLine(); 4 } 5 if("y".equals(answer)) { 6 System.out.println("********"); 7 }
衛語句
例:
1 if (true){ 2 if (true){ 3 if (true){ 4 for (){ 5 if (true){ 6 業務代碼 7 } 8 } 9 } 10 } 11 }
在有比較複雜的判斷和需要遍歷處理業務時候,經常會出現上面這種情況,這些代碼在執行起來是沒問題。但是這樣的代碼是一次性代碼,過一段時間,可能自己都不敢動這裡的邏輯了,更何況下一個接盤俠呢。 這樣的代碼很難弄明白每個條件的作用和執行的流程,當你讀到最裡面一層的時候,估計你已經記不起來當初是為什麼走進這個if的了,對代碼的執行流程完全不可控了。因為執行你預期的流程並不明顯,為了簡化這種情況,需要將特殊情況隔離到立即結束執行的單獨條件中。 這樣就能把箭頭代碼給拉平.
if (false){ } if (false){ } if (false){ } for (){ if (false){ continue; } 業務代碼 }
這是其中一類,可以將失敗前置。只要有一個條件不通過,就快速返回失敗,如果到了最後一行,說明所有判斷都通過,剩下的就是你預期的結果。而不是一直查成功。
if(obj != null){ doSomething(); } 轉換成衛語句以後的代碼如下: if(obj == null){ return; } doSomething();
(排序/數組)
1.數組
使用:
初始化: 數據類型[] 變數名 = new 數據類型[length]
int[] array = new int[3]; // 空間大小為3的array數組
int[] array = {a,b,c,d,e};
2.Aeeays
2.1Arrays.toString
Arrays:將數組元素轉換成字元串進行列印(需要導包)
使用:Arrays.toString(數組名)
數組.length:獲得數組長度
二維數組不能直接使用,需要Arrays.deepToString(二維數組[]);
2.2Arrays.copyOf
複製數組元素到新數組
int[] newArray = Arrays.copyOf(源數組,新數組的長度);
2.3Array.equals
比較數組元素是否一致
例:System.out.println(Arrays.equals(arr1,arr2));
*數組間不能以"=="或者"equals"直接比較,這樣比較的是數組的地址
5.增強for迴圈
foreach:for(數組元素數據類型 變數:數組變數名稱)
將數組裡面的每個元素賦值給變數,不能索引具體元素
6.冒泡法
1 for(int i=1;len = arrlength;i<len;i++){ 2 for(int j=0;j<len-i;j++){ 3 //相鄰元素互相比較 4 if(arr[j]>arr[j+1]){ 5 //交換位置 6 int temp = arr[j]; 7 arr[j] = arr[j+1]; 8 arr[j+1] = temp; 9 } 10 } 11 } 12
7.選擇排序
1 for(int i=0,len = arr.length;i<;en-1;i++){ 2 int min = arr[i]; 3 int minIndex = i; 4 for(int j=i+1;j<len;j++){ 5 if(min>arr[j]){ 6 min = arr[j]; 7 minIndex = j; 8 } 9 } 10 } 11
8.插入排序(升/降)
1 for(int i=1,len = arr.length;i<len;i++){ 2 int temp = arr[i]; 3 int leftIndex = i-1; 4 while(leftIndex>=0 && arr[leftIndex]>temp){ 5 arr[leftIndex+1] = arr[leftIndex];//左邊元素要移動,大數向右 6 leftIndex--; 7 } 8 arr[leftIndex+1] = temp; 9 } 10 倒敘 11 for(int i=1;i<arr1.length;i++) { 12 int space = arr1[i];// 取第二個數 13 int left = i-1;//=指向第一個數 14 while(left>=0 && arr1[left]<space) { 15 arr1[left+1] = arr1[left];// 小數向右移 16 left--;// 找回指向空格的索引 17 } 18 arr1[left+1] = space; //填空 19 }
9.Arrays.sort(數組變數); //升序
使用:
int[] a = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5};
Arrays.sort(a);
9.1Arrays.sort區間排序
Arrays.sort(int[] a, int fromIndex, int toIndex)
這種形式是對數組部分排序,也就是對數組a的下標從fromIndex到 toIndex-1的元素排序,註意:下標為toIndex的元素不參與排序。
int[] a = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5}; Arrays.sort(a, 0, 3); for(int i = 0; i < a.length; i ++) { System.out.print(a[i] + " ");
方法
1.方法
1.1訪問許可權修飾符:public/private/protectde/預設
1.2普通修飾符(關鍵字) : static/final/abstract
1.3返回值類型
有返回值類型 所有數據類型
無返回值 void
1.4方法名(駝峰):唯一的,不可重覆的
1.5(形式參數):任意數據類型,有返回參數必須return相同類型返回值
1.6 {方法體}
2.調用方法:
靜態方法和c一樣。
僅適用於數組:有參無返回值調用是直接調用地址,被調用變數的最終結果可能會被其他方法改變。(具體調用是否改變可見源碼是否調用地址)
2.1 有多個參數(附衛語句例/登入):
1 public static void userLogin(String usename,String password){ 2 String name = "admin"; 3 String pass = "admin"; 4 5 //校驗username與password 6 if(username==null || password==null){ 7 System.out.println("參數不允許為null"); 8 return; 9 } 10 11 if(!neme.equals(username) || !pass.equals(password)){ 12 System.out.println("用戶名或密碼不對"); 13 } 14 15 System.out.println("登陸成功"); 16 System.out.println("執行成功之後的代碼。。。。。"); 17 }
2.2可變參數:
1 test(); 2 3 //可變參數->同一種數據類型 例:數據類型...變數名 4 //nums 是可變參數 >=0個實際參數 實際為一個數組 5 public static void test(int...nums){ 6 System.out.println(nums[0]); 7 System.out.println(nums[1]); 8 System.out.println("nums:"+Arrays.toString(nums)); 9 }
2.3 方法重載 overload
在一個類(java文件),可以存在多個方法名一樣的方法。
-
方法名相同
-
形參的順序(形參列表不一致)
-
與返回值和修飾符無關
(類與對象)
1.不同方法調用同一個成員變數?
創建成員屬性
2.無參&有參構造方法
快捷鍵:alt+shift+s+c(生產無參構造)
例:調用帶參/無參構造方法
成員變數 = 全局變數
1 public class Person { 2 3 public int id; 4 public String name; 5 6 //預設的無參構造方法 7 //構造方法與類名一致 8 //[訪問許可權修飾符] 類名() {} 9 10 //預設存在 11 //1.幫助創建對象 12 //2.初始化成員變數 13 public Person() { 14 // id = 1001; 15 // name = "jim"; 16 } 17 //在創建對象的時候就對成員變數賦值 有參構造 18 //方法重載 19 //方法名相同 形參列表不同 20 //與返回值 修飾符無關 21 //構造方法重載 22 public Persion(int pid,String pname){ 23 id = pid; 24 name = pname; 25 } 26 } 27 } 28 public class PersonTest { 29 public static void main(String[] args){ 30 Person person = new Person(); 31 System.out.println("姓名"+person.name); 32 //使用有參構造進行創建對象 33 Person person2 = new Person(1002,"tom"); 34 System.out.println("person2姓名:"+person2.name); 35 } 36 }
(封裝)
1.預設修飾符只能在本包內訪問
修飾符為public時可以訪問別的包的成員變數
2.private:只能在本類中被調用
setter&getter中不允許添加其他業務邏輯,會增加維護難度
快捷鍵生成:alt+shift+s+r
3.lombok
3.1.在使用@Setter能否再另外添加別的set方法?
a:可以,手動寫的可以覆蓋掉註釋里的Setter/Getter
3.2.lombok.jar類庫文件
通過註解構建一個全功能的文件:@名稱
例:@Sette @Getter(生成set/get方法)
@NoArgsConstructor(生成無參構造)
@AllArgsConstructor(生成有參構造)
@ToString
@cleanup(程式運行之後關閉input,不建議使用)
4.static(作用:修飾成員變數和成員方法)
4.1.靜態方法只能訪問靜態成員
靜態成員變數數據是共用的(且只能在本類中調用,使用其他類調用時需要先調用靜態成員變數所在方法)
4.2.*靜態代碼塊:static{代碼} //有且只走一次
4.3.非靜態代碼塊:{代碼}
會伴隨類執行。
4.3.優先度
靜態代碼塊 > 非靜態代碼塊 > 構造方法
4.4.static修飾成員變數
static修飾成員變數時,該變數數據可以讓所有類的對象共用。
5.單例模式/餓漢模式/懶漢模式
userinfo&~test
5.1.單例模式
1.將構造方法改為prevate修飾
2.提供一個靜態的成員變數,並初始化成員變數
3.提供靜態方法,獲得此類的對像
5.2.餓漢模式(開發不推薦)
1 private static ShoopingCar shoppingCar = new ShoppingCar; 2 public static ShoppingCar gatShoppingCar(){ 3 return shoppingCar; 4 }
1.不管是否使用變數,都會執行初始化操作,沒有體現出懶載入的思想
2.沒有線程安全問題
5.3懶漢模式
1 private static ShoppingCar shoppingCar; 2 public static ShoppingCar getShoppincar(){ 3 if(shoppingCar==null){ 4 shoppingCar = new ShoppingCar; 5 } 6 return shoppingCar; 7 }
1.什麼時候使用對象 什麼時候執行初始化操作
2.有線程安全問題
5.4枚舉(多例/開發常用)
6.this
6.1.在本類里訪問無參/有參構造:
使用:this(); //必須在代碼第一行
6.2.this可以充當實際參數
(瞭解)因為他是個對象。