Java基礎入門之數據類型

Java的基礎學習記錄一

數據類型

Java數據類型可以分爲:基本類型、引用類型
基本類型:整數型(byte、short、int、long)、浮點型(float、double)布爾型(true、false)、字符型(char)
引用類型: 數組(array)、類(class)、接口(interface),還有一個比較特殊的String類,可以當字符串操作

一、基本數據類型

整數型數據類型

1、byte 佔8個字節 取值範圍 -128 ~ 127 即 -2的7次方 ~ 2的7次方 - 1
2、short 佔16個字節 取值範圍 -32768 ~ 32767 即 -2的15次方 ~ 2的15次方 - 1
3、int 佔32個字節 取值範圍 -2147483648 ~ 2147483647 即 -2的31次方 ~ 2的31次方 - 1
4、long 佔64個字節 取值範圍 -9223372036854775808 ~ 9223372036854775807 即 -2的63次方 ~ 2的63次方 - 1
注意:
a、整數型的默認值都爲0
b、整型在轉換的過程中,從範圍大的轉範圍小的可以自動轉換。相反,則需要強制轉換,一般不推薦因爲可能會出現精度丟失。
c、整數型進行運算的時候返回值的結果自動進行轉換

int num = 10 //這裏的10就是整數型int
byte  num1 = 15; //在沒有超過byte的取值返回,會自動進行類型轉換
byte num2 = (byte)128; //一旦超過取值返回,必須進行強制轉換
int result = 5/2; //正常計算爲2.5,賦給int result變量進行自動轉換爲2

浮點型數據類型

1、float 佔32個字節 取值範圍爲 1.4E-45 ~ 3.4028235E38,即 2的-149次方 到2的128次方 -1
2、double 佔64個字節 取值範圍爲 4.9E-324 ~1.7976931348623157E308
即2的-1074次方 ~ 2的1024次方-1
注意:
a、浮點型的默認值都爲0.0
b、整型在轉換的過程中,從範圍大的轉範圍小的可以自動轉換。相反,則需要強制轉換,一般不推薦因爲可能會出現精度丟失。
c、整數型進行運算的時候返回值的結果自動進行轉換

float num = 3.0;//這裏3.0爲float型
double num = 4.0;//這裏4.0爲double型
double result = 5/2;//result結果爲2.5,這與整數型的結果不一致

布爾型數據類型

1、true 表示邏輯的真
2、false 表示邏輯的假

if(flag == true){
	//條件成立
}
if(flag == false)
	//條件不成立
}

注意:
a、部分編程語言不僅僅有true 或者 false ,0、“”、“0”也可以被當成布爾值中的false ,而1、非0的數據都被當成true。在java中只有true或者false。

##字符型數據類型
1、通過單引號’ ‘包起來的字符,如’a’、'b’等,是可以包含中文字符的。
注意:
a、字符型跟數值型是可以相互轉化的,他們是用過編碼表聯繫在一起,如
b、0和‘0’是不一樣的,‘0’在轉換爲數值型的時候並不等同於0,而是等於編碼爲0的二進制

char a = 'A';
char b = 'A'+ 1;
int num = c;
System.out.println(c);//這裏的結果爲65
System.out.println(b);//這裏的結果爲b

b、字符型只能夠包含有一個字符並且被‘’單引號包含

##特殊的字符串類型(String)
字符串是一個比較特殊的例子,Java中沒有字符串這種數據類型,但是在開發過程中是比較需要這種數據類型的,所以Java中有個String類用來解決字符串問題。這個類比較特殊,一般類的使用是需要通過對象或者靜態調用的形式,但是String內部做了特殊的操作(“”)直接使用雙引號也相當於調用了String類,也可以直接實例化String對象

String str = "This is a String 1"; //直接使用雙引號
String str2 = new String("This is a String 2");//使用實例化對象的方式

注意:
a、在字符串和數值類型進行+的時候,這時候的+並不是傳統數值的+,而是字符串的拼接
字符串類型是一個比較特殊而且複雜的類型,至於其他一些複雜的東西到後面再一一記錄吧。

