Java中的資料型別和運算子

後端小王發表於2020-11-16

專題一  Java基礎

1.2 資料型別和運算子

1.2.1 變數、識別符號和關鍵字

1.變數

在程式執行過程中,其值能被改變的量稱為變數。

定義變數(作用):定義變數就是告訴編譯器這個變數的資料型別,這樣編譯器才知道需要配置多少空間給它。以及它可以存放什

麼樣的資料,在程式執行過程中,空間內的值是變化的,這個記憶體空間就稱為變數,為了便於操作,給這個空間取個名字稱為變數名。

定義變數的規則:變數必須是一個有效的識別符號;變數名不可以使用Java中的關鍵字;變數名不能重複,選擇有意義的單詞作為變數名。

變數的有效範圍:變數又分為成員變數和區域性變數。

定義變數的語法(兩種):

方法一:        資料型別  變數名  =  值;

方法二:        資料型別  變數名;變數名  =值;

2.常量:

在程式執行過程中,其值不能被改變的量稱為常量。

由於常量的值不能被改變,因此常量只能被賦一次值,定義常量需要使用final關鍵字進行鎖定。

3.關鍵字:

關鍵字是Java語言中已經被賦予了特定意義的一些單詞,不可以把這些字作為識別符號來使用,如(class,publit,static)

4.識別符號:

識別符號可以理解為一個名字,用來標識類名、變數名、方法名、陣列名和檔名的有效字元序列。

Java中合法的識別符號:由任意的字母,下劃線、美元符號和數字組成並且第一個字元不能是數字。

識別符號不能是Java中的保留關鍵字,如Goto。

注意:Java中嚴格區分大小寫。

1.2.2 基本資料型別

Java語言提供了八種基本型別。六種數字型別(四個整數型,兩個浮點型),一種字元型別,還有一種布林型。

4種整型:byte、short、int、long

2種浮點型:float、double

1種字元型:char

1中布林型:boolean

byte:

  • byte 資料型別是8位、有符號的,以二進位制補碼錶示的整數;
  • 最小值是 -128(-2^7);
  • 最大值是 127(2^7-1);
  • 預設值是 0;
  • byte 型別用在大型陣列中節約空間,主要代替整數,因為 byte 變數佔用的空間只有 int 型別的四分之一;
  • 例子:byte a = 100,byte b = -50。

short:

  • short 資料型別是 16 位、有符號的以二進位制補碼錶示的整數
  • 最小值是 -32768(-2^15);
  • 最大值是 32767(2^15 - 1);
  • Short 資料型別也可以像 byte 那樣節省空間。一個short變數是int型變數所佔空間的二分之一;
  • 預設值是 0;
  • 例子:short s = 1000,short r = -20000。

int:

  • int 資料型別是32位、有符號的以二進位制補碼錶示的整數;
  • 最小值是 -2,147,483,648(-2^31);
  • 最大值是 2,147,483,647(2^31 - 1);
  • 一般地整型變數預設為 int 型別;
  • 預設值是 0 ;
  • 例子:int a = 100000, int b = -200000。

long:

  • long 資料型別是 64 位、有符號的以二進位制補碼錶示的整數;
  • 最小值是 -9,223,372,036,854,775,808(-2^63);
  • 最大值是 9,223,372,036,854,775,807(2^63 -1);
  • 這種型別主要使用在需要比較大整數的系統上;
  • 預設值是 0L;
  • 例子: long a = 100000L,Long b = -200000L。
    "L"理論上不分大小寫,但是若寫成"l"容易與數字"1"混淆,不容易分辯。所以最好大寫。

float:

  • float 資料型別是單精度、32位、符合IEEE 754標準的浮點數;
  • float 在儲存大型浮點陣列的時候可節省記憶體空間;
  • 預設值是 0.0f;
  • 浮點數不能用來表示精確的值,如貨幣;
  • 例子:float f1 = 234.5f。

double:

  • double 資料型別是雙精度、64 位、符合IEEE 754標準的浮點數;
  • 浮點數的預設型別為double型別;
  • double型別同樣不能表示精確的值,如貨幣;
  • 預設值是 0.0d;
  • 例子:double d1 = 123.4。

