一、資料型別
定義:
就是用了儲存資料的一個型別,一種資料型別,只能儲存該型別資料值
作用:
- 只有瞭解資料型別,才能選擇合適的型別存放資料,才能更好的利用計算機硬體資源(記憶體和硬碟等)。
- 不同的資料型別存放資料大小是不同的。
- 資料型別的使用方式就是用來宣告一個變數,裝資料的。
常用的整數型別是 int 和 long,byte 和 short 基本不用,常用的小數型別是 double,float 基本不用 ,因為 double 是不精確的,在實際開發中表示精確的小數我們使用 BigDecimal 類。
計算機儲存資料:儲存在硬碟【磁碟】,硬碟中的方式都是用的二進位制資料的方式進行儲存 01010101010101010101010101010101
計算機底層本質儲存的資料形式就是二進位制資料:例如 0101010101010101
1.1、基本資料型別
1.1.1、整型:
整數型別包含:byte、short、int、long
整數的預設型別為:int
為什麼需要整數有四種型別?
因為不同的資料型別,佔用的記憶體空間不一樣,能夠儲存的值範圍也就不一樣
注意事項:
- byte的範圍大小 [-128,127]
- long賦值時,因為整數預設是int型別,要轉換為long型別的值,後面加上l或L【建議寫大寫L】
- 如果超過了long的範圍,用BigInteger的類來存放其值【後面學習】
- 同一個整數可以使用不同的進製表示
1.1.2、浮點型:
浮點數型別包括:float、double
浮點數預設型別為:double
浮點數可以理解位表示的小數;
注意事項:
-
直接賦值給float型別,需要加上F或f,因為預設型別都為double。
-
精度損失,如double d = 1.0 表示的是無限接近於1.0的一個小數,而不是真正的1.0。如果需要精確的表示一個小數,可以使用後面學到的BigDecimal。
-
單精度雙精度區別:
3.1對於單精度浮點數,執行速度相比double更快,佔記憶體更小,
3.2但是當數值非常大或者非常小的時候會變得不精確。
3.3雙精度比單精度表示的位數大 精確的位數多,簡單地說, float表示的小數點位數少。
3.4最近幾天建議用double型別,而實際開發用BigDecimal型別表示小數。
1.1.3、字元型別:
單引號引起來的一個符號就是字元資料。例如:'a'
使用方式:
- 'a'、’1’、’好’等最常用。
- 使用一個數字表示字元,參考下圖中ASCII碼錶[字元編碼]。關於ASCII碼錶請百度瞭解。
char c = 65;// 表示 ‘A’這個字元
//16進製表示一個字元
char c = '\u0041';// 十六進位制的0041,是十進位制的65,在字符集中對應的是A字元
-
特殊字元使用
\r 表示回車符;
\n 表示換行符;
\t 表示相當於Table鍵製表符,;
\b表示退格鍵,相當於Back Space鍵;
\’表示單引號;
\” 表示雙引號;
\ 表示一個斜槓\。
注意:因為系統差異性,在不同的系統中 ,有時候\r起作用,有時候\n起作用。所以,一般建議:\r\n 連用,這樣可以在任意系統中都可以換行。
1.1.4、布林型別
只有兩個值:true、false,不能使用:0和1表示。
位數佔1位
1.2、引用資料型別
除了基本型別以外,幾乎所有的其他型別都是引用型別。
如:java自帶的類、我們自定義的類、介面、列舉、陣列等都屬於引用資料型別。
- 類 class2
- 介面 interface
- 列舉 enum
- 抽象類 abstract class
- 陣列 資料型別[]
String 類是java中一種自帶的引用資料型別,表示字串資料。
//使用雙引號 包含字元內容。
String s = "你好";
System.out.println(s);// 你好
二、基礎語法和變數
2.1、基礎語法
命名規範:
-
一般不建議使用$ 及下劃線_作為起始符號
-
見名知意:一般來說都是取一些有意義的單詞。例如,age表示年齡
-
類名首字母必須大駝峰。大駝峰:首字母大寫,後面每個單詞首字母大寫。
例如:使用者管理類 : UserManagement 大駝峰
-
方法名、變數名小駝峰。小駝峰:首字母小寫,後面每個單詞首字母大寫
使用者名稱(成員)變數 : userName 小駝峰
獲取使用者名稱方法 : getUserName() 小駝峰
-
不要以java中關鍵字、保留字、jdk中存在的類 命名
註釋:
單行註釋: 語法://
一般寫在main(或者其他)方法內部
多行註釋: 語法:/* */
可以註釋多行內容,一般寫在main方法中,用來寫解題思路
多行註釋: 語法:/** */
這是文件註釋,寫在方法、類、成員變數上面
2.2、變數
概念:
就是一個盒子(容器),用來裝資料的。同一時間只能裝一個資料。
變數是記憶體中的一個儲存區域,該區域有自己的名稱(變數名)和型別(資料型別),Java中每個變數必須先宣告,後使用, 該區域的資料可以在同一型別範圍內不斷變化
(變數可以理解為裝某種型別資料的容器,容器可以重複使用)
宣告變數:
int age;// 宣告一個int型別的變數age(年齡)
//資料型別 變數名1 = 值1, 變數名2 = 值2, 變數名3 = 值3...;// 值和變數的型別必須相同
int age, age2, age3;
//或者
int age = 1, age2 = 2, age3 = 3;
變數賦值:
//語法:變數名 = 值; =右邊的值,賦值給 =左邊的變數。注意:必須保證值和變數的資料型別一致
age = 23;// 將23賦值給變數age。注意:必須保證值23和變數age的資料型別一致
eg:
public class _02Var {
public static void main(String[] args) {
// ================== int型別變數使用 =========================
// 1. 宣告變數,語法:資料型別 變數名; 例如:int age;
int score;// 宣告一個int型別變數score
// 2. 變數賦值,語法:變數名 = 值
score = 0;// 將int型別的值0透過=賦值給=左邊的變數score
// 直接列印輸出變數score
System.out.println(score);
// 做運算(+,-,*,/....) score + 1
score = score + 1;
System.out.println(score);// 1
// 賦值給另外的變數
int score2 = score;
System.out.println(score2+","+score);// 1
System.out.println(score);// 1
// ======== String 字串型別(引用型別) 最常用【掌握】=========================
// 1 宣告變數同時賦值,語法:資料型別 變數名 = 值;
String str = "abc";
// 2. 變數取值: 語法:變數名;
System.out.println(str);
// +在字串中表示連線符號,也就是拼接符號
str = str + "123";// 將String變數str中值abc取出來,然後透過+號拼接 123,重新賦值給 str
// 重新列印str
System.out.println(str);// abc123
// +在字串出現之前,表示加法運算,字串之後表示拼接符號
System.out.println(1 + 2 + "ab" + 1 + 2);// 3ab12
}
注意事項:
- 此處的資料型別可以是Java中支援的所有的資料型別!
- 資料型別限定了變數可以存值的型別
- 賦值使用的 = 號,從右往左賦值
- 規範寫法:= 兩邊都加上一個空格
- 變數一旦定義好了,可以反覆使用
- 變數只可以存一個值,下次存值會覆蓋上一次的值
三、資料型別的轉換
定義:
將資料從一種格式或結構轉換為另一種格式或結構的過程
作用
- 節約記憶體空間 byte short int long
- 將一些型別轉換為專案所需要的型別
3.1、自動隱式轉換
定義:
將小的資料型別轉換大的資料型別
注意事項
-
在Java中,boolean型別與所有其他7種型別都不能進行轉換。
-
其他 7種資料型別,它們之間都可以進行轉換,但是可能會存在精度損失或者其他一些變化。
byte -> short -> int -> long-> float-> doublechar -> int -> long-> float-> double
byte與char 不能自動轉換
char與short不能自動轉換
由於小數(浮點數) 的儲存方式,結構和整數不一樣,所以,float哪怕是4個位元組、
long是8個位元組,表示範圍也大於long型別。知道就好無須深入研究。
eg:
//1.
short s = 10;
int num = 20;
int n = num + s;
System.out.println(n);
//2.
int num = 10;
double b = 10.01;
double c = num + b;
System.out.println(c);
//3.char型別向更高長度型別(例如整型)轉換時,會轉換為對應的ASCII碼值,再做其他型別的自動轉換
char c = 'A';
int num = 10;
int a = c + num;
System.out.println(a);
//4.特例:只看型別,不看值
/ 示例1:
int a = 129;
byte b = (byte)a;// 編譯器只看容器不看值
System.out.println(b);// 結果為-127
// 示例2:
byte b = 100;// 可以自動轉換
float f = 1.3;// 不能自動轉換
int a = 2147483647;
a = a + 1;
System.out.println(a);// 結果為-2147483648
3.2、強制轉換
定義:
將大資料型別轉為小資料型別
語法:
小資料型別 變數名 = (小資料型別)大型別值/大型別變數名
注意事項
- 高轉低會導致精度丟失,有資料的溢位風險。溢位的時候,會以二進位制進位。
- 實際開發中:應該要知道被強制轉換的資料,是在一個已知的範圍。
- 當int型別的具體的值,向byte、short、char型別轉換的時候,值只要在其表示範圍內,都會隱式轉換。
- 編譯只看型別不看值
eg:
int i1 = 123;
int i2 = 456;
float f1 = (float)((i1 + i2) * 1.2);// 型別大的轉換為型別小的時,要加上強制轉換符
short i = 99;
char c = (char)i;
System.out.println(c);
byte b1 = 1;
byte b2 = 2;
byte b3 = (byte)(b1 + b2); // byte,short,char在計算時首先轉換為int,大型別(int)轉換為小型別的(byte)時要加強制轉換
byte t = 127;// 不報錯
int a = 127;
// 需要強制轉換才不報錯:編譯器只看型別,不看值
byte b = (byte)a;
System.out.println(b); // 結果為 127
/**
* 4. 型別轉換:(掌握)
byte short(char) int long float(單精度) double(雙精度) (只有數值型別才能相互轉換)
----------------從左到右精度越來越高-------------------->
1. 小轉大,都是可以隱式轉換 (從左到右)
2. 大轉小,必須強制轉換 (從右到左) 強制轉換有資料的溢位風險。溢位的時候,會以二進位制進位
強制轉換語法:
小的資料型別 小的變數 = (小的資料型別)大的變數/值;
當int型別的具體的值,向byte、short、char型別轉換的時候,值只要在其表示範圍內,都會隱式轉換
*/
public class _03TypeChange {
public static void main(String[] args) {
// 1. 小轉大,都是可以隱式轉換 (從左到右)
byte byt = 1;// 宣告一個byte型別變數byt 賦值1
short s = byt;// 宣告一個short型別變數s 賦值一個byte型別變數byt
int i = s;// 宣告一個int型別變數i 賦值一個short型別變數s
long lon = i;// 宣告一個long型別變數lon 賦值一個int型別變數i
float f = lon;// 宣告一個float型別變數f 賦值一個long型別變數lon
double doub = f;// 宣告一個double型別變數doub 賦值一個float型別變數f
// 2. 大轉小,必須強制轉換 (從右到左) 強制轉換有資料的溢位風險。溢位的時候,會以二進位制進位
// 強制轉換語法:小的資料型別 小的變數 = (小的資料型別)大的變數/值;
float f2 = (float)doub;// 宣告一個float型別變數f2,賦值為一個強制轉換的double型別變數 doub
long lon2 = (long)f2;
byte byt2 = (byte)128;// 128是int型別,強制轉換有可能發生溢位,溢位時會以二進位制進位
System.out.println(byt2);// -128
int a = 1;
// byte byt3 = a;// 報錯,int型別a值是1,因為在編譯期程式只看右邊的資料型別,而不看變數中的值
byte byt4 = 1;// 不報錯
}
}
4.3、表示式示例
四、運算子
4.1、算術運算子
算數運算(Arithmetic Operation)
+ :加號。只有String字串參與的加法運算,才有拼接功能,在String之前,表示加法 運算,之後,才表示連線
-:減號。
*****:乘號。
/:除號。不能除0
%:模(也叫取餘)相當於求餘數。例如:10 % 3 ,表示求10除3的餘數,結果是1
作用:1. 求餘數 2. 找一個數的倍數 3. 可以拆分一個多位的數字
eg:
public class _05ArithmeticOperation {
public static void main(String[] args) {
System.out.println("============= 除法 / ==============");
System.out.println(10 / 1);// 10
System.out.println(10 / 2);// 5
System.out.println(10 / 3);// 3
System.out.println(10 / 4);// 2
System.out.println(10 / 5);// 2
System.out.println(10 / 6);// 1
System.out.println(10 / 7);// 1
System.out.println(10 / 8);// 1
System.out.println(10 / 9);// 1
System.out.println(10 / 10);// 1
System.out.println(10 / 11);// 0
//System.out.println(10 / 0);// ArithmeticException算術異常
System.out.println("============= 特殊情況 ==============");
/*
* 特殊情況:【瞭解】
1) 10/3 =3;
2) 10.0/3=3.33333…
3) 0/0
4) 0.0/0.0
結果是NaN ,任何的NaN都不等於自己(面試題)not a number不是一個數字
5) 1.0/0.0 結果:Infinity,表示無窮大
*/
System.out.println(10.0 / 3);
System.out.println(0.0 / 0.0);// NaN
System.out.println(1.0 / 0.0);// Infinity表示無窮大
System.out.println("============== % 模(取餘) ==============");
System.out.println(10 % 1);// 0
System.out.println(10 % 2);// 0
System.out.println(10 % 3);// 1
System.out.println(10 % 4);// 2
System.out.println(10 % 5);// 0
System.out.println(10 % 6);// 4
System.out.println(10 % 7);// 3
System.out.println(10 % 8);// 2
System.out.println(10 % 9);// 1
System.out.println(10 % 10);// 0
System.out.println(10 % 11);// 10
//System.out.println(10 % 0);// ArithmeticException算術異常
// 請求出個十百位的值 / %
int a = 127;
// 求個位
int ge = a % 10;
// 求十位
int shi = a / 10 % 10;
// 求百位
int bai = a / 100;
System.out.println(ge + " : " + shi + " : " + bai);
}
}
4.2、自增自減運算子
++(加加)、--(減減)
注意事項:
- 自增自減只能夠用於變數,不能用於常量
- 自增自減運算的優先順序比其他算術運算子高
- 一般用在迴圈語句中
使用要點:
- 把整個表示式看成是一個整體。
- ++i 表示運算完再賦值,i++ 表示先賦值再運算
eg:
int i = 3;
int a1 = i++ + i++ + i++;
//i++=3 i=4 i++=4 i=5 i++=5 i=6 計算過程
int b1 = ++i + ++i + ++i;
//++i=7 i=7 ++i=8 i=8 ++i=9 i=9
System.out.println("i = " + i); // 9
System.out.println("a1 = " + a1); // 12
System.out.println("b1 = " + b1); // 24
int a2 = 1;
int b2 = 2;
// a++: 先賦值再自增 ++a:先自增再賦值
int c1 = a2++ + ++a2 + b2--;
// a2++=1 a2=2 ++a2=3 a2=3 b2--=2 b2=1 c1=1+3+2
int d1 = c1++ + c1-- + a2++ + ++b2;
// c1++=6 c1=7 c1--=7 c1=6 a2++=3 a2=4 ++ba=2 b2=2
// a = ? b = ? c = ? d = ?
System.out.println("a = " + a2);//4
System.out.println("b = " + b2);//2
System.out.println("c = " + c1);//6
System.out.println("d = " + d1);//18
4.3、複合賦值運算子
賦值運算(Assignment Operation):是優先順序最低的一種運算,等 = 後邊的所有運算完畢後,才執行賦值運算。
+=(加等)、-=(減等)、=(乘等)、/=(除等)、=*(等於)
語法:
//+= 累加
int a = 5;
a += 5 => a = a+5
注意事項:
- 從右到左,把符號右邊的值賦值到左邊的變數中
- 上面符號看成是一個整體: 例如 += 看成是一個符號,不要看成兩個。
- 賦值運算有強制轉換功能,可以避免型別提升.會有溢位風險
int i= 3;
i += 2;// 表示把2 累加到變數 i 中
i -= 1;
// 特例
short s = 3;
s += 2; // 存在隱式轉換
short s = 3;
s = s + 2; // 報錯,因為結果值是int,int不能自動轉換為short
public class _08AssignmentOperation {
public static void main(String[] args) {
int a = 1;
a += 5;// 表示將變數a的值累加上5,相當於a = (int)(a + 5);
System.out.println(a);// 6
byte b = 127;
b += 1;// b += 1相當於 : b = (byte)(b + 1);
System.out.println(b);// -128
// b = b + 1;// 報錯, b + 1表示式結果是int型別
a += 1 + 3 + 5;// 會先計算 += 右邊所有的運算,再執行 += 賦值運算
System.out.println(a);
}
}
4.4、比較運算子
**比較運算 **(Compare Operation) :結果一定是 boolean 型別
<(小於)、>(大於)、<=(小於等於)、>=(大於等於)
- ==(等等於),比較基本型別,比較的是值是否相等 ;比較引用型別,比較的是值並且地址是否相等
- !=(不等於),比較基本型別,比較的是值是否不相等 ;比較引用型別,比較的是值並且地址是否不相等
4.5、三目運算子
語法:
x ? y : z
描述:
x 一般為一個關係表示式。
如果 x 的值為 true,那麼就取 y 的值否則就取 z 的值。
eg:
bool resuilt=5>3?true:flase
注意點:
凡使用if else的判斷,可以考慮使用三元表示式;y 的結果型別必須跟 z 的結果型別一致,並且也要跟整個三元表示式的結果型別一致