1. 程式人生 > >《瘋狂Java講義(第4版)》-----第3章【資料型別與運算子】

《瘋狂Java講義(第4版)》-----第3章【資料型別與運算子】

Java的官方API下載 Java語言是一門強型別語言。強型別含義:

  • 所有變數必須先宣告,後使用;
  • 指定型別的變數只能接受型別與之匹配的值

註釋

//單行註釋
/*
多行註釋
*/

/**
*文件註釋
*/

識別符號

字母、下劃線、美元符號、數字組成。字母、下劃線、美元符號開頭。(據說這裡的字母不僅限於26個英文字母,)

識別符號不能是Java關鍵字和保留字。也不能是true,false,null這三個直接量(literal)。保留字的意思是未來的Java版本中可能會使用的關鍵字,如goto,const。

資料型別

Java語言支援兩種資料型別:基本型別(Primitive Type)和引用型別(Reference Type)

  • 基本型別:boolean,byte,short,int,long,char,float,double
  • 引用型別:類、介面、陣列、null

整型(byte,short,int,long)

byte 1個位元組(-27~27-1)
short 2個位元組(-215~215-1)
int 4個位元組(-231~231-1)
long 8個位元組(-263~263-1)
  • 整數預設是int型別
  • 把較小的整數值(在byte,short範圍內)賦給byte,short,系統會自動把這個整數值當成byte,short
  • 直接把一個超過int範圍的整數賦值給long型別變數,這個整數(int)不會自動轉為long型別,會報錯,因為Java還是認為這個數是int型別,超出了int表示的範圍。正確處理方式是在這個整數後加L或l
  • 二進位制整數開頭是0b或0B,八進位制整數開頭是0,十六進位制數開頭是0x或0X

字元型(char)

  • Java語言採用16位Unicode字符集作為編碼方式(’\u0000’’\uFFFF’,前256個’\u0000’’\u00FF’和ASCII碼對應)。char相當於無符號整型(0-65535)。

  • 字元型三種寫法:‘x’,’\’,’\u0a18’(四位十六進位制數)

  • 注意在路徑中用\而不是用\,不然就當成轉義字元處理了。

浮點型(float,double)

按照IEEE754標準 float:4個位元組 double:8個位元組

表示方法:5.12,5.12e2

  • 用科學計數法表示的數哦都市浮點數
  • 浮點數預設是double型別,float數必須末尾加F或f
  • 浮點數從表示原理上只能精確到一定的精度,小數點後位數過多的時候就不能精確了

關於負無窮、正無窮、非數

public class HelloWorld{
	
	public static void main(String[] args){
		
				
		//正數除以0得到Infinity---必須是浮點數之間的運算
		System.out.println(1.0/0);
		//負數除以0得到-Infinity---必須是浮點數之間的運算
		System.out.println(-1.0/0);
		//0.0/0.0得到NaN(非數)
		System.out.println(0.0/0.0);
		//1/0報錯java.lang.ArithmeticException: / by zero---不是浮點數之間的運算
		//System.out.println(1/0);

		//所有的正無窮都相等
		System.out.println(1.0/0==Double.POSITIVE_INFINITY);
		//所有的負無窮都相等
		System.out.println(Double.NEGATIVE_INFINITY==Float.NEGATIVE_INFINITY);
		//NaN不和任何數值相等,甚至兩個非數不想等
		System.out.println(Double.NaN==0.0/0.0);
		System.out.println(Double.NaN==Float.NaN);
	}
}
char c = 9_7;
//整型數可以用下劃線分隔,位數多的時候方便看出多少位
System.out.println(c);

布林型(boolean)

布林型只有兩個取值:true、false,不能用0或非0代表。boolean型別之間不能做算術運算。

下面程式碼將輸出truefalse,boolean型別可以自動轉成字串!

String str = true  + "" + false;
System.out.println(str);

基本型別的型別轉換

自動型別轉換

總體而言,小範圍的可以自動轉換成表示範圍大的。就好比小瓶子裡的水倒進大瓶子裡面可以裝得下。具體如下。 在這裡插入圖片描述

  • 任何基本型別和字串連線都會轉換成字串

  • 字串型別都可以通過八種基本型別的包裝類的靜態方法parseXxx(String s)轉換成相應的基本型別String str = "2.32"; double d = Double.parseDouble(str);

  • 八種基本型別的包裝類:Boolean,Byte,Short,Character,Integer,Long,Float,Double

  • 表示式型別中資料型別的自動提升也是根據這個圖。表示式的型別嚴格保持和表示式中最高等級運算元的型別相同。

強制型別轉換

根據上面自動型別轉換的圖,逆過來得強制型別轉換,可能會造成資料丟失。可以從底層資料二進位制表示的原理進行解釋。比如int轉為byte,就是把int的低8位給了byte。

直接量

boolean b = true;
int a = 8;
char c = 'c';
long l = 2L;
float f = 2.3f;
double d = 2.3;
String str = "hello";
String s = null;

能進行直接量賦值的只有:八大基本型別、null、字串。

字串直接量的常量池

第一次使用字串直接量時,Java會把這個字串常量放在常量池裡快取起來,程式再次用到的時候就會直接使用這個字串,不會再新建了。

public class HelloWorld{
	
	public static void main(String[] args){

		String s1 = "hello";
		String s2 = "hello";
		String s3 = "hell" + "o";
		//輸出true
		System.out.println(s1==s2);
		//輸出true
		System.out.println(s1==s3);
		
	}
}

運算子

%:求餘。求餘也是要進行除法運算的,得到餘數,所以當兩個整數做求餘運算的時候,除數為0會報錯。 ++,–:針對變數。不能用於表示式、直接量、常量。 >>>:無符號右移位。及其他移位具體細節用時再看課本深究吧 ==:System.out.println(8==8.0);//返回true &,|,^:這幾個既是位運算子又是邏輯運算子!注意區別!

發現問題積累

在命令列執行程式,輸出中文亂碼怎麼辦?

命令列預設是GBK編碼方式,可以設定成UTF-8方式編碼。 檢視當前編碼方式(預設是936,即GBK方式):

C:\Users\xxx\Desktop>chcp
活動內碼表: 936

修改成UTF-8(65001):

C:\Users\xxx\Desktop>chcp 65001
Active code page: 65001

現在再用命令列執行Java程式,列印中文字串,就不會有亂碼了。

隨機生成小寫英文字母組成的字串的方法?

可以先隨機生成小寫字母,再拼起來。可以隨機生成97-122之間的數,強轉成char即可。下面以隨機生成6位的字串為例子完成程式碼:

public class HelloWorld{
	
	public static void main(String[] args){

		String str = "";
		for(int i=0;i<6;i++){
			int intValue = (int)(Math.random()*26+97);
			str += (char)intValue;
		}		
		System.out.println(str);
		
	}
}

+=的奇妙?

byte a = 5;
a = a+5;//報錯
byte a = 5;
a+=5;//正確,這就和+=符號底層設計有關了