1. 程式人生 > >Java基礎筆記1——變數、迴圈、陣列

Java基礎筆記1——變數、迴圈、陣列

Java基礎筆記1
一.初識Java
Java SE:Java Platform Standard Edition Java平臺標準版
Java EE:Java Platform Enterprise Edition Java平臺企業版
Java ME:Java Platform Mircro Edition Java平臺微型版
Java語言特性:簡單、安全、面向物件、跨平臺、多執行緒
面向物件特徵:多型、繼承、封裝
JDK=Java Development Kit Java開發工具包
JRE=Java Runtime Environment Java執行時環境
JVM=Java Virtual Machine Java虛擬機器——跨平臺(可移植性)的基礎
Java可移植性的基本原理:java用編譯器編譯成位元組碼,位元組碼用直譯器執行,同一位元組碼可以在不同的作業系統下被不同的直譯器執行,從而實現Java的跨平臺性也就可移植性.
Eclipse簡介:SUN公司耗資4000萬美金開發,是開源的整合開發環境。
Eclipse本身是一個實時編譯
Eclipse常用快捷鍵
注意:快捷鍵可能和搜狗輸入法衝突,需先取消搜狗輸入法的快捷鍵設定
Alt + / 快捷提示鍵
ctrl+/ 單行註釋或取消單行註釋
ctrl + shift + / 多行註釋
ctrl + shift + \ 取消多行註釋
Ctrl + D 刪除整行
Ctrl + Z 撤銷上一步操作
Alt + ↑ 整行上移
Alt + ↓ 整行下移
Ctrl + Alt + ↑ 複製整行,把複製的放在原來的程式碼上面
Ctrl + Alt + ↓ 複製整行,把複製的放在原來的程式碼下 面
Alt + Shift + S 開啟source (選擇Format可以調整格式)
Ctrl + Shift + F 快速調整格式
Ctrl+shift+o 自動導包(輸完需導包的語句後)
Ctrl+O 移動滑鼠到類名,用此快捷鍵可以顯示類中方法和屬性的大綱,能快速定位類的方法和屬性。
Ctrl+M 當前視窗最大化和還原
Ctrl+K 快速向下查詢選定的內容
Ctrl+shift+K 快速向上查詢選定的內容
Ctrl+Shift+T 通過關鍵字快速查詢工作空間(Workspace)裡的.class檔案,可以使用“*”、“?”等萬用字元
Ctrl+Shift+R 查詢工作空間(Workspace)中的所有檔案(包括Java檔案),也可以使用萬用字元
ALT+Shift+W 點選Package Explorer可以快速定位包檢視的位置,點選System Explorer開啟檔案所在專案中的路徑,Outline→大綱
Ctrl+L 定位到當前編輯器的某一行
Alt+← 後退歷史記錄
Alt+→ 前進歷史記錄
F4 顯示類的繼承關係,並開啟類繼承檢視
F3 快速定位游標位置的某個類、方法和屬性
Ctrl+Shift+B 在當前行設定斷點或取消設定的斷點
F11 除錯最後一次執行的程式
Ctrl+F11 執行最後一次執行的程式
F5 跟蹤到方法中,當程式執行到某方法時,可以按【F5】鍵跟蹤到方法中
F6 單步執行程式
F7 執行完方法,返回到呼叫此方法的後一條語句
F8 繼續執行,到下一個斷點或程式結束
Ctrl+Shift+X 把當前選中的文字全部變為小寫
Ctrl+Shift+Y 把當前選中的文字全部變為大寫
Alt+Shift+R 重新命名,自動定位所有同名,全部修改,enter鍵完成操作
Alt+Shift+Z 為選中內容新增常用結構,如try…catch/finally、for、while、if迴圈
Alt+Shift+M 快速抽取方法
Alt+Shift+L 快速抽取返回值
Ctrl+1 將游標放在;後面按ctrl+1,彈出 Assign statement to new local varible,enter即可自動生成返回值物件
Ctrl+Shift+Delete快捷鍵用於清除瀏覽器快取。
安裝Eclipse,需先安裝JDK,配置環境變數JAVA_HOME及path(和classpath)。
java中path的作用:path 是一個環境變數, 路徑,是java編譯時需要呼叫的程式(如java,javac等)所在的地方
classpath 類的路徑,在編譯執行java程式時,如果有呼叫到其他類的時候,在classpath中尋找需要的類。
 磁碟作業系統(Disk Operating System)