二、引用數據類型

在java中引用類型是比較常用且重要的一種數據類型。引用的話就會牽扯到內存的使用,包括堆棧的使用。如類、數組、接口這些引用數據類型它們的使用都與內存息息相關。

數組類型

1、數組初始化方式:動態初始化、靜態初始化
動態初始化:在數組聲明的時候爲其設置固定長度且默認內容爲數組數據類型的默認值
聲明以及初始化方式:

//聲明格式:數據類型 數組名稱 [] = new 數據類型[數組長度]
int intArray [] = new int[10];//定義了一個數組長度爲10的int數組
int [] intArray = new int[10];//兩種聲明格式都一樣

靜態初始化 :在數組聲明的時候就設置好了數組的內容
聲明以及初始化方式:

//聲明格式:數據類型 數組名稱 [] = new 數據類型[數組長度]
int intArray [] = {12345};//簡化格式,但是一般不推薦
int [] intArray = new int{123456};//聲明瞭一個int數組並且數組內容爲{1,2,3,4,5,6}

2、數組的使用:
a、使用 數組名[數組下標]的方式,下標從0開始。有可能會存在下標越界的錯誤,在使用了超過下標值的數組值。
b、數組常用於循環遍歷:for以及for增強型循環的方式

int arrayData [] = new int []{1,2,3,4,5,6,7};//靜態初始化一個數組
//使用for循環遍歷數組
for(int i = 0; i< arrayData.length;i++){
	System.out.println("下標值爲"+i+"的值爲:"+arrayData[i]);
}
//使用增強型for循環遍歷數組
for(int temp : arrayData){
	System.out.println(temp);
}

兩種循環方式都能夠遍歷數組,但是第一種方式要是判斷不正確下標值可能會出現下標越界的錯誤,第二種則很好的規避了這個問題,但是在使用效果上面兩個都是一樣的。
3、數組內存分析:
數組是引用類型的數據,也就是說它跟內存是離不開的。我們發現在聲明以及初始化數組的時候,有一個關鍵字new,這是一個開闢內存的標識。在java中new 任何對象都是在向堆內存開闢一個存儲空間。畫一個簡單的內存圖:
在這裏插入圖片描述
上圖的內存圖就好比創建了一個名字爲array的數組,他的長度爲4,數組內容爲別爲60、43、23、34

int array [] = new int[]{60,43,23,34}

我們每次聲明的變量名都是存放在棧內容,就好比把名字放了棧內存,而堆內存存放的是一個引用類型的數據,其實就是一個內存地址。在上圖中,array[0]對應了一個array[0]的地址,而array[0]的地址就鏈接到60這個內存地址。第一給個array[0]跟第二個array[0]是有所區別的雖然他們都是一樣的名稱。在這裏只是對內存分析按照我個人的理解簡單分析,具體更深入深層的分析要隨着個人對於內存引用的深入纔能有更好的理解。

4、方法可變傳參
在很多情況下,我們需要傳遞變長的參數。在傳統的寫法中,提到變長(也就是長度不確定的情況)我們會想到用一個參數數組,這種方法也可以實現,但是有一種更加簡潔的方式,就是使用變長參數。在jdk1.5之後引入了這個特性。

public void mulitParamters(int ... data){
	for(int temp : data){
		System.out.println(temp);
	}
}
//使用方式
mulitParamters(1,2,3,4,5);//系統會自動將這些參數轉變爲一個數組去操作

通過變長參數的方式使我們的需求更加簡潔容易去實現。

至於數組的其他一些用法更多的還是要在平時編碼的過程中去熟練,這裏就不一一記錄的。多看api文檔多敲鍵盤~數組是每一門變成語言中必不可要的一部分也是非常重要在一部分,在以後也項目開發中可能很少會使用到簡單的數組,但是想集合以及一起一些數據結構都是跟數組離不開的。

字符串類型

