本文目錄一覽:
- 1、java中一個字元是幾個位元組?字元和位元組是同等的嗎?
- 2、Java的字元串都有什麼?字元串可以轉換為任意數值嗎?
- 3、java字元串問題
- 4、java啥是字元型
- 5、在java中如何輸入一個char型字元。
java中一個字元是幾個位元組?字元和位元組是同等的嗎?
Java規定了字元的內碼要用UTF-16編碼,一個字元是2個位元組。外碼字元所佔位元組取決於具體編碼。字元和位元組是不一樣的。
外碼編碼不同,字元和位元組的換算不同,幾種常見的編碼換算如下:
ASCII編碼是單位元組編碼,只有英文字元,不能編碼漢字。
GBK編碼1個英文字元是1個位元組,一個漢字是是2個位元組。
UTF-8編碼1個英文字元是1個位元組,一個漢字是3個位元組。
Unicode編碼1個英文字元是2個位元組,一個漢字是2個位元組。
擴展資料:
漢字編碼的困難點 漢字進入計算機,有許多困難,其原因主要有三點:
①數量龐大:一般認為,漢字總數已超過6萬個(包括簡化字)。雖有研究者主張規定3000多或4000字作為當代通用漢字,但仍比處理由二三十個字母組成的拼音文字要困難得多。
②字形複雜:有古體今體,繁體簡體,正體異體;而且筆畫相差懸殊,少的一筆,多的達36筆,簡化後平均為9.8筆。
③存在大量一音多字和一字多音的現象:漢語音節416個,分聲調後為1295個(根據《現代漢語詞典》統計,輕聲39個未計)。以1萬個漢字計算,每個不帶調的音節平均超過24個漢字,每個帶調音節平均超過7.7個漢字。有的同音同調字多達66個。一字多音現象也很普遍。
參考資料來源:百度百科-編碼
Java的字元串都有什麼?字元串可以轉換為任意數值嗎?
Java字元串類包括String、StringBuffer、StringBuilder。字元串之間是可以更改數值的。比如使用Parseint(S)方法,該方法是靜態的,不會產生多餘的以int形式返回的對象,並且在底層查看源代碼時,如果輸入的字元串內容不是int類型,如果它是空的,並且輸入的內容超過int的極限,則會發現numberformatexception類型異常。
java字元串string的使用方法是什麼?
String類別是一個不可更改的字元串,所以說string類實際上可以被認為是只讀的一個字元串,但是即使如此,string類也提供了許多可用的方法,下面將詳細介紹這些方法。例如string()、string、string(byte[ ])、string(char[ ])等。上面列出的一些普通string類構造函數以及其他string類構造函數,例如從數組的初始位置開始。
字元串StringBuilder有什麼用處?
StringBuilder可以使用可變字元串操作,這將提高字元串性能。在StringBuilder類別中,也有一些類似的方法,如上面String類別中描述的indexof(char)。但是我們使用StringBuilder類,它主要用於在字元串中添加和刪除字元。其次,StringBuilder類主要稱為用於構建字元串的字元串,因為StringBuilder類用於提高性能,因為String類不會更改,實際上虛擬機在更改String類時在底層運行。
StringBuilder和StringBuffer有什麼區別?
StringBuilder和StringBuffer的功能沒有顯著區別,除了消除非線程安全問題,有效地降低了成本以外,在大多數情況下是首選的字元串連接選項。StringBuffer提供了一個類來解決平鋪頂部過多的中間對象的問題,我們可以使用Append或Add方法將字元串添加到現有序列的末尾或指定位置。
java字元串問題
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啥是字元型
字元型char 是存一個字元變數的類型,字元變數用’ ‘概括表示,中間填入任意一個字元(也叫符號),例如’a’ ‘b’ ‘c’ 之類。
多個字元可以拼接成一個字元串string,例如”hello world”。
以上兩個都是字元,是符號,僅顯示用,不能同數學一樣參與計算,字元可以剪切或者粘貼到一個字元串中,可以判斷是否一樣的邏輯。
在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數據類型
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248279.html