日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java基本数据类型及String类

發(fā)布時(shí)間:2025/3/15 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基本数据类型及String类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基本類型,或者叫做內(nèi)置類型,是JAVA中不同于類的特殊類型。它們是我們編程中使用最頻繁的類型。java是一種強(qiáng)類型語(yǔ)言,第一次申明變量必須說明數(shù)據(jù)類型,第一次變量賦值稱為變量的初始化。

一、 Java的簡(jiǎn)單類型及其封裝器類

Java基本類型共有八種,基本類型可以分為三類,字符類型char,布爾類型boolean以及數(shù)值類型byte、short、int、long(整數(shù)型)float、double(浮點(diǎn)型)。

Java基本類型存儲(chǔ)在棧中,因此它們的存取速度要快于存儲(chǔ)在堆中的對(duì)應(yīng)包裝類的實(shí)例對(duì)象。從Java5.0(1.5)開始,JAVA虛擬機(jī)(Java Virtual Machine)可以完成基本類型和它們對(duì)應(yīng)包裝類之間的自動(dòng)轉(zhuǎn)換。因此我們?cè)谫x值、參數(shù)傳遞以及數(shù)學(xué)運(yùn)算的時(shí)候像使用基本類型一樣使用它們的包裝類,但這并不意味著你可以通過基本類型調(diào)用它們的包裝類才具有的方法。另外,所有基本類型(包括void)的包裝類都使用了final修飾,因此我們無(wú)法繼承它們擴(kuò)展新的類,也無(wú)法重寫它們的任何方法。

  • 基本類型的優(yōu)勢(shì):數(shù)據(jù)存儲(chǔ)相對(duì)簡(jiǎn)單,運(yùn)算效率比較高
  • 包裝類的優(yōu)勢(shì):有的容易,比如集合的元素必須是對(duì)象類型,滿足了java一切皆是對(duì)象的思想

二、Java中的常量(必須放進(jìn)常量池)

十六進(jìn)制整型常量:以十六進(jìn)制表示時(shí),需以0x或0X開頭,如0xff,0X9A。
八進(jìn)制整型常量:八進(jìn)制必須以0開頭,如0123,034。
長(zhǎng)整型:長(zhǎng)整型必須以L作結(jié)尾,如9L,342L。
浮點(diǎn)數(shù)常量:由于小數(shù)常量的默認(rèn)類型是double型,所以float類型的后面一定要加f(F)。同樣帶小數(shù)的變量默認(rèn)為double類型。
如:float f;
f=1.3f;//必須聲明f。
字符常量:字符型常量需用兩個(gè)單引號(hào)括起來(注意字符串常量是用兩個(gè)雙引號(hào)括起來)。Java中的字符占兩個(gè)字節(jié)。一些常用的轉(zhuǎn)義字符:
①\r表示接受鍵盤輸入,相當(dāng)于按下了回車鍵;
②\n表示換行;
③\t表示制表符,相當(dāng)于Table鍵;
④\b表示退格鍵,相當(dāng)于Back Space鍵;
⑤’表示單引號(hào);
⑥’'表示雙引號(hào);
⑦\(yùn)表示一個(gè)斜杠\。

三、Java引用類型

Java有 5種引用類型(對(duì)象類型):類 接口 數(shù)組 枚舉 標(biāo)注
引用類型:底層結(jié)構(gòu)和基本類型差別較大
JVM的內(nèi)存空間
(1). Heap 堆空間:分配對(duì)象 new Student()
(2). Stack 棧空間:臨時(shí)變量 Student stu
(3).Code 代碼區(qū) :類的定義,靜態(tài)資源 Student.class

Student stu = new Student(); //new 在內(nèi)存的堆空間創(chuàng)建對(duì)象 stu.study(); //把對(duì)象的地址賦給stu引用變量

上例實(shí)現(xiàn)步驟:

  • a.JVM加載Student.class 到Code區(qū)
  • b.new Student()在堆空間分配空間并創(chuàng)建一個(gè)Student實(shí)例
  • c.將此實(shí)例的地址賦值給引用stu, 棧空間

四、Java中的數(shù)據(jù)轉(zhuǎn)換