開啟方式:1.快捷鍵——系統鍵+R,輸入“cmd”,Enter
2.右鍵開始選單,點選“執行”,輸入“cmd”,Enter
DOS命令符:
不區分大小寫
D: 直接切換到D盤
cd Program Files 進入當前碟符目錄Program Files
cd. 當前目錄
cd… 向上退一層
cd/ 直接退回到根目錄
dir 顯示當前目錄詳細資訊
md 在當前路徑建立目錄(資料夾)
mkdir 在當前路徑建立目錄(資料夾)
rmdir 移除目錄
javac 編譯java檔案的命令,生成class檔案
javadoc 提取/** */註釋,輸出的是一個HTML檔案
javac -d ./ 在當前java檔案所在目錄下建子檔案,檔名與package名一致
javap 檢視程式的底層執行過程
javah 和c/c++語言互動
javaw 檢視java程序
exit 退出DOS視窗
calc 開啟計算器
notepad 開啟記事本
mspaint 開啟畫圖工具
jar cvf Im.jar/ 壓縮jar包
netstat -ano 列出所有埠的情況
netstat -aon|findstr “49157” 檢視被佔用埠對應的PID(其中49157是埠號)
tasklist|findstr “2720” 檢視是哪個程序或者程式佔用了2720埠
taskkill /f /t /im Tencentdl.exe 結束Tencentdl.exe程序
①在沒有package的情況下可以直接編譯執行java檔案。

②執行package下的java檔案,需要
javac -d ./ 在當前目錄建立包名資料夾存放.class檔案

Java生成檔案字尾.java,編譯檔案字尾.class
批處理檔案字尾.bat
可執行檔案字尾.exe
java中所有的關鍵字都是小寫的。
Java關鍵字
abstract抽象的 assert斷言 boolean布林 break打斷 byte位元組
case例項,情況 catch捕獲 char字元型 class類 const常量
continue default預設值 do做,執行 double雙倍的 else其它
enum列舉 extends繼承 final最終的 finally最後 float浮點型
for goto轉到 if假如 implements元素 import匯入
instanceof例項,運算子 int整數型 interface介面 long長整型 native本來的
new新的 package包 private私有的 protected受保護的 public公共的
return返回 strictfp精準 short短整型 static靜態的 super超級的,父類的
switch轉換 synchronized同步的 this這個 throw拋 throws(複數)丟擲
transient短暫的 try嘗試 void無返回值 volatile爆炸性的,不穩定的 while當……的時候