在大多數編程語言中,很少有字符串這種概念。但是在實際開發中卻是必不可少的。java中,利用了char數組以及byte數組原理拼接成字符串,也就是利用了String類,它的底層原理就是利用char數據(在jdk8之前),也利用了byte數組(在jdk8以後)。

字符串的定義:

1、使用直接賦值的方式

String str = "This is a String"; //利用雙引號直接賦值的方式定義

2、使用實例化String類對象創建

String str = new String("This is a String");//通過實例化創建字符串對象

這兩種方式的創建效果上相同,在創建行爲還是有很大的不同。下面分析一下這兩種創建方式的不同
第一種是通過雙引號直接創建一個字符串,而這個字符串是直接放在了一個字符串常量池裏面的,就好比你買了一個東西一樣,之後你如果還需要這個東西是可以直接拿出來用,不需要再去買了,而如果這件東西數據庫常量池 沒有的話,第一次是需要去購買的而以後再次需要就不用了。

String str = "goldenlee";
String str1 = "goldenlee";

這兩個字符串按照傳統的理解方式應該是創建了兩個字符串對象,但是實際情況是str利用雙引號創建了一個內容爲goldenlee的字符串,隨後將這個字符串放進了常量池,str1這個對象賦值的時候直接從常量池中取出這個字符串,並不需要再次創建,也就是說共享了這個字符串。在使用這種創建方式,是可以適當的減少內存消耗的。

第二種通過實例化String類對象創建

String str = new String("goldenlee");
String str1 = new String("goldenlee");

以上這兩個字符串是通過創建實例化對象創建的,在初始化的時候也使用了雙引號,也就是說會產生字符串對象放進常量池,但是在這裏的話goldenlee這個字符串只產生一次,第二次的話就是直接從常量池裏面取出來 。但是這裏並不是通過這種方式產生,而是將這個字符串傳遞給String類,從而產生一個String類的實例對象,也就是說這裏的兩個字符串的創建分別創建了兩個String的對象,他們的內容是互不共享的。

通過比較這兩種創建方式,發現前者的內存性能相對較好,但是實現上卻沒有那麼直觀,會讓人誤以爲這只是一個簡單的字符串,而實際上 這是一個String類的字符串對象,後者的直觀性比較好,別人一看就知道這是個對象可以操作方法,但是在創建上會產生一些垃圾,所以個人建議使用第一種方式比較好。

字符串常量池:靜態常量池、運行常量池

池一般來說就是防止東西的地方,就好像倉庫一樣需要的時候就拿出來用,不需要的時候就放在裏面。
靜態常量池:很多時候我們在項目編碼階段就定義好了通過雙引號創建的字符串常量就會直接放入這個靜態常量池。
運行常量池:我們在項目運行的時候動態地通過雙引號創建的字符串常量就會放入動態常量池。

String str = "Thisis a Str";//在編譯階段已經創建好的,會放入靜態常量池
String info = "This is a Str1";
String str1 = info + "goldenlee";//因爲info是變量會動態發生變化的,所以在編譯階段不會放入靜態常量池,而會在運行階段放入運行常量池

字符串常量

字符串在被創建之後是不會被改變的,也就是說字符串是一個常量。

String str = "String Demo";//這個String Demo 一旦被創建它就一直是Strig demo
String str= "123";//str對象變成了123,實際上是str這個對象發生了變化,而之前的String Demo 還是String Demo

其他一些String的類庫方法就不在這裏一一詳細描述,字符串在實際設計開發之中是相當重要的,要掌握Strig字符串不是很容易,需要在平時的開發實踐中去熟練而已總結領悟。

總結

爲什麼要記錄這些比較基礎性的東西呢,因爲之前以前一直寫的是PHP,陸陸續續也接觸過javaee,。現在想重新學習java,就邊複習以前學習過的模糊的知識點回憶起來。另一方面就是爲了記錄自己的學習,讓自己的成長以及學習的計劃有一個清楚的脈絡。加油~

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