1、數據類型
Java支持數據類型分為兩類: 基本數據類型和引用數據類型。
基本數據類型共有8種,可以分為三類:
- 數值型:整數類型(byte、short、int、long)和浮點類型(float、double)
- 字符型:char
- 布爾型:boolean
8種基本數據類型的默認值、位數、取值范圍,如下表所示:
Float和Double的最小值和最大值都是以科學記數法的形式輸出的,結尾的“E+數字”表示E之前的數字要乘以10的多少倍。比如3.14E3就是3.14×1000=3140,3.14E-3就是3.14/1000=0.00314。
注意一下幾點:
- java八種基本數據類型的字節數:1字節(byte、boolean)、 2字節(short、char)、4字節(int、float)、8字節(long、double)
- 浮點數的默認類型為double(如果需要聲明一個常量為float型,則必須要在末尾加上f或F)
- 整數的默認類型為int(聲明Long型在末尾加上l或者L)
- 八種基本數據類型的包裝類:除了char的是Character、int類型的是Integer,其他都是首字母大寫
- char類型是無符號的,不能為負,所以是0開始的
2、自動類型轉換
轉換規則:從存儲范圍小的類型到存儲范圍大的類型。簡言之,由低到高。
具體規則為:byte→short(char)→int→long→float→double
經典面試題
1、short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 +=1;有什么錯?
答案:對於short s1 = 1; s1 = s1 + 1;來說,在進行s1 + 1運算時會自動提升表達式的類型為int,那么將int類型賦值給short類型的變量s1會出現類型轉換錯誤。
對於short s1=1;s1+=1來說, +=是java語言規定的運算符,java編譯器會對它進行特殊處理,因此可以正確編譯。
2、char類型變量能不能儲存一個中文的漢子,為什么?
答案:
char類型變量使用的是Unicode編碼的字符,Unicode字符集包含了漢字,所以char類型當然可以存儲漢字,還有一種特殊情況就是某個生僻字沒有包含在unicode編碼字符集中,那么就char類型就不能存儲該生僻字。
3、Integer和int的區別
答案:
int是java的8種內置的原始數據類型。Java為每個原始類型都提供了一個封裝類,Integer就是int的封裝類。
int變量的默認值為0,Integer變量的默認值為null,這一點說明Integer可以區分出未賦值和值為0的區別,比如說一名學生沒來參加考試,另一名學生參加考試全答錯了,那么第一名考生的成績應該是null,第二名考生的成績應該是0分。關於這一點Integer應用很大的。Integer類內提供了一些關於整數操作的一些方法,例如上文用到的表示整數的最大值和最小值。
4、switch語句能否作用在byte上,能否作用在long上,能否作用在string上?
答案:
byte的存儲范圍小於int,可以向int類型進行隱式轉換,所以switch可以作用在byte上
long的存儲范圍大於int,不能向int進行隱式轉換,只能強制轉換,所以switch不可以作用在long上
string在1.7版本之前不可以,1.7版本之后switch就可以作用在string上了
5、基本數據類型和引用數據類型的區別?
答案:無
6、.64位的JVM當中,int的長度是多少?
答案:Java 中,int 類型變量的長度是一個固定值,與平台無關,都是 32 位。意思就是說,在 32 位 和 64 位 的Java 虛擬機中,int 類型的長度是相同的。
7、可以將int強轉為byte類型么?會產生什么問題?
答案:可以做強制轉換,但是Java中int是32位的而byte是8 位的,所以,如果強制轉化int類型的高24位將會被丟棄,byte 類型的范圍是從-128到128
8、判斷輸出結果
public static void say() {
System.out.println(3 - 2.6 == 0.4);
}
答案:false ->int類型和float類型做運算會損失精度所以不等,可以System.out.println(3 - 2.6 )輸出結果並不等於0.4
9、java 中 float f = 3.4; 是否正確?
答案:不正確,因為3.4是雙精度類型屬於double類型,而double類型范圍大於float類型,如果想要賦給float類型必須強制轉 換:float f=(float)3.4或者float f=3.4F
byte->short->int->long->float->double (范圍從小到大)
10、輸出結果?
byte a = 127;
a+=5;
System.out.println(a);
答案:124。首先byte取值范圍-128~127 當a+=1時此時已經是超過了byte的臨界值此時輸出的為-128 、a+=2時輸出 為-127,以此類推a+=5時輸出為-124,只要記住這個技巧對於這個面試題就可以應對了。
11、為什么long l=2000000000可以,而long l=3000000000卻編譯報錯
答案:因為在Java中二十億和三十億的默認類型都是int類型的,而二十億是在int范圍類的,三十億不在int范圍內,所以后面的long l=300000000會編譯報錯。解決方法:在三十億后面加上一個大寫或者小寫的L
12、為什么 int a = 09;會報錯
答案:因為在進制表示中0開頭的表示八進制,而八進制中不能出現大於7的數!
13、int i = 3000000000; 編譯能通過嗎?原因是什么?(面試題)
答案:不能通過,因為三十億在Java中的默認數據類型為int,而三十億不在int能夠表示的范圍內,所以不能編譯通過
14、輸出結果?
int a=10;
double b=3.4;
System.out.println(a>b?a:b);
System.out.println(a);
//輸出:10.0 10
15、輸出結果?
int a=128;
byte b=(byte)a;
System.out.println(b);//輸出-128,出現了數據溢出
double c=1.23;
int d=(int)c;
System.out.println(d);//輸出1,精度丟失
16、輸出結果?
運算時,運算結果會向較大的類型轉換
int a=3;
double b=4;
System.out.println(a+b);//輸出7.0
17、為什么 byte b=10b會報錯?
答案:byte在java中表示字節,而b表示的是bit
參考博客:https://www.cnblogs.com/oldthree3/p/9088029.html
參考黑馬程序員
本文如果存在錯誤,歡迎大家留言評論。。。。