A.簡(jiǎn)單類型數(shù)據(jù)間的轉(zhuǎn)換,有兩種方式:自動(dòng)轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換,通常發(fā)生在表達(dá)式中或方法的參數(shù)傳遞時(shí)。
1.自動(dòng)轉(zhuǎn)換
具體地講,當(dāng)一個(gè)較"小"數(shù)據(jù)與一個(gè)較"大"的數(shù)據(jù)一起運(yùn)算時(shí),系統(tǒng)將自動(dòng)將"小"數(shù)據(jù)轉(zhuǎn)換成"大"數(shù)據(jù),再進(jìn)行運(yùn)算。而在方法調(diào)用時(shí),實(shí)際參數(shù)較"小",而被調(diào)用的方法的形式參數(shù)數(shù)據(jù)又較"大"時(shí)(若有匹配的,當(dāng)然會(huì)直接調(diào)用匹配的方法),系統(tǒng)也將自動(dòng)將"小"數(shù)據(jù)轉(zhuǎn)換成"大"數(shù)據(jù),再進(jìn)行方法的調(diào)用,自然,對(duì)于多個(gè)同名的重載方法,會(huì)轉(zhuǎn)換成最"接近"的"大"數(shù)據(jù)并進(jìn)行調(diào)用。這些類型由"小"到"大"分別為 (byte,short,char)--int--long--float—double。這里我們所說的"大"與"小",并不是指占用字節(jié)的多少,而是指表示值的范圍的大小。

  • 下面的語(yǔ)句可以在Java中直接通過:
byte b;int i=b; long l=b; float f=b; double d=b;
  • 如果低級(jí)類型為char型,向高級(jí)類型(整型)轉(zhuǎn)換時(shí),會(huì)轉(zhuǎn)換為對(duì)應(yīng)ASCII碼值,例如
char c='c'; int i=c; System.out.println("output:"+i);輸出:output:99;
  • 對(duì)于byte,short,char三種類型而言,他們是平級(jí)的,因此不能相互自動(dòng)轉(zhuǎn)換,可以使用下述的強(qiáng)制類型轉(zhuǎn)換。
short i=99 ; char c=(char)i; System.out.println("output:"+c);輸出:output:c;

2.強(qiáng)制轉(zhuǎn)換
將"大"數(shù)據(jù)轉(zhuǎn)換為"小"數(shù)據(jù)時(shí),你可以使用強(qiáng)制類型轉(zhuǎn)換。即你必須采用下面這種語(yǔ)句格式:

int n=(int)3.14159/2;

可以想象,這種轉(zhuǎn)換肯定可能會(huì)導(dǎo)致溢出或精度的下降。

B.表達(dá)式的數(shù)據(jù)類型自動(dòng)提升, 關(guān)于類型的自動(dòng)提升,注意下面的規(guī)則。

  • 所有的byte,short,char型的值將被提升為int型;
  • 如果有一個(gè)操作數(shù)是long型,計(jì)算結(jié)果是long型;
  • 如果有一個(gè)操作數(shù)是float型,計(jì)算結(jié)果是float型;
  • 如果有一個(gè)操作數(shù)是double型,計(jì)算結(jié)果是double型;
byte b; b=3; b=(byte)(b*3);//必須聲明byte。

C.包裝類過渡類型轉(zhuǎn)換
一般情況下,我們首先聲明一個(gè)變量,然后生成一個(gè)對(duì)應(yīng)的包裝類,就可以利用包裝類的各種方法進(jìn)行類型轉(zhuǎn)換了。例如:

  • 當(dāng)希望把float型轉(zhuǎn)換為double型時(shí):
float f1=100.00f; Float F1=new Float(f1); double d1=F1.doubleValue();//F1.doubleValue()為Float類的返回double值型的方法
  • 當(dāng)希望把double型轉(zhuǎn)換為int型時(shí):
double d1=100.00; Double D1=new Double(d1); int i1=D1.intValue();
  • 簡(jiǎn)單類型的變量轉(zhuǎn)換為相應(yīng)的包裝類,可以利用包裝類的構(gòu)造函數(shù)。即:
Boolean(boolean value)Character(char value)Integer(int value)Long(long value)Float(float value)Double(double value)

而在各個(gè)包裝類中,總有形為××Value()的方法,來得到其對(duì)應(yīng)的簡(jiǎn)單類型數(shù)據(jù)。利用這種方法,也可以實(shí)現(xiàn)不同數(shù)值型變量間的轉(zhuǎn)換,例如,對(duì)于一個(gè)雙精度實(shí)型類,intValue()可以得到其對(duì)應(yīng)的整型變量,而doubleValue()可以得到其對(duì)應(yīng)的雙精度實(shí)型變量。

D.字符串與其它類型間的轉(zhuǎn)換
1.其它類型向字符串的轉(zhuǎn)換

  • 調(diào)用類的串轉(zhuǎn)換方法:X.toString();
  • 自動(dòng)轉(zhuǎn)換:X+"";
  • 使用String的方法:String.volueOf(X);

2.字符串作為值,向其它類型的轉(zhuǎn)換

  • 先轉(zhuǎn)換成相應(yīng)的封裝器實(shí)例,再調(diào)用對(duì)應(yīng)的方法轉(zhuǎn)換成其它類型
//字符中"32.1"轉(zhuǎn)換double型的值的格式為: new Float("32.1").doubleValue()。 也可以用:Double.valueOf("32.1").doubleValue()
  • 靜態(tài)parseXXX方法