資料Data在計算機中的表現形式:
二進位制binary/'baɪnərɪ/ 
八進位制octonary/'ɒktə(ʊ)n(ə)rɪ/
十進位制decimal/'desɪm(ə)l/ 
十六進位制hexadecimal/,heksə’desɪm(ə)l/
位元組是計算機資訊科技用於計量儲存容量的一種計量單位。
1位元組=8位(二進位制數)
1KB=1024Byte(位元組)
1MB=1024KB
1GB=1024MB
二、變數
變數的訪問:
1.未經宣告的變數不能使用
2.變數初始化後才能使用
3.變數超出作用域會報錯(作用域在定義變數{}裡)
4.一條語句可以宣告多個同類型變數,如int a=1,b=2,c=3;
5.可以對變數的值進行儲存操作。如int a=1;a=a+100;
6.變數的操作必須與型別匹配
7.賦值運算子=;等於==
特殊字元如果要表示成普通字元,需要用 \ 轉義,如"\t"表示製表符。
變數名稱不能用關鍵字。變數可以用”_”、”$”及字母、數字表示,但不能以數字開頭。
命名遵循駝峰命名法,首字母小寫,後面單詞首字母大寫。
包名package命名單詞直接用“.”隔開。
不同值型別有不同取值範圍。
boolean型別,1個位元組,取值範圍:true/false
byte型別,1個位元組,取值範圍:-128~127
short型別,2個位元組,取值範圍:-32768~32767
char型別,2個位元組,取值範圍:0~65535,採用Unicode字符集編碼
char a=’A’; //字元直接量
char b=65; //整型直接量
char c=’\u0041’; //Unicode字元的十六進位制形式
A-Z整型表示:65-90
a-z整型表示:97-122
0-9整型表示:48-57
int型別,4個位元組,取值範圍:-2147483648~2147483647,數值預設型。運算超出範圍溢位。
long型別,8個位元組,取值範圍:-263~263-1,表示形式:加字尾l或L
在java虛擬機器中整數有byte、short、int、long四種 分別表示 8位、16位、32位、64位有符號整數。整數使用補碼錶示。
float型別,4個位元組,取值範圍:float的取值範圍: 負無窮 ~ −2128,−2−149 ~ 0 ~ 2−149,2128 ~正無窮,表示形式:加字尾f或F
double型別,8個位元組,取值範圍:-Infinity(負無窮) ~21024 , −2−1074 ~ 0 ~2−1074 ,21024~Infinity(正無窮),當運算結果超出範圍,顯示infinity或-infinity.
小數避免做精確判斷。
運算型別小於int型會自動轉換。
運算溢位不報錯,應儘量避免。
正數過大溢位結果為負數,負數過大溢位結果為正數。
預設編碼:GBK
注意:位移運算僅針對整數。
!(非):只需要一個運算元,如果運算元為true則返回false,如果運算元是false,則返回true。
^(異或):兩個運算元不同時返回true,否則返回false。
==(等於)
&&(與)短路
&(與)不短路:判斷整個表示式
||(或)短路
|(或)不短路
位運算子
① &:按位與——兩個運算元都是1,結果才為1,否則為0
② |:按位或——兩個位只要有一個1,結果就是1,否則為0
③ :按位非——位為0,結果是1;位為1,結果是0,規律:

i = -i-1,例~2=-3;
④ ^:按位異或——位相同結果為0,不同結果為1
⑤ <<:左移
⑥ >>:右移
⑦ >>>:無符號右移
<<n左移n位,值×2n,高位捨棄,低位補0。>>n右移n位,值÷2n,高位補符號,正數為0,負數為1,低位捨棄。
正數的原碼、反碼、補碼一致,負數反碼是原碼的絕對值取反,補碼是反碼+1。所有運算都是以補碼的形式進行,負數運算結束值減1,取反得到原碼即結果。
2的補碼:0000 0010,~非運算後1111 1101,減1得1111 1100,取反1000 0011。注意符號位不參與取反。
經典案例:-2>>1結果為-1;-2>>>1結果為2147483647
int型有32位
-2二進位制表示:1000 0000 0000 0000 0000 0000 0000 0010
-2反碼:1111 1111 1111 1111 1111 1111 1101
-2補碼:1111 1111 1111 1111 1111 1111 1110
右移一位:1111 1111 1111 1111 1111 1111 1111 1111
減1後: 1111 1111 1111 1111 1111 1111 1111 1110
取反得結果:1000 0000 0000 0000 0000 0000 0000 0001 即-1

