永发信息网

java中的字符串相加

答案:5  悬赏:0  手机版
解决时间 2021-12-25 09:48
下面是一段代码以及运行结果:请对结果给予解释
public class StringAndStringBuffer
{

public static void main(String [] args)
{


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);

}
}
最佳答案
首先你要搞清楚的是字符串用==比较,是比较两个字符串是不是指向同一个对象。
程序在运行的时候会创建一个字符串缓冲池,程序会把字符串常量(如程序中的"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()方法。
全部回答
ab 是常量字符串 "a"+"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
==比较的是变量本身的值,如果是对象,那么变量里存储的是对象的引用。 所以,如果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对象,则不会出现上边那种整合,而是在运行时创建一个新的对象。这时,引用就是新的了。
import java.util.scanner; public class test { public static void main(string[] args) { scanner scanner = new scanner(system.in); string line = scanner.nextline(); int result = 0; for (int i = 0; i < line.length(); i++) { if (character.isdigit(line.charat(i))) { result = result + integer.parseint(line.charat(i) + ""); } } system.out.print(result); } } 例:输入:123 输出:6 兼容字符串中存在字母的情况: 输入:12ab3 输出:6
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
魏国统一全国了吗?
哈尔滨四维彩超哪家好?哪看的清楚 有照片啥
女人结婚十八年了,有个十七岁儿子离婚她会后
如果男朋友刚开始叫你妞,后来叫媳妇儿,老婆
自私自利的反义词是什么?
怎样把自行车弄烂
一条公路,第一天修全长的25%,第二天修全长
和钱咖一样的赚钱应用
请问我用手机下载了一个看图猜成语软件后,一
看图知成语太子少师28关请君入瓮猜对了怎么过
奇怪啊啊10月14日也就是今天洛克王国登陆不了
我和老公是小学同学,小时候对他也没感觉,我
为什么大家都叫“古埃及”、“古印度”、“古
路字和风车打一成语
10月9日是什么星座
推荐资讯
信用卡逾期,银行让一次性还款,不还款就起诉
水熙多肽玻尿酸原液安全吗
广水市随州武胜关镇卫生院预防接种门诊地址在
单选题黄宗羲提出:“古者以天下为主,君为客
八年级上册数学课本13单元答案
淘宝店能修改类目吗?
如何更换插座面板
人事具体做些什么工作
我玩gta5进游戏会卡 切出桌面刷新一下然后再
在同程网订的票如何查询
梦见死羊是什么意思
下面的图形都是由6个大小一样的正方形拼接而
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?