java中的字符串相加

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的字符串相加相关的知识,希望对你有一定的参考价值。

下面是一段代码以及运行结果:请对结果给予解释
public class StringAndStringBuffer


public static void main(String [] args)

/*
String s1 = "a";
String s2 = "b";
String s3 = "ab";
System.out.println(s3 == s1 + s2);
System.out.println(s3 == "a" + "b");
*/
/*============================RESULT==============================
--------------------Configuration: <Default>--------------------
false
true

Process completed.

=================================================================*/
String s1 = "a";
String s2 = "b";
String s3 = "ab";
String s4 = s1 + s2;
String s5 = "a" + "b";
String s6 = s1 + "b";
StringBuffer s7 = new StringBuffer("abc");
String s8 = s7.substring(3);
System.out.println(s3 == s4);
System.out.println(s3 == s5);
System.out.println(s3 == s6);
System.out.println(s4 == s6);
System.out.println(s4 == s8);
/*=========================Result===============================
--------------------Configuration: <Default>--------------------
false
true
false
false

Process completed.
*/

首先你要搞清楚的是字符串用==比较,是比较两个字符串是不是指向同一个对象。
程序在运行的时候会创建一个字符串缓冲池,程序会把字符串常量(如程序中的"a","b","ab","a"+"b")放入字符串缓冲池中(这里"ab","a"+"b"是一个对象)。当使用
String s3 = "ab";
String s4 = s1 + s2;
String s5 = "a" + "b";
这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,s3先被放到了池中,所以在s5被创建的时候,程序找到了具有相同值的 s3,将s5引用s3所引用的对象"ab"。所以比较s5==s3由于两个是指向同一个对象,所以为true。
但是在这些赋值中,涉及到变量运算,所以得到的字符串对象存储在各自的内存中,不是缓冲池中的s3对象,如
String s4 = s1 + s2;
String s6 = s1 + "b";
所以 尽管s4,s6的值均为"ab",但是 s4==s3,s6==s3返回的结果均为false;
同时s4,s6也不是指向相同的对象,因为他们在不同内存中。
StringBuffer s7 = new StringBuffer("abc");
String s8 = s7.substring(3); //这个方法是从第3个字符取字符串,得到的s8为"'; 为空字符串。
所以s8==s3的结果也为false;

如果相比较两个字符串的值是不是相等,最好用.equals()方法。追问

我还有一个问题就是关于java中中文输入的问题,我也查找了好多的资料,试验了好多次,都没有成功。可以给我的发一个程序实例吗?就要一个简单的中文字符输入,然后将其输出

参考技术A ==比较的是变量本身的值,如果是对象,那么变量里存储的是对象的引用。
所以,如果int a=1,那么用a==1判断会是true,因为a的值就是1。
但是如果 String s = new String("aaa"); s=="aaa"判断就是false。
这里有一个需要注意的是,"aaa"到底是个什么东西?
首先,它也是一个对象,只不过是编译器替你创建的,那么用==比较的时候,实际上是在比较对象的引用。而s的引用显然和"aaa"的引用不同,因为是两个不同的对象。
还要注意一点:如果String s = "aaa",那么s实际指向的就是"aaa",也就是s的值(对象的引用)和对象"aaa"的值相同,都是同一个引用,这种写法相当于:
String x = new String();
x.setValue(“aaa”);//只有编译器可以这么做
String s = x;
另外还有+操作符,如果是"aaa"+"bbb"这种情况,编译器会直接创建对象“aaabbb”。
而如果包含自己定义的String对象,则不会出现上边那种整合,而是在运行时创建一个新的对象。这时,引用就是新的了。
参考技术B == 比较对象的引用是否相同,引用就是对象地址
equals是对象的方法,基本上实现来比较对象自己的内容
说多了也没用,看程序
String s1 = "a";
String s2 = "b";
String s3 = "ab";
String s4 = s1 + s2;
String s5 = "a" + "b";
String s6 = s1 + "b";
StringBuffer s7 = new StringBuffer("abc");
String s8 = s7.substring(0,2);
System.out.println(s3 == s4);//F
System.out.println(s3.equals(s4));//T
System.out.println(s3 == s5);//T
System.out.println(s3.equals(s5));//T
System.out.println(s3 == s6);//F
System.out.println(s3.equals(s6));//T
System.out.println(s4 == s6);//F
System.out.println(s4.equals(s6));//T
System.out.println(s4 == s8);//F
System.out.println(s4.equals(s8));//T
/*=========================Result===============================
--------------------Configuration: <Default>--------------------
false
true
true
true
false
true
false
true
false
true

Process completed.
*/
参考技术C ab 是常量字符串 "a"+"b"也是,所以是一样的,其他的都是不同的字符串对象 参考技术D 只是ascii的值不同罢了!

java 中的 String 相加

String 变量和 常量字符串相加

String str1 = "ab";
String str2 = "abc";
String str3 = str1+"c";
System.out.println(str3 == str2);

输出:

false

str1 与 "c" 进行字符串连接时,底层是通过StringBuffer 进行 append,生成一个StringBuffer对象,然后通过toString()方法,将StringBuffer对象转为String,此时会产生一个新的堆内存地址,str3指向这个新的内存地址。

以上是关于java中的字符串相加的主要内容,如果未能解决你的问题,请参考以下文章

java 提出字符串中的数字并相加

字符串相加

字符串相加

字符串大数相加,转换,去除前导0,字符串数值比较函数模板

java中的字符串相加

C语言关于利用sscanf实现字符串相加减