javastring存儲
java中輸入的字元串主要是使用scanner類來接收用戶從鍵盤輸入的數值
㈡ Java:在Java中String是以Unicode保存的嗎
字元串在java內存中總是按unicode編碼存儲的。比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d 6587",如果charset為"gbk",則被編碼為"d6d0 cec4",然後返回位元組"d6 d0 ce c4".如果charset為"utf8"則最後是"e4 b8 ad e6 96 87".如果是"iso8859-1",則由於無法編碼,最後返回 "3f 3f"(兩個問號)。
java虛擬機採用UCS2(通用字元集)標準保存字元,所有的字元在內存中都是2個位元組,這樣虛擬機處理字元串的截取、長度和判斷都非常容易。其他語言如PHP、Python也是,在運行時採用固定長度存儲字元。
相對應編譯後的class,java規定採用UTF-8保存,因為大部分是英文字元,只有一個位元組,可以大量節省存儲空間。
㈢ java 中如何保存String的值
首先 你要把這些信息保存到哪裡?如果只是保存到一個txt文件中,非常簡單
import java.io.*;
import java.util.*;
import com.ufoo.portal.utils.IDMaker;
public class Information
{
private Properties setting;
private File file;
private String userName ="admin"; //默認屬性 用戶名和密碼
private String passwd="123456";
public Information()
{
setting = new Properties();
try
{
file = new File("D:\\sims_log\\","log.txt"); //創建文件log.txt 自己在D盤把sims_log 文件夾建好
if(!file.exists()) //若文件不存在
{
File parentDir=new File(file.getParent());
if(!parentDir.exists())
{
parentDir.mkdirs();
}
file.createNewFile(); //新建
}
setting.load(new FileInputStream(file)); //載入文件
}
catch(Exception e)
{
}
setInformation(userName,passwd); //調用存儲屬性方法
}
public void setInformation(String UserName,String passwd)
{
try{
setting.setProperty("user name", UserName); //存儲用戶名 每個屬性對應一個鍵 例如用戶名的鍵就是 user name
setting.setProperty("password", passwd); //存儲密碼
setting.store(new FileOutputStream(file), ""); //保存到文件 "log.txt"
}
catch(Exception e)
{
e.printStackTrace();
}
}
public String getInformation(String UserNameKey)
{
return setting.getProperty(UserNameKey); //獲得用戶名
}
public static void main(String args[])
{
Information info=new Information();
info.setInformation("123123","12345"); //設置用戶名和密碼
System.out.println("the user name is:"+info.getInformation("user name"));//這里user name是鍵名,列印出用戶名
info.setInformation("lisi","12345"); //設置用戶名和密碼
System.out.println("the user name is:"+info.getInformation("user name"));//這里user name是鍵名,列印出用戶名
}
}
㈣ Java中String字元串的存儲大小也就是容量是多少呢能存多少字元。
String str="abc...";這樣定義的字元串是存在字元串池中的
String str=new String("abc...")這樣定義的字元串是在堆內存中的,然後被棧內存的對象str引用
所以字元串是對象,是在內存中存儲的,不像基本數據類型有各自的長度,字元串應該是只要是內存不滿,是沒有長度限制的
㈤ Java有沒有安全的string存儲
有的,StringBuffer 就是線程安全的
㈥ java中String類型存儲位置
一、new String都是在堆上創建字元串對象。
當調用 intern() 方法時,
編譯器會將字元串添加到常量池中(stringTable維護),
並返回指向該常量的引用。
二、通過字面量賦值創建字元串(如:String str=」twm」)時,
會先在常量池中查找是否存在相同的字元串,若存在,
則將棧中的引用直接指向該字元串;若不存在,則在常量池中生成一個字元串,
再將棧中的引用指向該字元串。
三、常量字元串的「+」操作,
編譯階段直接會合成為一個字元串。
如string str=」JA」+」VA」,
在編譯階段會直接合並成語句String str=」JAVA」,
於是會去常量池中查找是否存在」JAVA」,從而進行創建或引用。
四、對於final欄位,編譯期直接進行了常量替換(而對於非final欄位則是在運行期進行賦值處理的)。
final String str1=」ja」;
final String str2=」va」;
String str3=str1+str2;
在編譯時,直接替換成了String str3=」ja」+」va」,根據第三條規則,
再次替換成String str3=」JAVA」
五、常量字元串和變數拼接時(如:String str3=baseStr + 「01」;)
會調用stringBuilder.append()在堆上創建新的對象。
六、JDK 1.7後,intern方法還是會先去查詢常量池中是否有已經存在,
如果存在,則返回常量池中的引用,這一點與之前沒有區別,
區別在於,如果在常量池找不到對應的字元串,則不會再將字元串拷貝到常量池,
而只是在常量池中生成一個對原字元串的引用。簡單的說,就是往常量池放的東西變了
原來在常量池中找不到時,復制一個副本放到常量池,1.7後則是將在堆上的地址引用復制到常量池。
舉例說明:
String str2 = new String(「str」)+new String(「01」);
str2.intern();
String str1 = 「str01」;
System.out.println(str2==str1);
在JDK 1.7下,當執行str2.intern();時,
因為常量池中沒有「str01」這個字元串,所以會在常量池中生成一個對堆中的「str01」的引用
(注意這里是引用 ,就是這個區別於JDK 1.6的地方。在JDK1.6下是生成原字元串的拷貝),
而在進行String str1 = 「str01」;字面量賦值的時候,常量池中已經存在一個引用,
所以直接返回了該引用,因此str1和str2都指向堆中的同一個字元串,返回true。
String str2 = new String(「str」)+new String(「01」);
String str1 = 「str01」;
str2.intern();
System.out.println(str2==str1);
將中間兩行調換位置以後,因為在進行字面量賦值(String str1 = 「str01″)的時候,
常量池中不存在,所以str1指向的常量池中的位置,而str2指向的是堆中的對象,
再進行intern方法時,對str1和str2已經沒有影響了,所以返回false。
㈦ java中String類型的數據分配多少位元組
Java中無論是漢字還是英文字母都是用Unicode編碼來表示的,一個Unicode碼是16位,每位元組是8位,所以一個Unicode碼占兩位元組。但是英文字母比較特殊,源自於8位(1位元組)的ASCII嗎,於是在Unicode碼僅使用了低8位(1位元組)就可以表示,高8位的話不使用也無所謂。所以
char
c='a';
System.out.println(c.getBytes().lenth()),得到的是1(位元組)
但漢字就完整地使用了16位(2位元組)的Unicode,所以
char
c='中';
System.out.println(c.getBytes().lenth()),得到的是2(位元組)
綜上,c='a'在內存中確實只佔1位元組,但這不意味著String
s="abc"在內存中只佔3位元組。應該這么說,String
s="abc"至少在內存中佔3位元組。這是因為char是基本數據類型,而String確是對象類型。
㈧ java的String存儲中文的時候 存的是什麼,是按照什麼編碼方式存儲的
String在內存中是以UCS-2編碼或者叫UTF-16的早期版本存儲。
當寫入文件可以用其他指定的編碼,比如GB2312,GBK,BIG5等。
㈨ java中的String常量是存放在棧中還是堆中
系統內存一般情況來說分為四個
heap 堆 放 對象 也就是new 出來的東西
stack 棧 放局部變數
static segment 靜態區 用來放 靜態變數 和字元串常量
data segement 代碼區 用來放代碼的
如果 一個字元串是 String s = "abc";它放在棧里
如果一個字元串 用創建對象的方式 String s = new String("abc");
那它是放在了 堆里 而如果單純的 一個 "abc" 這個輸入字元串常量 是放在static segement里