本文目錄一覽:
java8中的字符串的用法
1.
首先String不屬於8種基本數據類型,String是一個對象。
因為對象的默認值是null,所以String的默認值也是null;但它又是一種特殊的對象,有其它對象沒有的一些特性。
2.
new String()和new String(“”)都是申明一個新的空字符串,是空串不是null;
3.
String str=”kvill”;
String
str=new String (“kvill”);的區別:
在這裡,我們不談堆,也不談棧,只先簡單引入常量池這個簡單的概念。
常量池(constant
pool)指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。它包括了關於類、方法、接口等中的常量,也包括字符串常量。
看例1:
String
s0=”kvill”;
String
s1=”kvill”;
String
s2=”kv” + “ill”;
System.out.println(
s0==s1 );
System.out.println(
s0==s2 );
結果為:
true
true
首先,我們要知道Java會確保一個字符串常量只有一個拷貝。
因為例子中的s0和s1中的”kvill”都是字符串常量,它們在編譯期就被確定了,所以s0==s1為true;而”kv”和”ill”也都是字符串常量,當一個字符串由多個字符串常量連接而成時,它自己肯定也是字符串常量,所以s2也同樣在編譯期就被解析為一個字符串常量,所以s2也是常量池中
”kvill”的一個引用。
所以我們得出s0==s1==s2;
用new
String() 創建的字符串不是常量,不能在編譯期就確定,所以new String() 創建的字符串不放入常量池中,它們有自己的地址空間。
看例2:
String
s0=”kvill”;
String
s1=new String(”kvill”);
String
s2=”kv” + new String(“ill”);
System.out.println(
s0==s1 );
System.out.println(
s0==s2 );
System.out.println(
s1==s2 );
結果為:
false
false
false
例2中s0還是常量池中”kvill”的應用,s1因為無法在編譯期確定,所以是運行時創建的新對象”kvill”的引用,s2因為有後半部分new
String(“ill”)所以也無法在編譯期確定,所以也是一個新創建對象”kvill”的應用;明白了這些也就知道為何得出此結果了。
4.
String.intern():
再補充介紹一點:存在於.class文件中的常量池,在運行期被JVM裝載,並且可以擴充。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調用intern()方法時,Java查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等於str的字符串並返回它的引用;看例3就清楚了
例3:
String
s0= “kvill”;
String
s1=new String(”kvill”);
String
s2=new String(“kvill”);
System.out.println(
s0==s1 );
System.out.println(
“**********” );
s1.intern();
s2=s2.intern();
//把常量池中“kvill”的引用賦給s2
System.out.println(
s0==s1);
System.out.println(
s0==s1.intern() );
System.out.println(
s0==s2 );
結果為:
false
**********
false
//雖然執行了s1.intern(),但它的返回值沒有賦給s1
true
//說明s1.intern()返回的是常量池中”kvill”的引用
true
最後我再破除一個錯誤的理解:
有人說,“使用String.intern()方法則可以將一個String類的保存到一個全局String表中,如果具有相同值的Unicode字符串已經在這個表中,那麼該方法返回表中已有字符串的地址,如果在表中沒有相同值的字符串,則將自己的地址註冊到表中“如果我把他說的這個全局的
String表理解為常量池的話,他的最後一句話,“如果在表中沒有相同值的字符串,則將自己的地址註冊到表中”是錯的:
看例4:
String
s1=new String(“kvill”);
String
s2=s1.intern();
System.out.println(
s1==s1.intern() );
System.out.println(
s1+” “+s2 );
System.out.println(
s2==s1.intern() );
結果:
false
kvill
kvill
true
在這個類中我們沒有聲名一個”kvill”常量,所以常量池中一開始是沒有”kvill”的,當我們調用s1.intern()後就在常量池中新添加了一個”kvill”常量,原來的不在常量池中的”kvill”仍然存在,也就不是“將自己的地址註冊到常量池中”了。
s1==s1.intern()為false說明原來的“kvill”仍然存在;
s2現在為常量池中“kvill”的地址,所以有s2==s1.intern()為true。
5.
關於equals()和==:
這個對於String簡單來說就是比較兩字符串的Unicode序列是否相當,如果相等返回true;而==是比較兩字符串的地址是否相同,也就是是否是同一個字符串的引用。
6.
關於String是不可變的
這一說又要說很多,大家只要知道String的實例一旦生成就不會再改變了,比如說:String
str=”kv”+”ill”+” “+”ans”;
就是有4個字符串常量,首先”kv”和”ill”生成了”kvill”存在內存中,然後”kvill”又和”
“ 生成 ”kvill “存在內存中,最後又和生成了”kvill
ans”;並把這個字符串的地址賦給了str,就是因為String的“不可變”產生了很多臨時變量,這也就是為什麼建議用StringBuffer的原因了,因為StringBuffer是可改變的。
Java中 “字符類型”與“字節類型”的區別是什麼?
byte字節類型是JAVA中最小的數據類型,它在內存中佔8位,取值範圍從-128到127,
賦值:byte i = 127;註:byte型在賦值時,一旦超過127或小於-128,則會產生編譯錯誤。
char字符類型在內存中佔2個字節。表示一個字符,也可以使用A SCII碼範圍內的值來給char型的變量賦值。由於字符在內存中的取值不存在負數範圍,所有取值範圍從0到655 35。
賦值:char i = ‘a’; 或者 char i = 97;
註:在java中,字符的表現形式為單個字符加上一對單引號修飾。
首先得知道byte的概念和作用:
byte即字節的意思,是java中的基本類型,用來申明字節型的變量。
通常在讀取非文本文件時(如圖片,聲音,可執行文件)需要用字節數組來保存文件的內容,在下載文件時,
也是用byte數組作臨時的緩衝器接收文件內容。所以說byte在文件操作時是必不可少的。不管是對文件寫入還是
讀取都要用到。byte在java中是一種是數據類型,代表一個字節,一個字節包含8個位,所以,byte類型的取值范
圍是-128到127。
在某些程序中(尤其是和硬件有關的程序)會將某些數據存儲到字節類型的變量中,比如00110010,其中每個
位都代表一個參數,然後以位運算的方式對參數進行取值和賦值操作。
機器只知道字節,而字符卻是語義上的單位,它是有編碼的,一個字符可能編碼成1個2個甚至3個4個字節。這跟字
符集編碼有關係,英文字母和數字是單字節,但漢字這些自然語言中的字符是多字節的。一個字節只能表示255個字
符,不可能用於全球那麼多種自然語言的處理,因此肯定需要多字節的存儲方式。而InputStream, OutputStream
它們是處理字節流的,就是說假設所有東西都是二進制的字節,而 Reader, Writer 則是字符流,它涉及到字符集
的問題;按照ANSI編碼標準,標點符號、數字、大小寫字母都佔一個字節,漢字佔2個字節。按照UNICODE標準所有
字符都佔2個字節。
在java中如何輸入一個char型字符。
可以創建Scanner類來從鍵盤輸入一個字符,用String類型來接收,再使用String的charAt功能,具體步驟如下:
1、先創建一個Scanner對象,如:Scanner sc = new Scanner(System.in);
2、然後再調用Scanner對象sc的next()方法獲取控制台輸入,定義一個String類型的變量s來接收控制台輸入的字符,如:String s = sc.next();
3、調取變量s的charAt(0)方法獲取第一個字符,如:char c = s.charAt(0);
擴展資料
字符型值有如下三種表示形式
1、直接通過單個字符來指定字符型值,例如‘A’、‘9’和‘0’等。
2、通過轉義字符表示特殊字符型值,例如‘\n’、‘\t’等。
3、直接使用Unicode值來表示字符型值,格式是‘\uXXXX’,其中XXXX代表一個十六進制的整數
字符型值也可以採用十六進制編碼方式來表示,範圍是‘\u0000’~‘\uFFFF’,一共可以表示65536個字符,其中前256個(‘\u0000’~‘\u00FF’)字符和ASCII碼中的字符完全重合。
由於計算機底層保存字符時,實際是保存該字符對應的編號,因此char類型的值也可直接作為整型值來使用,它相當於一個16位的無符號整數,表數範圍是0~65535。
如果把0~65535範圍內的一個int整數賦給char類型變量,系統會自動把這個int整數當成char類型來處理。
參考資料:百度百科-char數據類型
原創文章,作者:WQJB,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131469.html