java-Java中string类型在内存机制的存储问题

问题描述

Java中string类型在内存机制的存储问题
package chapter3;

public class RefAndAdd {
public static void main(String[] args) {
String str = ""abc"";
String str1 = ""ab"";
String str2 = str1 + ""c"";
String str3 = ""a"" + ""b"" + ""c"";
System.out.println(str == str2);
System.out.println(str == str3);
System.out.println(str2 == str3);
}
}

为什么输出结果是falsetruefalse

解决方案

有几个点:
1、字符串常量(""abc"")会存在常量池中;
2、编译的时候会优化代码,其中就有将""a"" + ""b"" + ""c""优化成“abc”,然后放在常量池中
3、str1+""c""是在运行期决定的,所有相当于一个新的“abc”而这个“abc”是堆内存中
4、引用对象进行比较时使用equals,不能使用==,==只是单纯的比较值(对于引用对象而言,就会比较它的引用值---相当于一个地址)

解决方案二:
str1 + ""c""相当于调用了一个new产生了新的实例,我们知道一旦调用了new 不论String内容是否相同,在堆空间中都会开辟新的空间。
a"" + ""b"" + ""c"" 这种形式没有调用new,此时字符串常量(""abc"")存在常量池中,当String内容相同时,在堆空间中不会开辟新的空间。

解决方案三:
str1 + ""c""相当于调用了一个new产生了新的实例,我们知道一旦调用了new 不论String内容是否相同,在堆空间中都会开辟新的空间。
a"" + ""b"" + ""c"" 这种形式没有调用new,此时字符串常量(""abc"")存在常量池中,当String内容相同时,在堆空间中不会开辟新的空间。

解决方案四:
Java String的内存机制

解决方案五:
String类型的变量比较时不能用 ==号 需要调用equals函数来完成 比如 “ABC”.equals(a)

解决方案六:
str与str3指向同一引用“abc”,所以相等,但是str2与str、str3指向不同引用,其指向“ab”,所以不等。
用==比较是比较双方的对象,而用equals函数则是比较双方的引用。
可以参考:http://blog.csdn.net/zw_2011/article/details/6431448

时间: 2024-10-07 13:20:49

java-Java中string类型在内存机制的存储问题的相关文章

简单谈谈Java中String类型的参数传递问题_java

提要:本文从实现原理的角度上阐述和剖析了:在Java语言中,以 String 作为类型的变量在作为方法参数时所表现出的"非对象"的特性. 一.最开始的示例 写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了.所以,在本文中首先以一个简单示例来抛出核心话题: public class StringAsParamOfMethodDemo { public static void main(String[] args) { StringAsParamOfMethodDem

string-关于java中String类型参数传递的问题,谁能给我讲清楚

问题描述 关于java中String类型参数传递的问题,谁能给我讲清楚 我知道java里面参数传递是值传递,这点不用给我解释了.但是: import java.util.*; public class Test { public static void change(String s){ s="2"; } public static void main(String[] args) throws Exception{ String s="1"; change(s);

string-关于java中String类型汉字字符串的升序问题

问题描述 关于java中String类型汉字字符串的升序问题 本人新手,遇到一个项目问题:有若干个对象,每个对象里面都有一个String类型的姓名属性,现在要求根据姓名属性的升序将这些对象排列在List集合里,问如何将String类型的汉字升序排列.求大神 解决方案 String[] strs = {""张三(Z)""李四(L)""王五(W)""}; // 定义一个中文排序器 Comparator c = Collator.g

Java中String类型能转成int类型吗

问题描述 Java中String类型能转成int类型吗 一个String字符串 能否像 char类型一样 转换成int值 如果可以Java中怎么写 解决方案 看你用什么预言,各种预言都有转换函数,只要符合数值型,就可以正常转换 解决方案二: double?d?=?1.233; String?s1?=?String.valueOf(d); String?s2?=?s1.substring(0,?s1.indexOf("."))?+?s1.substring(s1.indexOf(&quo

string-java中String类型的字符串的处理问题

问题描述 java中String类型的字符串的处理问题 String str="/mnt/sdcard/hehe.exe,/mnt/sdcard/GG.exe,/mnt/sdcard/oo.exe,/mnt/sdcard/aa.exe,/mnt/sdcard/qq.exe"; 有这么个字符串,我想取出字符串中的5个路径怎么取,意思就是: String hehe="/mnt/sdcard/hehe.exe"; String GG="/mnt/sdcard/G

c++中string类型的iterator到size_t类型如何转换

问题描述 c++中string类型的iterator到size_t类型如何转换 如题,string类型提供很多如substr等函数是以size_t类型为参数的,但是使用迭代器又很方便,所以有没有什么办法可以在两者之间互相转换,或者方便的一起使用? 解决方案 这个不能,可以用JAVA,用PYTHON,用C ... 啦啦啦 解决方案二: 没办法,这个不能直接转换,类型不一样. 解决方案三: size_t类型size_t类型的用途size_t 是什么类型? 解决方案四: 直接转不可能的,可以设置一个i

二进制-怎样读写C++中string类型的数据

问题描述 怎样读写C++中string类型的数据 问题是,怎样将C++中string类型的数据写入文件,并正确读出 我使用write函数,string类型的数据写入文件(二进制格式),但使用read缺读不出来,问题何在 解决方案 用char *读t和写,有需要再转string 解决方案二: string转化成char * 用c_str()函数 解决方案三: 直接用fstream流操作. 解决方案四: http://blog.csdn.net/hong__fang/article/details/

java中string 类型的对象间比较的学习笔记

在JAVA 中String 有两种不同的赋值方式 ,"="和new一个新的对象,虽然在输出时显示的内容是一样的,但数据存储的原理是不同的. String a="ab"; String b="ab"; System.out.println(a==b);//true 三句话的执行时这样的:        当把"ab"赋值给a变量时,因为是用"="直接赋值,此时"ab"作为字面量存在栈中,然后

Java编程中将String类型转为Date类型实例

最近在开发Json数据反序列化为Java对象的时候发现spring mvc 和 Jackson 对Date类型对支持不是特别好,虽然在Java对象序列化为Json数据的过程中提供了便利的注解,但是反序列化却没有,于是就引出了下面的问题,我需要手工的将字符串转换为Date类型的数据,java.text.SimpleDateFormat 为我们提供了这种转换的基础设施.如下列出了的格式化模式的简单定义,如果 'M' 大于等于3位, 月份会显示为字母,否则是数字. 更详细的定义请参考 java.tex