1. 在java中当定义char c='a',String s="abc"时,分别在内存中占多少字节
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确是对象类型。对象是一种很复杂的数据类型,你要看一个对象具体占多少字节,可以把这个对象序列化后存入一个文本文件来看它具体占用了多少字节,当然这也不是精确的,因为序列化需要写入少量系统信息,但大致是对的。
2. 在java语言中输入一个字符串:“abc”,怎样可以简单的使其输出“cba”
我写了一个更通用的方法,不限于3个字符的,任意长度的均可,权当交流:
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = input.next();
Reverse(str);
}
public static void Reverse(String str){
System.out.println("反转后的字符串为:");
for(int i = 0; i < str.length(); i++){
String temp = "";
temp = temp + str.charAt(str.length()-i-1);
System.out.print(temp);
}
3. 在java 中 String a=New String("abc") 与Strng b="a
前面那个是定义了一个String类对象a 并赋值为abc。此时的a是一个实例化对象
后面的b 是定义了一个String字符串变量 ,赋值abc 。顺便说一句 后面一句少了一个i
也可以这么理解:
String b= "abc"; 先在内存中找是不是有"abc" 这个对象,
如果有,就让b指向那个"abc".如果内存里没有"abc",就创建一个新的对象保存"abc".
String a=new String ("abc") 就是不管内存里是不是已经有"abc"这个对象,
都新建一个对象保存"abc"
4. java 字符串变量赋值例如 String a="abc"; String b; b=a; b="
Stringa="abc"滚瞎;//定义了一个"abc"字符串,a指向这个字符串
Stringb;
b=a;//使b也指向a现在指向的那个字符串("abc")
b者局="abcd";//定义了一个大嫌空"abcd"字符串,b指向这个新的字符串
在内存中大致的示意图如下:
所以最后 a =“abc”,b=“abcd”
java中字符串是一个较为特殊的存在,如果感兴趣可以找资料详细了解
Java中字符串内存位置浅析
触摸java常量池