a bit of java (from forum)
来源:互联网 发布:js能让窗口最大化吗 编辑:程序博客网 时间:2024/05/04 17:35
1.String a = "abc" 和String a = new String("abc")不同
测试代码如下:
String a = "abc";
String b = "abc";
System.out.println(a == b);
输出:true
==========================
String a = new String("ade");
String b = new String("ade");
System.out.println(a == b);
输出:false
请问:String a = "abc" 和String a = new String("abc")有什么不同?
String a = "abc"
当表达式执行的时候,会首先去内存中的字符串池中去找,看有没有ABC这个字符串,如果没有的画,就在字符串池中创建一个,等String b = "abc"时,则a,b其实是指向了同一片内存地址空间,
而String a = new String("abc")则不会去字符串池中查找,是直接创建一个"abc",所以String b = new String("abc")时,它会再创建一个,所以这时a,b指向的是不同的内存空间。String在堆里的存在形式遵循copy on write原则,
String a ="abc"
String b ="abc"当在声明 a = "abc"时,会在堆中分配一块内存给"abc",比如把引用地址记为:0Xff09,
而当在声明b = "abc"时,JVM发现"abc"在堆中已经存在了,所以就会直接把引用地址0Xff09付值给b,所以a==b,当用new String("")时,内存中的引用地址都是新建的 ,所以不同
请高人告知以下三段代码的输出是什么?为什么?(关健是告之为什么)
第一段代码:
HashMap map = new HashMap();
String a = "ade";
String b = "ade";
map.put(a, new Boolean(true));
map.put(b, new Boolean(false));
System.out.println(map.get(a).toString());
System.out.println(map.get(b).toString());第二段代码:
HashMap map = new HashMap();
String a = new String("ade");
String b = new String("ade");
map.put(a, new Boolean(true));
map.put(b, new Boolean(false));
System.out.println(map.get(a).toString());
System.out.println(map.get(b).toString());第三段代码:
HashMap map = new HashMap();
MyString a = new MyString("ade");
MyString b = new MyString("ade");
map.put(a, new Boolean(true));
map.put(b, new Boolean(false));
System.out.println(map.get(a).toString());
System.out.println(map.get(b).toString());其中MyString定义如下:
public class MyString {
String str;
public MyString(String str){
this.str = str;
}
@Override
public int hashCode() {
return str.hashCode();
}}
第一段代码:和第2段代码,一样,都是输出false.
因为a.equals(b).
hashmap 的key 比的是equals 而不是==第三段代码,是true false.
同理 这里里面a.equals(b)=false.
____________________________
String a = "abc";
String b = "abc";
System.out.println(a == b);
输出:true
==========================
String a = new String("ade");
String b = new String("ade");
System.out.println(a == b);
前面的,a跟b指向同一个字符串
后面的,因为用了new 所以是两个值相等的新字符串
- a bit of java (from forum)
- A bit of socket code from python
- a bit of git
- Gerber Output Options - from A.D. Company offical forum
- A Collection of Multimedia Mining Related Research Forum
- A list of useful posts on MCE Sandbox FORUM
- Accessing 64 bit registry from a 32 bit process
- 编译WebCamPlugin from Ogre forum.
- Print the bit pattern of a float
- A bit of fun: fun with bits
- A little bit of sad and idle
- Feeling a bit of tired today!
- A bit of reflection on C# reflection
- A bit of fun: fun with bits
- Archive of the forum RCE
- notes of VMware Forum 2009
- debug 64bit dump of a 32bit process in windows 7 64bit
- ate a window with a bit depth of 32
- u-boot在s3c2410开发板上移植(NAND Flash Boot)过程
- C++ Builder Font Styles Formatting
- 感悟-人生规划
- 周立功--我的25年嵌入式生涯
- 为什么编译要花这么长的时间?
- a bit of java (from forum)
- ASP.NET学习笔记(2007-6-2)
- AT&T汇编和GCC 嵌入汇编、x86汇编和vc嵌入汇编
- 一个简单的Flex Demo
- C#2.0基本语法一
- AJAX并不神秘:揭密各种AJAX控件和类库
- 获取并显示数据
- C#2.0基本语法二
- 手动编写 Makefile文件