String s = "1"; byte b = Byte.parseByte( s ); short t = Short.parseShort( s ); int i = Integer.parseInt( s ); long l = Long.parseLong( s ); Float f = Float.parseFloat( s ) Double d = Double.parseDouble( s );
  • Character的getNumericValue(char ch)方法

E.Date類與其它數(shù)據(jù)類型的相互轉(zhuǎn)換

整型和Date類之間并不存在直接的對(duì)應(yīng)關(guān)系,只是你可以使用int型為分別表示年、月、日、時(shí)、分、秒,這樣就在兩者之間建立了一個(gè)對(duì)應(yīng)關(guān)系,在作這種轉(zhuǎn)換時(shí),你可以使用Date類構(gòu)造函數(shù)的三種形式:

Date(int year, int month, int date):以int型表示年、月、日 Date(int year, int month, int date, int hrs, int min):以int型表示年、月、日、時(shí)、分 Date(int year, int month, int date, int hrs, int min, int sec):以int型表示年、月、日、時(shí)、分、秒

在長(zhǎng)整型和Date類之間有一個(gè)很有趣的對(duì)應(yīng)關(guān)系,就是將一個(gè)時(shí)間表示為距離格林尼治標(biāo)準(zhǔn)時(shí)間1970年1月1日0時(shí)0分0秒的毫秒數(shù)。對(duì)于這種對(duì)應(yīng)關(guān)系,Date類也有其相應(yīng)的構(gòu)造函數(shù):Date(long date)。
獲取Date類中的年、月、日、時(shí)、分、秒以及星期你可以使用Date類的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法,你也可以將其理解為將Date類轉(zhuǎn)換成int。
而Date類的getTime()方法可以得到我們前面所說的一個(gè)時(shí)間對(duì)應(yīng)的長(zhǎng)整型數(shù),與包裝類一樣,Date類也有一個(gè)toString()方法可以將其轉(zhuǎn)換為String類
有時(shí)我們希望得到Date的特定格式,例如20020324,我們可以使用以下方法

//首先在文件開始引入 import java.text.SimpleDateFormat; import java.util.*; java.util.Date date = new java.util.Date(); //如果希望得到Y(jié)YYYMMDD的格式 SimpleDateFormat sy1=new SimpleDateFormat("yyyyMMDD"); String dateFormat=sy1.format(date); //如果希望分開得到年,月,日 SimpleDateFormat sy=new SimpleDateFormat("yyyy"); SimpleDateFormat sm=new SimpleDateFormat("MM"); SimpleDateFormat sd=new SimpleDateFormat("dd"); String syear=sy.format(date); String smon=sm.format(date); String sday=sd.format(date);

F.總結(jié):只有boolean不參與數(shù)據(jù)類型的轉(zhuǎn)換

  • 自動(dòng)類型的轉(zhuǎn)換:
a.常數(shù)在表數(shù)范圍內(nèi)是能夠自動(dòng)類型轉(zhuǎn)換的 b.數(shù)據(jù)范圍小的能夠自動(dòng)數(shù)據(jù)類型大的轉(zhuǎn)換(注意特例)intfloatlongfloatlongdouble 是不會(huì)自動(dòng)轉(zhuǎn)換的,不然將會(huì)丟失精度 c.引用類型能夠自動(dòng)轉(zhuǎn)換為父類的 d.基本類型和它們包裝類型是能夠互相轉(zhuǎn)換的
  • 強(qiáng)制類型轉(zhuǎn)換:用圓括號(hào)括起來目標(biāo)類型,置于變量前

五、String類

String是java的 一個(gè)類,而不是基本數(shù)據(jù)類型,以下是關(guān)于String的幾個(gè)面試題:

  • 例1:String類型的st1和st2是否相等
public class MyString {public static void main(String[] args) {String st1 = "abc";String st2 = "abc";System.out.println(st1 == st2);//TrueSystem.out.println(st1.equals(st2)); //True} }

解釋:在Java中==這個(gè)符號(hào)是比較運(yùn)算符,它可以基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是否相等,如果是基本數(shù)據(jù)類型,==比較的是值是否相等,如果是引用數(shù)據(jù)類型,==比較的是兩個(gè)對(duì)象的內(nèi)存地址是否相等。而equals是Object這個(gè)父類的方法,在String類中重寫了這個(gè)equals方法。
內(nèi)存大致流程:

1)運(yùn)行先編譯,然后當(dāng)前類MyString.class文件加載進(jìn)入內(nèi)存的方法區(qū) 2)第二步,main方法壓入棧內(nèi)存 3)常量池創(chuàng)建一個(gè)“abc”對(duì)象,產(chǎn)生一個(gè)內(nèi)存地址 4)然后把“abc”內(nèi)存地址賦值給main方法里的成員變量st1,這個(gè)時(shí)候st1根據(jù)內(nèi)存地址,指向了常量池中的“abc”。 5)前面一篇提到,常量池有這個(gè)特點(diǎn),如果發(fā)現(xiàn)已經(jīng)存在,就不在創(chuàng)建重復(fù)的對(duì)象 6)運(yùn)行到代碼 Stringst2 =”abc”, 由于常量池存在“abc”,所以不會(huì)再創(chuàng)建,直接把“abc”內(nèi)存地址賦值給了st2 7)最后st1和st2都指向了內(nèi)存中同一個(gè)地址,所以兩者是完全相同的。
  • 例2:下面這句話在內(nèi)存中創(chuàng)建了幾個(gè)對(duì)象
