string

问题描述

stringa="h"stringb=a+"g"stringc="h"+"g"system.out.println(b==c)为什么为false???

解决方案

解决方案二:
希望能解释一下底层的东西?
解决方案三:
字符串相等需要引用.equals(),==代表的是他们的引用地址。所以为false,当然,当你需要引用.equals()需要对它重新定义。
解决方案四:
最主要是stringb=a+"g"这里要在运行期才知道变量a是什么鸟,那个时候才能生成字符串,新生成的字符串和系统已有的字符串怎么可能==如果你的不是stringa="h"而是finalStringa="h"那么便已经就知道a是什么鸟,便一起就已经是和c一样的字符串,指向地址也一模一样system.out.println(b==c)又岂会是false?
解决方案五:
引用楼主ttxshangxiaojun的回复:

stringa="h"stringb=a+"g"stringc="h"+"g"system.out.println(b==c)为什么为false???

因为b和c是完全不同的两个对像,所以是false比较字符串的内容应该用b.equals(c)来比较。
解决方案六:
b,c是两个不同的对象,主要是因为编译的优化处理:Stringa="h"Stringb=a+"g"//编译器会优化成:Stringb=newStringBuilder(a).append("g").toString();,对象在堆中。Stringc="h"+"g"//编译器会优化成:Stringc="hg";,对象在常量池中System.out.println(b==c)//结果为false//如果对上面的例子还不能理解,看看下面的finalStringa="h"Stringb=a+"g"//编译器会优化成:Stringb="hg";,对象在常量池中Stringc="h"+"g"//编译器会优化成:Stringc="hg";,对象在常量池中System.out.println(b==c)//结果为true

从上面的例子,我们可以看到编译器对字符串“+”操作的优化处理,如下:1.如果都是常量直接合并放在常量池中;2.如果其中一个变量不是常量,则使用StringBuilder来进行拼接处理,由于对象是在运行时创建的,对象会在堆中分配内存;
解决方案七:
比较经典的面试题呀,哦也一直迷糊中,。。。。。
解决方案八:
引用6楼tengcong5210的回复:

比较经典的面试题呀,哦也一直迷糊中,。。。。。

用C语言的方式来理解,==比的是指针指向地址是不是一样,equals比较的是地址中内容是不是一样java讲的是对像引用。。。当作对像指针来理解好了。
解决方案九:
接分求结贴楼上各位已经回答你想的了
解决方案十:
在Java中,String类是引用类型的,而“==”判断两个对象是不是同一个对象,在这里自然不是,因为b和c这两引用指向不同的对象。如果要求两引用指向的内容是不是一样的,就得用equals()
解决方案十一:
引用7楼skgary的回复:

Quote: 引用6楼tengcong5210的回复:
比较经典的面试题呀,哦也一直迷糊中,。。。。。

用C语言的方式来理解,==比的是指针指向地址是不是一样,equals比较的是地址中内容是不是一样java讲的是对像引用。。。当作对像指针来理解好了。

关于equals和==区别可以理解,就上面那个问题的本质是创建了几个String对象,这个比较费解。
解决方案十二:
引用10楼tengcong5210的回复:

Quote: 引用7楼skgary的回复:
Quote: 引用6楼tengcong5210的回复:
比较经典的面试题呀,哦也一直迷糊中,。。。。。

用C语言的方式来理解,==比的是指针指向地址是不是一样,equals比较的是地址中内容是不是一样java讲的是对像引用。。。当作对像指针来理解好了。

关于equals和==区别可以理解,就上面那个问题的本质是创建了几个String对象,这个比较费解。

其实在真的工作中,创建了几个String对像根本不重要。重要的是搞清了==和equals的区别。编译的优化部分,你看一下5楼说的好了。
解决方案十三:
Stringb=a+"g";//b由对象和“g”,此时b在堆中Stringc="h"+"g";//c是由常量池中的“h”和“g”组成