boolean:

  • boolean資料型別表示一位的資訊;
  • 只有兩個取值:true 和 false;
  • 這種型別只作為一種標誌來記錄 true/false 情況;
  • 預設值是 false;
  • 例子:boolean one = true。

char:

  • char型別是一個單一的 16 位 Unicode 字元;
  • 最小值是 \u0000(即為0);
  • 最大值是 \uffff(即為65,535);
  • char 資料型別可以儲存任何字元;
  • 例子:char letter = 'A';。

1.2.3 運算子

計算機的最基本用途之一就是執行數學運算,作為一門計算機語言,Java也提供了一套豐富的運算子來操縱變數。我們可以把運算子分成以下幾組:

  • 算術運算子
  • 關係運算子
  • 位運算子
  • 邏輯運算子
  • 賦值運算子
  • 其他運算子

算術運算子:

算術運算子用在數學表示式中,它們的作用和在數學中的作用一樣。下表列出了所有的算術運算子。

表格中的例項假設整數變數A的值為10,變數B的值為20:

操作符描述例子
+加法 - 相加運算子兩側的值A + B 等於 30
-減法 - 左運算元減去右運算元A – B 等於 -10
*乘法 - 相乘操作符兩側的值A * B等於200
/除法 - 左運算元除以右運算元B / A等於2
取餘 - 左運算元除以右運算元的餘數B%A等於0
++自增: 運算元的值增加1B++ 或 ++B 等於 21(區別詳見下文)
--自減: 運算元的值減少1B-- 或 --B 等於 19(區別詳見下文)

 

 

 

 

 

 

 

 

自增自減運算子

1、自增(++)自減(--)運算子是一種特殊的算術運算子,在算術運算子中需要兩個運算元來進行運算,而自增自減運算子是一個運算元。

例項

public class selfAddMinus{ public static void main(String[] args){ int a = 3;//定義一個變數; int b = ++a;//自增運算 int c = 3; int d = --c;//自減運算 System.out.println("進行自增運算後的值等於"+b); System.out.println("進行自減運算後的值等於"+d); } }

執行結果為:

進行自增運算後的值等於4
進行自減運算後的值等於2

解析:

  • int b = ++a; 拆分運算過程為: a=a+1=4; b=a=4, 最後結果為b=4,a=4

