String在java内存
1. java String类 开辟内存问题
首先你要知道String是怎么分配内存的,如果使用字符串直接赋值,比如str="abc",那么它会先去常量区找,如果常量区已经有abc,那就直接把str指向abc,如果没有,它就在常量区再分配一个abc。使用new String("abc")的话,不管常量区有没有,它都会在堆里分配一个新的"abc"。
现在回答你的问题。
第一个问题,JAVA的常量字符串+,编译器会自动优化,str3="ab"+"c",经过编译器优化后,实际上等于str3="abc",而常量区已经有一个str分配的"abc",因此str3直接指向str指向的"abc",因此str==str3。
subString(0,2)返回的也是一个string,它的分配也符合上述的规则,subString(0,2)返回"ab",ab在常量区没有对应的值,因此它会另外开辟内存,所以str2 != str。
第二个问题,subString的工作方式是,如果截取的是整个字符串,那它不会新new一个返回,而是直接返回原字符串。因此str.substring(0,3)实际上返回的就是str,所以它们是相等的。str.substring(0,1)截取的是第一个字符"a",这时候返回的也不是你想象的常量区的字符,而是一个新new出来的地址。
我们可以试试:
String str = "abc";
String str2 = "a";
System.out.println(str.substring(0,1) == str2);
System.out.println(str.substring(0,1).equals(str2));
第一个输出false,第二个输出true。因为虽然前面str2初始化后常量区已经有一个"a",但subString截取的字串是新new出来的,不是直接指向常量区的"a“的。
2. Java String s="hello" 在内存中是什么状态
字符串是一种特殊的对象它不储存在堆栈里 而是存在字符串常量池里 就算字符串失去了所有的引用也不会被垃圾处理器处理掉 所有的字符串都是唯一的对象
引用s当然是在栈里了
3. 求java中String在内存中的分配情况详解
Java中的String对象是不可变的。String类中每个看起来会修改String值的方法,实际上都是创建了一个全新的String对象。
Java中一般不能重载操作符,但是String类“+”和 “+=”操作符是Java中唯一重载的两个操作符。这两个操作符都是编译器默认引入了java.lang.StringBuilder类,最后都调用了toString方法生成String对象的。
常量字符串是分配在虚拟机的方法区的常量池中,也可以通过String.Intern将String添加到常量池中,String.valueOf方法会先检索常量池中字符串,没有的话才会去在堆中new一个,使用new 操作符生成的字符串对象,跟一般的对象生成一样,是在虚拟机的堆中分配内存的。
4. Java中String 和Stringbuffer内存里面的操作区别。
String str1 = "123";
可以这其实是java jdk1.5以后的语法糖,及自动拆装箱功能。
你把jdk换成1.5以前就不可以使用
String str1 = "123";
了
5. String类型在Java中对象的比较的内存中的运行情况
==是Object (所有类的父类)的equals方法
而String 的equsls方法为父类方法的重写 所以他们不比较对象本身 而是比较对象指向的字符串
6. java中一个String常量和一个new 出来的String对象追加的时候,在内存中是怎么存储的
String a = "women"; "women"表示String类的对象,是堆内存里的,把"women"地址值赋给了a
String b = "wo"+"men"; java 程序中有常量优化机制,最后"women"地址值给了b;
String c = "wo"+new String ("men");表示两个地址值不一样的对象相加,其实底层是用StringBuffer的append()方法操作的;会创建新的对象;以前的变成了垃圾,结果为“women”;
7. JAVA里String数组在内存分配中分配的空间每个占几个字节
java中一个int占4个字节,由于java是unicode编码,一个char可以占两个字节,可以存储一个汉字。一个String,要看有几个字母或者几个汉字,一个英文字母就是一个字节,一个汉字就是两个字节,以此类推计算。
8. java String 内存地址问题如何获取 String 内存地址!
hashCode()返回的是JVM中地址的哈希码,而不是JVM中的地址,要想得到str在物理内存中的真实地存,那只有用JNI技术调用c/c++去实现,否则无能为力,因为java超不出JVM,而JVM对物理内存地址是“不可见”的,否则java中不就有了指针,而去直接操作内存了,当然这是与java语言相违背的。这些只是我个人见解,说不定还真有高手直接用java语言得到了物理内存中的地址了呢。