無符號右移,移位後符號位始終補0:0111 1111 1111 1111 1111 1111 1111 1111
正數原碼、反碼、補碼一致,所以結果為:0111 1111 1111 1111 1111 1111 1111 1111
230+229+……20=2147483647
運算子優先順序
優先順序 名稱 運算子
1 分隔符 . [] () , ;
2 單目運算子 ++ – ~ !
3 強制型別轉換運算子 (type)
4 乘法/除法/求餘運算子 * / %
5 加法/減法運算子 + -
6 移位運算子 << >> >>>
7 關係運算符 < <= > >= >instanceof
8 等價運算子 == !=
9 按位與運算子 &
10 按位異或運算子 ^
11 按位或運算子 |
12 條件與運算子 &&
13 條件或運算子 ||
14 條件三目運算子 ?:
15 賦值運算子 = += -= = /= &= |= ^= %= <<= >>= >>>=
運算順序:從右看向左 i=5, i+=i-=i
=++i;
i=5+(5-(5*6))=-20
整數/0 — ArithmeticException
非零小數/0 非零數字/0.0 Infinity
0.0/0 0/0.0 0.0/0.0 NaN
產生隨機資料
導包import java.util.Random;
Random random=new Random(); //生成Random物件
int a=random.nextInt(100); //得到0-100之間的隨機正數
double b=random.nextDouble(); //得到0.0-1.0之間的隨機浮點數
//獲取使用者輸入的字元
Scanner scan=new Scanner(System.in);
char c=scan.next().trim().charAt(0); //去空白字元,取輸入的第一個字元
三、選擇結構
判斷結構:符合條件就執行程式碼塊
if(條件){程式碼塊;}
if(條件){程式碼塊;} else{程式碼塊;}
if(條件){程式碼塊;} else if{程式碼塊;}……
if(條件){程式碼塊;} else if{程式碼塊;}……else{程式碼塊;}
分支結構:依次匹配
switch(表示式){
case 常量1:程式碼塊1;break;
case 常量2:程式碼塊2;break;
……
default:程式碼塊n;break;
}
注意:swtich表示式型別只能是byte、short、char、int,JDK1.7新增String型別。
break結束,使後面的程式碼不再執行。
case和default的順序不講究。
注意:①case後面若沒有break則自上而下依次執行下面的語句。
②沒有符合case的語句則只執行default語句。
四、迴圈結構
while(boolean表示式){程式碼塊;}
當boolean值為true時,程式碼塊被反覆執行,直到boolean值變為false時結束。
注意:while迴圈一定要保證條件有變為false的時候,否則就變成死迴圈。
do{程式碼塊;}
while(boolean表示式);
無論boolean是否為true都會先執行一次do裡面的程式碼塊。
for(表示式1;表示式2;表示式3){
程式碼塊; //被迴圈執行
}
表示式1:賦值語句,為迴圈變數賦初始值,int i=0;
表示式2:條件語句,迴圈執行下去的條件,i<100;
表示式3:賦值語句,迴圈結構的迭代部分,通常用來修改迴圈條件,i++
增強for迴圈:遍歷輸出
for(臨時變數:陣列){執行語句;}
for(int tmp:arr){System.out.println(tmp);}//遍歷陣列中的每一個元素,迴圈次數為陣列的長度
迴圈控制:
break:完全中止迴圈本身。跳出一層迴圈結構——用於選擇或迴圈結構
continue:跳出本次迴圈,繼續下一次迴圈。——只能用於迴圈結構
五、陣列
儲存多個同一型別的資料——容器——大小固定,也是一種物件。
陣列對放入其中的元素編號,編號從0開始。
定義陣列:
1.資料型別[] 陣列名=new 資料型別[];
int[] arr=new int[5]; //定義了一個能儲存5個整型元素的陣列
arr[2]=10;//定義陣列下標為2的位置上放入元素10
int i=arr[2];
2.資料型別[] 陣列名=new 資料型別[]{元素1,元素2,元素3……};
int[] arr=new int[]{1,2,3,4,5,6}; //陣列大小為6
3.資料型別[] 陣列名={元素1,元素2,元素3……};
int[] arr={1,2,3,4,5,6}; //arr.length=6;
注意:陣列定義的時候就要初始化,如int[]arr;arr= {1,2,3,4,5,6};會報錯。
4.資料型別 陣列名[]=new 資料型別[];
int arr[]=new int[5];
注意:[]可以在陣列名之前,也可以在之後,但帶來的效果不一樣。
[]在陣列名後,只有第一個是陣列
①int arr1[],arr2; //arr1[]是陣列,arr2是變數
[]在陣列名前,後面接的變數都是陣列型別
②int[] arr1,arr2; //arr1是陣列,arr2是陣列
注意:當使用的下標超過了陣列的最大下標的時候就會出現:ArrayIndexOutOfBoundsException — 陣列下標越界異常
陣列的應用

  1. 獲取陣列的元素 — 陣列名[下標]
  2. 獲取陣列的長度 — 陣列名.length
    陣列的記憶體
    Java將所佔用的記憶體劃分為5塊:棧記憶體、堆記憶體、方法區、本地方法棧、暫存器(PC計數器)。
    棧記憶體:用於變數的儲存。變數在定義之後會在棧記憶體中佔用一塊空間,如果在程式中給變數賦值,才會在棧記憶體的對應空間中儲存這個值。這個變數用完以後會立即移除棧記憶體。
    int[] arr=new int[5]; //在堆記憶體中new一個空間存放陣列元素,初始值為{0,0,0,0,0}
    arr存的只是一個地址: [[email protected]
    [ 表示陣列
    I 表示元素型別是int
    @ 只是一個標記,表示後邊是地址
    25203875 表示地址的雜湊碼的十六進位制表現形式
    堆記憶體:儲存的是物件。堆記憶體會對存入其中的元素賦予一個預設值。在存入對記憶體中的物件使用完成之後,不會立即移除出堆記憶體,而是在不定的某個時刻被釋放。
    ①int、byte、short預設值0
    ②long型別預設值0L
    ③float型別預設值0.0f
    ④double型別預設值0.0
    ⑤char型別預設值’\u0000’(表示空字元)
    ⑥boolean型別預設值是false
    ⑦除以上型別預設值全是null
    int[] arr=new int[6];
    int[] arr2=arr; //將arr的地址複製給arr2
    arr2=new int[2]; //開闢一個新的記憶體空間,重新給arr2一個地址,捨棄舊的地址

遍歷陣列
方法一:
int[]arr={1,2,3,4,5,6};
int i=0;
while(i<arr.length) {
System.out.println(arr[i]);
i++;
}
方法二:
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
方法三:
for(int tmp:arr){System.out.println(tmp);} //遍歷陣列中的每一個元素,迴圈次數為陣列的長度

利用Arrays
import java.util.Arrays; //導工具包
int[]arr={1,2,3,4,5,6};
String str=Arrays.toString(arr); //將陣列拼接成字串
System.out.println(str); //輸出結果[1, 2, 3, 4, 5, 6]
獲取陣列的最大值
int[]arr={1,2,3,4,5,6};
int max=arr[0];
for(int i=1;i<arr.length;i++) {
if(arr[i]>max) { //如果下標為i的元素大於max,則將arr[i]的值賦給max
max=arr[i]; //迴圈執行,直到max變為最大值,跳出迴圈
}
}
System.out.println(max);
氣泡排序:相鄰兩個元素一一比較。需要判斷(n-1)(n-i)=n2-(i+1)n+i次,時間複雜度:O(n2)
時間複雜度:找到這個程式中重複執行的這段程式碼,把重複的這段程式碼執行的時間認定為單位1,執行這個單位1的次數就是時間複雜度。
時間複雜度計算的時候一定找到表示式最高階,只考慮項不考慮係數。例3n2時間複雜度:O(n2)
時間複雜度用O()表示,表現形式nx,(logn)x,nx(logn)y。
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
無論陣列長度多少,需要額外花費3個變數空間。
空間複雜度:這段程式碼在執行過程中需要額外花費的變數的空間的個數。
空間複雜度的表現形式和時間複雜度一樣。3=3n0,空間複雜度為o(1)。
注意:時間複雜度用大寫O,空間複雜度用小寫o。
時間複雜度表示了程式碼被重複執行的次數不決定時間長短,空間複雜度表示了這段程式碼執行需要耗費的空間大小。
時間複雜度一樣,但耗費時間不一定一樣。
選擇排序:選定一位,然後依次和其他位上的元素進行比較。
選定第1個元素和餘下(n-1)元素比較排序,第1個元素位置固定後選定第2個元素和餘下(n-2)元素比較排序,第1、2個元素位置固定後選定第i位元素和餘下(n-i)元素比較排序……直到n-i=1。
(n-1)(n-i)=n2-(1+i)n=i 時間複雜度為O(n2)
3=3
n0,空間複雜度為o(1)。
Arrays.sort(arr);只能進行升序排序
陣列的反轉:頭尾互換
時間複雜度為O(n),空間複雜度為O(n)。
for(int i=0,j=arr.length-1;i<j;i++,j–) {
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
陣列的查詢:
獲取指定元素的下標:如果陣列無序,可以通過遍歷陣列的方式來查詢
折半查詢/二分查詢:min mid max,針對有序陣列,每次比較中間值,重新定義最小值和最大值。
複製陣列:
①原陣列 = Arrays.copyOf(陣列,長度); —本質上就是陣列的複製—必然會產生一個新的陣列,所以陣列擴容完成之後地址一定會發生改變。
② System.arraycopy(複製陣列源, 開始複製下標位置, 新陣列, 開始貼上下標位置, 複製長度);
int[] arr= {15,24,30,40,44,53,60};
int[] arr2=new int[5];
//複製陣列arr中前4個元素到新陣列arr3
int[] arr3=Arrays.copyOf(arr, 4);
System.out.println(Arrays.toString(arr3));
//從陣列arr中下標為3的元素開始複製3個元素到新陣列arr2中,從arr2下標為1的位置開始放置元素。
System.arraycopy(arr, 3, arr2, 1, 3);
System.out.println(Arrays.toString(arr2));
利用陣列複製的方法移除指定下標的元素
String[] arr= {“I”,“like”,“you”,“very”,“much”};
//從陣列arr下標為1的元素開始複製來自陣列arr下標從2開始的3個元素
System.arraycopy(arr, 2, arr, 1,3 );
//例如陣列複製的另一個方法進行縮容操作(減少陣列元素)
arr=Arrays.copyOf(arr,4); //陣列元素從5個減少為4個
System.out.println(Arrays.toString(arr));//輸出 [I, you, very, much]
二維陣列
儲存陣列的陣列------裡面儲存的元素都是一維陣列。
定義格式:
①資料型別[][] 陣列名=new 資料型別[二位陣列的大小][一維陣列的大小];
int[][] arr=new int[3][5];//表示有3個包含5個元素的一維陣列
②資料型別[][] 陣列名=new 資料型別[二位陣列的大小][];
未指定一維陣列時,預設值為null。
int[][] arr=new int[3][];//表示這個二維陣列中能儲存3個一維陣列
arr[0]=new int[5];
arr[1]=new int[4];
arr[2]=new int[3];
③資料型別[][] 陣列名={{陣列1},{陣列2},{陣列3}……};
④資料型別 陣列名[][]=new 資料型別[二位陣列的大小][一維陣列的大小];
int arr[][]=new int[3][5];
⑤資料型別[] 陣列名[]=new 資料型別[二位陣列的大小][一維陣列的大小];
int[] arr[]=new int[3][5];
難點:int[] x[],y;//x是二維陣列,y是一維陣列
正確賦值 x[0]=y; x[0][0]=y[0];
arr存的只是一個地址:[[[email protected]
[[ 表示二維陣列
I 表示元素型別是int
@ 只是一個標記,表示後邊是地址
15db9742 二維陣列的十六進位制地址,裡面存放一維陣列的地址
二維陣列的記憶體儲存

遍歷二維陣列
for(int[] is:arr) {
for(int i:is) {
System.out.println(i);
}
}
練習:
1.一維陣列中無序存放了1~n中的n-1個數,如果找到沒有放到陣列中的數?
2.一組數字,除了其中一個元素以外,其餘元素都出現了偶數次,而有一個是奇數次,找到這個奇數次的元素。
1,1,2,2,2,3,3,3,3,3,2,2,2,4,4,4,4,4,4,5,5,5,5,6,6,7,7,7,8,7,8,9,8,9,8…
int n = 0;
for(int i = 0; i < arr.length; i++){
n ^= arr[i];