Java基礎突擊第一天0003·

Java數據類型

long 64bit

double 64bit

int 32bit

float 32bit

short 16bit

byte 8bit


public static void main(String[] args){
char a= (char) Integer.MAX_VALUE;
                System.out.println((int)a);
System.out.println("Hello World!");
try{
                   System.out.println("中".getBytes("UTF-8").length);
                   System.out.println("中中".getBytes("UTF-8").length);
                   System.out.println("中".getBytes("GBK").length);
                   System.out.println("中中".getBytes("GBK").length); 

                }catch(Exception e){}

}//main

輸出:

run:
65535   -->  2的16次方,char兩字節,16位,與short相當長度。short有符號位,數字爲15位,表示範圍爲-32768~32767
Hello World!、
3  --> UTF8編碼下,一個漢字3個字節
6
2  --> GBK編碼下,一個漢字2個字節
4


程序中用到getBytes()的用法:

將String類型的字符串轉換成byte類型,並且存入一個byte數組中。.length位獲得數組的長度屬性。
因爲在java中的所有數據底層都是字節,字符串可以存入到byte數組。
getBytes()是使用默認的字符集進行轉換,getBytes("utf-8")是使用UTF-8編碼表進行轉換。
程序中使用的Integer.MAX_VALUE的作用是:得到整型的最大值,即int的最大值(最大值+1變爲最小值)。再用強制類型轉換(char)進行截取。Integer最大作用在於字符串與整型的轉換,也具有自動裝箱拆箱功能(Object)。

爲了避免int溢出,可以在常量後加一L,或者變量前加(long)。

public static void main(String[] args){
int max = Integer.MAX_VALUE;
System.out.println(max);
System.out.println(max+1);
System.out.println(max+2L);  //L和l都可以,大小寫沒區別
System.out.println((long)max+2);

}//main

輸出:

2147483647
-2147483648
2147483649

2147483649

int類型與long類型相加,自動轉換爲long類型。

char可以看作無符號的整型數。與short的非負整數部分重合(0~32767)。

public static void main(String[] args){
iint int_max = Integer.MAX_VALUE;
int char_max = (char)Integer.MAX_VALUE;
int short_max = Short.MAX_VALUE;
long long_max = Long.MAX_VALUE;
char a = 97;
char b = 'a';
int c = 'a';
System.out.println("char variable a is :"+a);
System.out.println("char variable b is :"+b);
System.out.println("int variable c is :"+c);
System.out.println("The max of int is :"+int_max);
System.out.println("The max of char is :"+char_max);
System.out.println("The max of short is :"+short_max);
System.out.println("The max of long is :"+long_max);
}//main

輸出:

char variable a is :a
char variable b is :a
int variable c is :97
The max of int is :2147483647
The max of char is :65535
The max of short is :32767

The max of long is :9223372036854775807

原碼,反碼和補碼

正數的原碼、反碼、補碼都相等 
例:0000 1010(在十進制中表示+10,左數第一位爲符號位) 
    它的原碼、反碼、補碼都是0000 1010 

負數的原碼是其本身,負數的反碼是將符號不變,把符號後邊的數取反,對於負數的補碼 是把原碼取反後加1 
例:1000 1010(在十進制中表示-10) 
 它的原碼是 1000 1010 
 它的反碼是 1111 0101 

 它的補碼是 1111 0110


數據類型轉換:

自動類型轉換:由範圍小到範圍大,且兩者數據類型兼容的時候,爲自動轉換,如f轉換d,s轉換i,i轉換l。

強制類型轉換:反過來...

String屬於引用數據類型,任何數據類型碰到String類型的變量或者常量都向String類型轉換。

public static void main(String[] args){

int x = 10;  float y = 3.5f;
float z = x/y;
System.out.println(z);                    //整型和浮點型,自動轉換浮點型
System.out.println((int)z);             //浮點型強制轉換整型,截斷小數部分

System.out.println((int)(z+0.5));    //若要四捨五入,在小數部分加0.5再強制轉換


         String str = "Hello No.";
int numberA = 0;
int numberB = 7;
int numberC = 1;
int numberD = -1;
System.out.println(str+numberA+(numberC+numberD)+numberB);

}//main

輸出:

2.857143
2
3

Hello No.007 //1和-1由於括號的加持先行運算,剩餘的兩個0並沒有和7相加,而是和7一起轉化爲String類型添加到了str的後面。

提問:int a=10  int b =3; float f = a/b 會不會編譯錯誤。

答:並不會    

int x = 10;  int y =3;
float z1 = x/y;            //x/y結果爲int類型,
float z2 = (float)x/y;  //(float)x/y結果爲float類型。
System.out.println(z1);

System.out.println(z2);

z1 = 3.0    z2 =3.3333333

不過反過來就要考慮下了,畢竟從float到int會損失精度。


               float x = 10.0;  float y =3.0;
//int z1 = x/y;        // x/y結果爲浮點數,直接賦值給int會損失精度,編譯錯誤。
int z2 = (int)(x/y);  //這裏注意的是,若寫成(int)x/y,按照優先級,x轉換爲int,y不變,出現編譯錯誤。
//System.out.println(z1);

System.out.println(z2);

爲什麼會有兩種與和或的操作?(&,&&,|,||)