String st1 = new String(“abc”);

內(nèi)存中創(chuàng)建兩個(gè)對(duì)象,一個(gè)在堆內(nèi)存,一個(gè)在常量池,堆內(nèi)存對(duì)象是常量池對(duì)象的一個(gè)拷貝副本

new出來的對(duì)象都是存儲(chǔ)在堆內(nèi)存。那為什么堆中對(duì)象是常量池的對(duì)象的拷貝副本。“abc”屬于字符串,字符串屬于常量,所以應(yīng)該在常量池中創(chuàng)建,所以第一個(gè)創(chuàng)建的對(duì)象就是在常量池里的“abc”。第二個(gè)對(duì)象在堆內(nèi)存為啥是一個(gè)拷貝的副本呢,這個(gè)就需要在JDK API 1.6找到String(String original)這個(gè)構(gòu)造方法的注釋:初始化一個(gè)新創(chuàng)建的 String 對(duì)象,使其表示一個(gè)與參數(shù)相同的字符序列;換句話說,新創(chuàng)建的字符串是該參數(shù)字符串的副本。所以,答案就出來了,兩個(gè)對(duì)象。

  • 例3:以下定義為String類型的st1和st2是否相等
public class MyString {public static void main(String[] args) {String st1 = new String("abc");String st2 = "abc";System.out.println(st1 == st2);//比較內(nèi)存地址FlaseSystem.out.println(st1.equals(st2));//比較值True} }

  • 例4:以下定義為String類型的st1和st2是否相等
public class MyString {public static void main(String[] args) {String st1 = "a" + "b" + "c";String st2 = "abc";System.out.println(st1 == st2);//trueSystem.out.println(st1.equals(st2));//true} }

解釋:“a”,”b”,”c”三個(gè)本來就是字符串常量,進(jìn)行+符號(hào)拼接之后變成了“abc”,“abc”本身就是字符串常量(Java中有常量?jī)?yōu)化機(jī)制),所以常量池立馬會(huì)創(chuàng)建一個(gè)“abc”的字符串常量對(duì)象,在進(jìn)行st2=”abc”,這個(gè)時(shí)候,常量池存在“abc”,所以不再創(chuàng)建。所以,不管比較內(nèi)存地址還是比較字符串序列,都相等。

  • 例5:以下st2和st3是否相等
public class MyString {public static void main(String[] args) {String st1 = "ab";String st2 = "abc";String st3 = st1 + "c";System.out.println(st2 == st3);//falseSystem.out.println(st2.equals(st3));//true} }

第二個(gè)是true不用解釋,可第一個(gè)判斷為什么是false?需要結(jié)合API的注釋說明和內(nèi)存圖來解釋這個(gè)為什么不相等。API的解釋可以濃縮成:str1 與 "c" 進(jìn)行字符串連接時(shí),底層是通過StringBuffer 進(jìn)行 append,生成一個(gè)StringBuffer對(duì)象,然后通過toString()方法,將StringBuffer對(duì)象轉(zhuǎn)為String,此時(shí)會(huì)產(chǎn)生一個(gè)新的堆內(nèi)存地址,str3指向這個(gè)新的內(nèi)存地址。

內(nèi)存流程:

1.常量池創(chuàng)建“ab”對(duì)象,并賦值給st1,所以st1指向了“ab” 2.常量池創(chuàng)建“abc”對(duì)象,并賦值給st2,所以st2指向了“abc” 3.由于這里走的+的拼接方法,所以第三步是使用StringBuffer類的append方法,得到了“abc”,這個(gè)時(shí)候內(nèi)存0x123表示的是一個(gè)StringBuffer對(duì)象,注意不是String對(duì)象。 4.調(diào)用了Object的toString方法把StringBuffer對(duì)象裝換成了String對(duì)象。 5.String對(duì)象(0x456)賦值給st3

本文參考1
本文參考2

總結(jié)

以上是生活随笔為你收集整理的Java基本数据类型及String类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。