解决方案十四:
b和c不是同一个引用,所以不是==二者应该互相equals
解决方案十五:
lz可以看下:顺便我也复习下:1.首先在Stringa="h",在常量池中创建一个对象,值为h。2.stringb=a+"g",由于a没有final和static修饰,所以,没有在编译的时候对b进行处理,属于动态绑定,不是静态。此时没有创建任何对象(在运行时创建),到时候b再得到一个引用,引用的对象值为a+"g",也就是hg。3.stringc="h"+"g",这句在常量池创建了2个对象,一个是值为g的对象,一个是值为hg的对象,因为常量池有了h,所以不是再创建值为h的对象,又因为值为h的对象属于静态绑定,所以这句也属于静态绑定。此时c返回一个引用,指向的是常量池中的对象hg总结:为什么system.out.println(b==c)为false,因为一个是指向常量池的hg,一个是动态编译时再生成的引用。不同,所以为false。
解决方案:
引用14楼u014077165的回复:

lz可以看下:顺便我也复习下:1.首先在Stringa="h",在常量池中创建一个对象,值为h。2.stringb=a+"g",由于a没有final和static修饰,所以,没有在编译的时候对b进行处理,属于动态绑定,不是静态。此时没有创建任何对象(在运行时创建),到时候b再得到一个引用,引用的对象值为a+"g",也就是hg。3.stringc="h"+"g",这句在常量池创建了2个对象,一个是值为g的对象,一个是值为hg的对象,因为常量池有了h,所以不是再创建值为h的对象,又因为值为h的对象属于静态绑定,所以这句也属于静态绑定。此时c返回一个引用,指向的是常量池中的对象hg总结:为什么system.out.println(b==c)为false,因为一个是指向常量池的hg,一个是动态编译时再生成的引用。不同,所以为false。

这个回答是我看过的最明白的一个了。。。
解决方案:
如果不是用new出来的String,如果出现相同的String,会放到池中,对象+String会创建一个新的String对象。并放到池中,下一次再取一样的是从池中取,2个对象不是一个对象。一个是新建的,一个是池中的
解决方案:
比较实际内容用equals
解决方案:
b与c的引用地址不一样;所以“false”equals比较的是b与c的地址中内容是否一样。结果为“true”
解决方案:
引用5楼gaofuqi的回复:

b,c是两个不同的对象,主要是因为编译的优化处理:Stringa="h"Stringb=a+"g"//编译器会优化成:Stringb=newStringBuilder(a).append("g").toString();,对象在堆中。Stringc="h"+"g"//编译器会优化成:Stringc="hg";,对象在常量池中System.out.println(b==c)//结果为false//如果对上面的例子还不能理解,看看下面的finalStringa="h"Stringb=a+"g"//编译器会优化成:Stringb="hg";,对象在常量池中Stringc="h"+"g"//编译器会优化成:Stringc="hg";,对象在常量池中System.out.println(b==c)//结果为true

从上面的例子,我们可以看到编译器对字符串“+”操作的优化处理,如下:1.如果都是常量直接合并放在常量池中;2.如果其中一个变量不是常量,则使用StringBuilder来进行拼接处理,由于对象是在运行时创建的,对象会在堆中分配内存;

这个最详细最明白,楼主可以结贴了。
解决方案:
直接给链接有哪位大神发现错误,私信或引用我来告诉我,谢谢。
解决方案:
字符串b、c对象的地址不同,存放在不同的内存空间上,所以b!=c比较内容相同的话可以用equals新手一枚,看视频的时候学到这个的。。。答错了的话不要见怪
解决方案:
LZ要去看==与equals的区别了,一个是比较应用地址,一个是比较值的
解决方案:
该回复于2014-09-22 08:45:04被版主删除

时间: 2024-09-21 17:46:02

string的相关文章

c++ string类的, 后的空字符无法消除

问题描述 c++ string类的, 后的空字符无法消除 #include #include #include using namespace std;bool R1(string s);int main(){ string s1; while(getline(cins1)&&s1 !=""q"") { if(R1(s1)) cout<<s1<<""是回文.n""; else cout&

代码分析-leetcode:Scramble String问题