  • int d = --c; 拆分運算過程為: c=c-1=2; d=c=2, 最後結果為d=2,c=2

2、字首自增自減法(++a,--a): 先進行自增或者自減運算,再進行表示式運算。

 

3、字尾自增自減法(a++,a--): 先進行表示式運算,再進行自增或者自減運算 例項:

例項

public class selfAddMinus{ public static void main(String[] args){ int a = 5;//定義一個變數; int b = 5; int x = 2*++a; int y = 2*b++; System.out.println("自增運算子字首運算後a="+a+",x="+x); System.out.println("自增運算子字尾運算後b="+b+",y="+y); } }

執行結果為:

自增運算子字首運算後a=6,x=12
自增運算子字尾運算後b=6,y=10

關係運算子

下表為Java支援的關係運算子

表格中的例項整數變數A的值為10,變數B的值為20:

運算子描述例子
==檢查如果兩個運算元的值是否相等,如果相等則條件為真。(A == B)為假。
!=檢查如果兩個運算元的值是否相等,如果值不相等則條件為真。(A != B) 為真。
檢查左運算元的值是否大於右運算元的值,如果是那麼條件為真。(A> B)為假。
檢查左運算元的值是否小於右運算元的值,如果是那麼條件為真。(A <B)為真。
>=檢查左運算元的值是否大於或等於右運算元的值,如果是那麼條件為真。(A> = B)為假。
<=檢查左運算元的值是否小於或等於右運算元的值,如果是那麼條件為真。(A <= B)為真。

 

 

 

 

 

位運算子

Java定義了位運算子,應用於整數型別(int),長整型(long),短整型(short),字元型(char),和位元組型(byte)等型別。

位運算子作用在所有的位上,並且按位運算。假設a = 60,b = 13;它們的二進位制格式表示將如下:

A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A= 1100 0011

下表列出了位運算子的基本運算,假設整數變數 A 的值為 60 和變數 B 的值為 13:

操作符描述例子
如果相對應位都是1,則結果為1,否則為0(A&B),得到12,即0000 1100
|如果相對應位都是 0,則結果為 0,否則為 1(A | B)得到61,即 0011 1101
^如果相對應位值相同,則結果為0,否則為1(A ^ B)得到49,即 0011 0001
按位取反運算子翻轉運算元的每一位,即0變成1,1變成0。(〜A)得到-61,即1100 0011
<< 按位左移運算子。左運算元按位左移右運算元指定的位數。A << 2得到240,即 1111 0000
>> 按位右移運算子。左運算元按位右移右運算元指定的位數。A >> 2得到15即 1111
>>> 按位右移補零操作符。左運算元的值按右運算元指定的位數右移,移動得到的空位以零填充。A>>>2得到15即0000 1111

 

 

 

 

 

 

邏輯運算子

下表列出了邏輯運算子的基本運算,假設布林變數A為真,變數B為假

操作符描述例子
&&稱為邏輯與運算子。當且僅當兩個運算元都為真,條件才為真。(A && B)為假。
| |稱為邏輯或操作符。如果任何兩個運算元任何一個為真,條件為真。(A | | B)為真。
稱為邏輯非運算子。用來反轉運算元的邏輯狀態。如果條件為true,則邏輯非運算子將得到false。!(A && B)為真。

 

 

 

短路邏輯運算子

當使用與邏輯運算子時,在兩個運算元都為true時,結果才為true,但是當得到第一個操作為false時,其結果就必定是false,這時候就不會再判斷第二個操作了。

例項

public class LuoJi{ public static void main(String[] args){ int a = 5;//定義一個變數; boolean b = (a<4)&&(a++<10); System.out.println("使用短路邏輯運算子的結果為"+b); System.out.println("a的結果為"+a); } }

執行結果為:

使用短路邏輯運算子的結果為false
a的結果為5

解析: 該程式使用到了短路邏輯運算子(&&),首先判斷 a<4 的結果為 false,則 b 的結果必定是 false,所以不再執行第二個操作 a++<10 的判斷,所以 a 的值為 5。

賦值運算子

下面是Java語言支援的賦值運算子:

操作符描述例子
=簡單的賦值運算子,將右運算元的值賦給左側運算元C = A + B將把A + B得到的值賦給C
+ =加和賦值操作符,它把左運算元和右運算元相加賦值給左運算元C + = A等價於C = C + A
- =減和賦值操作符,它把左運算元和右運算元相減賦值給左運算元C - = A等價於C = C - A
* =乘和賦值操作符,它把左運算元和右運算元相乘賦值給左運算元C * = A等價於C = C * A
/ =除和賦值操作符,它把左運算元和右運算元相除賦值給左運算元C / = A,C 與 A 同型別時等價於 C = C / A
(%)=取模和賦值操作符,它把左運算元和右運算元取模後賦值給左運算元C%= A等價於C = C%A
<< =左移位賦值運算子C << = 2等價於C = C << 2
>> =右移位賦值運算子C >> = 2等價於C = C >> 2
&=按位與賦值運算子C&= 2等價於C = C&2
^ =按位異或賦值操作符C ^ = 2等價於C = C ^ 2
| =按位或賦值操作符C | = 2等價於C = C | 2

 

 

 

 

 

 

 

 

 

 

 

條件運算子(?:)

條件運算子也被稱為三元運算子。該運算子有3個運算元,並且需要判斷布林表示式的值。該運算子的主要是決定哪個值應該賦值給變數。

variable x = (expression) ? value if true : value if false

例項

Test.java 檔案程式碼:

public class Test { public static void main(String[] args){ int a , b; a = 10; // 如果 a 等於 1 成立,則設定 b 為 20,否則為 30 b = (a == 1) ? 20 : 30; System.out.println( "Value of b is : " + b ); // 如果 a 等於 10 成立,則設定 b 為 20,否則為 30 b = (a == 10) ? 20 : 30; System.out.println( "Value of b is : " + b ); } }

以上例項編譯執行結果如下:

Value of b is : 30
Value of b is : 20

instanceof 運算子

該運算子用於操作物件例項,檢查該物件是否是一個特定型別(類型別或介面型別)。

instanceof運算子使用格式如下:

( Object reference variable ) instanceof  (class/interface type)

如果運算子左側變數所指的物件,是操作符右側類或介面(class/interface)的一個物件,那麼結果為真。

下面是一個例子:

String name = "James";
boolean result = name instanceof String; // 由於 name 是 String 型別,所以返回真

如果被比較的物件相容於右側型別,該運算子仍然返回true。

看下面的例子:

class Vehicle {} public class Car extends Vehicle { public static void main(String[] args){ Vehicle a = new Car(); boolean result = a instanceof Car; System.out.println( result); } }

以上例項編譯執行結果如下:

true

Java運算子優先順序

當多個運算子出現在一個表示式中,誰先誰後呢?這就涉及到運算子的優先順序別的問題。在一個多運算子的表示式中,運算子優先順序不同會導致最後得出的結果差別甚大。

例如,(1+3)+(3+2)*2,這個表示式如果按加號最優先計算,答案就是 18,如果按照乘號最優先,答案則是 14。

再如,x = 7 + 3 * 2;這裡x得到13,而不是20,因為乘法運算子比加法運算子有較高的優先順序,所以先計算3 * 2得到6,然後再加7。

下表中具有最高優先順序的運算子在的表的最上面,最低優先順序的在表的底部。

類別操作符關聯性
字尾() [] . (點操作符)左到右
一元expr++ expr--從左到右
一元++expr --expr + - ~ !從右到左
乘性 * /%左到右
加性 + -左到右
移位 >> >>>  << 左到右
關係 > >= < <= 左到右
相等 ==  !=左到右
按位與左到右
按位異或^左到右
按位或|左到右
邏輯與&&左到右
邏輯或| |左到右
條件?:從右到左
賦值= + = - = * = / =%= >> = << =&= ^ = | =從右到左
逗號左到右

 

 

 

 


 

 

 

 

 

 

 

 

 

 

1.2.4 Scanner的使用

Scanner類簡介

Java 5新增了java.util.Scanner類,這是一個用於掃描輸入文字的新的實用程式。它是以前的StringTokenizer和Matcher類之間的某種結合。由於任何資料都必須通過同一模式的捕獲組檢索或通過使用一個索引來檢索文字的各個部分。於是可以結合使用正規表示式和從輸入流中檢索特定型別資料項的方法。這樣,除了能使用正規表示式之外,Scanner類還可以任意地對字串和基本型別(如int和double)的資料進行分析。藉助於Scanner,可以針對任何要處理的文字內容編寫自定義的語法分析器。

關於nextInt()、next()和nextLine()的理解

nextInt(): it only reads the int value, nextInt() places the cursor(游標) in the same line after reading the input.(nextInt()只讀取數值,剩下"\n"還沒有讀取,並將cursor放在本行中)

next(): read the input only till the space. It can’t read two words separated by space. Also, next() places the cursor in the same line after reading the input.(next()只讀空格之前的資料,並且cursor指向本行)
next() 方法遇見第一個有效字元(非空格,非換行符)時,開始掃描,當遇見第一個分隔符或結束符(空格或換行符)時,結束掃描,獲取掃描到的內容,即獲得第一個掃描到的不含空格、換行符的單個字串。

nextLine(): reads input including space between the words (that is, it reads till the end of line \n). Once the input is read, nextLine() positions the cursor in the next line.
nextLine()時,則可以掃描到一行內容並作為一個字串而被獲取到。

下面是建立 Scanner 物件的基本語法:

Scanner s = new Scanner(System.in);

next() 與 nextLine() 區別

next():

  • 1、一定要讀取到有效字元後才可以結束輸入。
  • 2、對輸入有效字元之前遇到的空白,next() 方法會自動將其去掉。
  • 3、只有輸入有效字元後才將其後面輸入的空白作為分隔符或者結束符。
  • next() 不能得到帶有空格的字串。

nextLine():

  • 1、以Enter為結束符,也就是說 nextLine()方法返回的是輸入回車之前的所有字元。
  • 2、可以獲得空白。

相關文章