0204 字符串相加

Posted cxllxc

tags:

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

字符串的+操作

​ 当+操作中出现字符串时,这个+就是字符串连接符,而不是算术运算符了,会将前后的数据进行拼接,并产生新的字符串。

连续加时

​ 连续进行+操作时,从左到右逐个执行,只要在前面出现过字符串的+操作,后面即使出现数字相加也会视为字符串相加

System.out.println("abc" + true);//"abctrue"

System.out.ptintln(1 + 99 + "路星辰");//100路星辰

只要在前面出现过字符串的+操作,后面即使出现数字相加也会视为字符串相加

System.out.println(1 + 2 + "plus" + 3 + 4);//3plus34

注意字符串和变量的区别

int age = 19;
System.out.println("我的年龄是" + age + "岁");//我的年龄是19岁
System.out.println("我的年龄是" + "age" + "岁");//我的年龄是age岁

字符的+操作

当字符进行计算时,会将其转换为ASCII表之后再进行计算

​ 当字符与数字进行+操作时,会比对ASCII表进行转换然后计算;与字符串进行+操作时,则会进行拼接操作

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的值不同罢了!

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

java中的字符串相加

c语言把数字字符串中的数字相加的程序

java编写将一串字符串中的奇数位提出来相加并且偶数位每个数相加

字符串经典题之大数相加

Java jdk对字符串相加的优化

415. 字符串相加(Python)