问题描述 leetcode:Scramble String问题 题目:Given a string s1 we may represent it as a binary tree by partitioning it to two non-empty substrings recursively. Below is one possible representation of s1 = ""great"": great / gr eat / / g r e at /

xml-携程api接口请求成功返回的String数据怎样拿来使用

问题描述 携程api接口请求成功返回的String数据怎样拿来使用 携程官网提供的java方法,配置好后,请求成功,返回的是xml形式的一串String类型的字符串,怎么才能拿来使用? 解决方案 用xml解析库,或者反序列化成对象后就可以用了. 解决方案二: 用xml解析库,或者反序列化成对象后就可以用了. 解决方案三: google java xml解析.http://bbs.csdn.net/topics/290027113 http://developer.51cto.com/art/20

String类常用方法之charAt()、codePointAt()示例

1.chatAt()--提取指定字符串 2.codePointAt()--提取索引字符代码点   Java代码 /**    * 作者:阳光的味道    * 功能:   String类常用方法之charAt().codePointAt()    * 日期:2010/11/07    * */   public class StringDemo {        public static void main(String[] args) {            String str1 = "a

android中String转换成16进制的方法

问题描述 android中String转换成16进制的方法 想请教一下?把一个24个字节的字符串转换成16进制,并把结果打印出来要怎么写,网上有一些方法但是没有说转换完的16进制串打印出来要用哪个参数?求指点 解决方案 byte[] b = ""字符串"".getBytes();foreach (byte i : b){if (i < 16) System.out.print(""0"" + Integer.toHexS

算法:HDU 4681 String (dp, LCS | 多校8)

题意 给出3个字符串A,B,C,要你找一个字符串D, 要满足下面规定 a) D是A的子序列 b) D是B 的子序列 c) C是D的子串 求D的最大长度 要注意子序列和子串的区别,子序列是不连续的,字串是连 续的 思路 由题目可知,C一定是A和B的子序列,那么先假设C在A和B中只有一个子序列,看下 面例子: abcdefdeg acebdfgh cf 可以看到"cf"在A串的[3, 6]区间 内, 在B串的[2,6]区间(黄色背景) 因为所求的C是D的子串,所以在该黄色区间内的其他字母一

关于string和char的程序,求解~?为什么运行不通过

问题描述 关于string和char的程序,求解~?为什么运行不通过 #include #include #include using namespace std; const int MAXSIZE = 100; typedef struct { string address;///?? int x; string next;///???? }info; typedef struct { info data[MAXSIZE]; int length; }SeqList,*pSeqList; p

c++-C++ string类 标准库 字符串

问题描述 C++ string类 标准库 字符串 C++标准库提供了一个功能强大的String类来实现字符串的操作,本系统创建一个功能类似"String类"的小型字符串类,以实现类似的字符处理功能求大神帮解决用C++ 解决方案 http://zhidao.baidu.com/link?url=75L1-WX-G-cxzSWytaJDkPNRF23cR08MvvIGyUSSG5ykmN9bh-A-0IFWPGBMKoMYkPJ0luXNApuvYXYT0TJQKa 解决方案二: <

[Java] Switch能否用string做参数?

版权声明:请尊重个人劳动成果,转载注明出处,谢谢! 1 . 在jdk 7 之前,switch 只能支持 byte.short.char.int 这几个基本数据类型和其对应的封装类型.switch后面的括号里面只能放int类型的值,但由于byte,short,char类型,它们会 自动 转换为int类型(精精度小的向大的转化),所以它们也支持. 对于精度比int大的类型,long.float.double,不会自动转换成int.要想使用就得加强转如(int)long. 另外boolean类型不参与

Dojo学习笔记 4. dojo.string &amp;amp; dojo.lang

模块:dojo.string.common / dojo.string dojo.string.common 和 dojo.string 是一样的,只要require其中一个就可以使用以下方法 dojo.string.trim 去掉字符串的空白 Usage Example: s = " abc ";dojo.string.trim(s); //will return "abc"dojo.string.trim(s, 0); //will return "a