Java中String str_1="abc"; 和 String str_2=new String("def"); 的区别是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中String str_1="abc"; 和 String str_2=new String("def"); 的区别是啥?相关的知识,希望对你有一定的参考价值。

一直都未搞得清这两种定义的区别..希望能有详细说明,深入解析..
在内存中是怎样存放的?堆栈中存放方式两者区别是什么?
在内存中的分配是怎样的?两者有什么不同?

你给出的两个字符串对象体现不这两种定义的区别,当然也是有区别的。

如果是:String str_1="abc"; String str_2=new String("abc");就明显了。

---------------------------------------------
先说几个概念吧

1.常量池

指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,也包括字符串常量。

2.==: 比较是否是同一个对象

3.equals(): 比较的是对象里的内容

---------------------------------------------
下面我开始说区别

第1种:

String a="abc";
String b="abc";
System.out.print(a==b);

结果:true

原因:编译时,这两个"abc"被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。

---------------------
第2种:

String a=new String("abc");
String b=new String("abc");
System.out.print(a==b);

结果:false

原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。

------------------------------
第3种

String a="abc";
String b=new String("abc");
System.out.print(a==b);

结果:false

原因:同上

---------------------------
第4种

String a="abcdef";
System.out.print(a=="abcdef");

结果:true

原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象。

-------------------------------------------
第5种

String a="abcdef";
String b="";
String c=a+b;
System.out.print(c=="abcdef");

结果:false

原因:编译时,先将"abcedf"放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。

---------------------------------------------------------------------
其它太明显的区别不在赘述。
参考技术A 没什么区别,用起来是一样的~只是声明方式不同就想数组可以这样声明:
var a=[];
也可以这样声明:
var a=array();
对象也是:可以直接var a=;也可以var a=Object;
使用起来都是一样的,但是在内错分配上不同,前者更节省内存(但是如果少量的声明,你根本不会感觉出来内存有省很多~所以这点可以忽略~)
参考技术B String str_1="abc"; 的意思是:定义一个str 把字符串 abc赋于它 ,这个很好理解..
new String("def"); 好理解 新建 -赋值,然后 str2是新建的类的别名,别名知道撒?
参考技术C "abc"本身就是一个字符串,str_1是指向该字符串的引用;
同样的,"def"也是一个字符串,而str_2却不是指向它的引用,实质上
new String("def")却是再new了一个字符串"def",也就是说这实质上存在内容一样的两个字符串,str_2是指向第二个新建出来的那个。这些区别你完全可以看api或直接原码就能明白。
参考技术D String str_1="abc"定义一个字符串 str_1="abc";
String str_2=new String("def"); 是有参参数传递

java中替换String中的最后一个字符

比如String a="StringGo"
有个数组是String b="a","b","o",.....;
取得a中的最后一个字符跟b数组中比较后如果b中包含a中的最后一个字符,就给替换。

替换最后一个字符实现方式有两种:
1:使用replace替换方法
String str="hello world";

str=str.replace(str.charAt(str.length-1)+"","新字符");

2:编写代码替换
String str="hello world";

char[] items=str.toCharArray();

itms[items.length-1]=\'新字符\';
参考技术A 不知你要的是不是这个答案?
public class TestString
public static void main(String[] args)
String a = "StringGo";
String[] b = "a","b","o";

//得到字符串中最后一个字符
//注意最好在接受的时候用char类型的包装类Character
Character lastChar = a.charAt(a.length() - 1);

for (int i = 0; i < b.length; i++)
if (lastChar.toString().equals(b[i]))
b[i] = "替换";



for (int i = 0; i < b.length; i++)
System.out.println(b[i]);


本回答被提问者采纳
参考技术B java中字符串的方法都可以可以使用正则匹配查找

String a="StringGO";
String b="a","b","c";
String reg = “”;
for(int i=0;i<b.lengh;i++)
reg+="["+b[i]+"]+|";

reg = reg.subString(reg.length-1);
a.lastIndex(reg,替换字符);
参考技术C 你想怎么换? 参考技术D 谁替换谁?

以上是关于Java中String str_1="abc"; 和 String str_2=new String("def"); 的区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java中String直接赋字符串和new String的区别 如String str=new String("a")和String str = "a"有什么区

java中替换String中的最后一个字符

c++中string str;str.Format(_T("%d"),num)"%d"是啥意思啊??

Java中String是啥意思?

java中的字符串比较方法

java String类 开辟内存问题