&&, ||擁有短路功能。&和|則需要對所有條件進行判斷。

        public static void main(String[] args){

int a = 1;
int b = 2;
int c = 0;
if(b!=2 && a/c == 0){    //若換&會檢測所有布爾表達式,a/c則生成除數爲0的異常,編譯出錯。
                        
                }else{
System.out.println("compile with no error");//&&短路與則在第一個判定false之後自動判斷整個                                                                                                   //表達式爲false,不會生成除數爲0的異常。
}

}//main

輸出:compile with no error

短路或||和或|也是一樣

    public static void main(String[] args){

int a = 1;
int b = 2;
int c = 0;
if(b ==2 || a/c == 0){      //這裏如果用|會生成算術異常,除數爲0,編譯錯誤
System.out.println("compile with no error");
}else{

}

}//main

輸出:compile with no error

位運算符:^異或   ~取反   &與   |或   <<帶符號的左移位  >>帶符號的右移位  >>>不帶符號的右移位

正數的原碼,反碼,補碼相同。

負數的反碼爲符號位不變,原碼取反。補碼爲反碼+1。

int x = -3 ;  int z = ~x;   z = ?

負數x的原碼  1,0000000 XX  00000011     //XX省略中間16位數

負數x的反碼  1,1111111 XX  11111100

負數x的補碼  1,1111111 XX  11111101

~x 爲:        0,0000000  XX  0000010    --->>   2

所以z == 2;

<<左移填0   >>右移填充符號位 正0負1

int x = 3; int y = -3;

x<<2

0,0000000 XX 00000011  ->  0,0000000 XX 00001100   -> 12

y<<2  (給負數補碼,反向操作先-1再取反(符號位1不變),得到負數原碼)

1,1111111 XX 11111101  ->  1,1111111 XX 11110100  ->

 1,1111111 XX 11110011 -> 1,0000000 XX 00001100 -> -12

x >> 2

0,0000000 XX 00000011  -> 0,0000000 XX 00000000 -> 0

y >> 2 

1,1111111 XX 11111101 -> 1,1111111 XX 11111111 ->

1,1111111 XX 11111111 -> 1,0000000 XX 00000000 -> -1

x >>>2  ->  0  (x爲正數,跟x>>2一樣)

y >>> 2  無符號右移不補符號位,應該補0,連帶符號位一起右移。

0,0111111 XX 11111111  -> 2的30次方(6+8+8)-1 = 1073741823


優先級:

() 

[]   

!   +  -    一元運算符  由右向左

~                  位取反  由右向左

++  --                       由右向左

*  /  %

+  -        算術運算符

>>    <<

> >= < <=

==   !=

&

^

|

&&

||

?:      三目運算符  由右向左

=      賦值運算符  由右向左

不過,最好多用括號改變優先級。

int a = 10 , b = 6;

a -= b++;

b = 7;

a = 10 - 6 = 4;

int a = 10, b = 6;

a-=++b;

b= 7;

a = 10 - 7 =3;

三目運算符可以替代if-else

                int max = 0;
int a = 6;
int b = 8;
max = a>b?a:b;

System.out.println(max);

輸出:8

switch可以替換多分支的if結構。java1.5之前支持byte,short,char,int。1.5之後支持枚舉。1.7之後支持String。


public static void main(String[] agrs){
    System.out.println("Please input!");
    Scanner in = new Scanner(System.in);//需要加入import java.io.File和import java.util.Scanner
    String str=in.next();
    switch(str){
        case "abc":
            System.out.println("abc");
            break;
        case "bcd":
            System.out.println("bcd");
            break;
        default :
            System.out.println("default");
            break;
    

    }//switch
 }//main

輸入abc,則case "abc"成功,跳出循環。如果不加break,會從第一個滿足條件的case開始執行到default結束。

如果想在switch表達式加入boolean類型,可以考慮將boolean轉換爲String

  boolean flag1=true;
  boolean flag2=false;
  switch(flag1+""){
  case "true":
  System.out.println("boolean type:true");
  break;
  case "false":
  System.out.println("boolean type:flase");
  break;
  default :
  System.out.println("default");
  break;

}//switch flag1

輸出:boolean type:true

若switch中換成flag2,則輸出boolean type:false。

有意思的地方,byte short char int的包裝類,Byte Short Character Integer也都可以帶入表達式。不過這是由於1.5之後的自動拆箱(將引用數據類型轉換爲基本數據類型)和自動裝箱功能(將基本數據類型轉換爲引用數據類型)。

Byte拆箱調用byteValue()方法,其他類似。所以switch只支持byte short char int 枚舉 java.lang.String.


如果不加break,會從第一個滿足條件的case開始執行到default結束。不過default加不加break感覺意義不大。


  int a = 3;
  int b = 6;
  char op = '+';
  switch(op){
      case '+':
          System.out.println("Plus:"+(a+b));
      case '-':
           System.out.println("Minus:"+(a-b));
      case '*':
           System.out.println("Multiply:"+(a*b));
      case '/':
          System.out.println("Divided:"+(a/b));
      default :
          System.out.println("What are you doing?");

}//switch op

輸出:

Plus:9
Minus:-3
Multiply:18
Divided:0

What are you doing?

從第一個符合條件的case開始一直輸出到default結束。

break跳出當前循環。continue跳出當前循環並回到循環開始處繼續執行。

while和do while不同之處爲do while必定會執行一次。

while/do while和for的區別:while系列並不一定要明確知道循環次數。for需要明確循環次數。

String屬於引用數據類型,任何數據類型碰到String類型的變量或者常量都向String類型轉換。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章