大家都知道
String str = "abc";
与
String str;
str = "abc";
在C++里面是有效能差距的,差距是一个构造函数执行时间。那么这个在java里面有没有呢?我查阅了不少书籍都没有提及。谁知道的答案的,最好能有有力的依据的。谢谢。
String str = "abc";
与
String str;
str = "abc";
在C++里面是有效能差距的,差距是一个构造函数执行时间。那么这个在java里面有没有呢?我查阅了不少书籍都没有提及。谁知道的答案的,最好能有有力的依据的。谢谢。
解决方案 »
- JDK安装不上!怎么解决?
- java反射机制碰到问题~~~
- 不用数据库如何处理有关系的表?
- 找不到CLASS的问题
- oracle的jvm与我安装的jdk冲突,导致tomcat不能启动
- 关于对字节流进行缓存的问题,就是怎么样将从I/0设备上获得的字节流进行缓存然后转化成字符输出???
- 如何写这个正则表达式:判断一个字符串为数字字符串
- JDBC PreparedStatement executeBatch 如何忽略异常?
- 怎样编译 java 文件为 servlet 文件
- 急,MSSQL连接的问题,在线等待
- 我用JAWIN实现JAVA与VC OCX,但是出现异常,想大家看看帮帮忙
- JAVA里面有没有什么办法可以判断一个CLASS是否已经定义在CLASSPATH里面?
String str = "abc";我写了两个程序来测试,如下:
//a.java
long begin = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++)
{
String str;
str = "abc";
}
long end = System.currentTimeMillis();System.out.println(end - begin);//b.java
long begin = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++)
{
String str = "abc";
}
long end = System.currentTimeMillis();System.out.println(end - begin);结果如下:
a b
406 391
407 406
422 390
422 406
422 391看来还是String str = "abc";快.但具体还是应该分析生成的汇编码, 我看不懂汇编, 有哪们高手能具体解释一下吗?
与
String str;
str = "abc";上面有初始化,下面没初始化,用到的时候再初始化。
作为class的一个属性的时候,有些属性不一定用到,可以不预先初始化
str = "abc";
两步操作,进行了上一点点重复的工作。
String str;
本质上是在声明一个对象引用变量Java中的 String str = "abc"; 可以理解为C++中的 CString &str = CString("abc"); 或 CString *str = new CString("abc"); 这里的str变量只是一个指针或引用而已。
而C++中
CString str;
会调用默认构造函数创建对象,它实际上相当于CString str();
class Test
{
public void f1()
{
String str = "abc";
} public void f2()
{
String str;
str = "abc";
}
}的java操作码为class Test extends java.lang.Object{
Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: returnpublic void f1();
Code:
0: ldc #2; //String abc
2: astore_1
3: returnpublic void f2();
Code:
0: ldc #2; //String abc
2: astore_1
3: return}大家可以看出来,这两种操作是完完全全一样的
String a = new String("aa");
String b = new String("aa");a.equals(b)为false
但
a.intern()==b.intern()为true
{
String a = new String( "aaa" ) ;
String b = new String( "aaa" ) ;
System.out.println( a == b ) ;
System.out.println( a.equals( b ) ) ;
System.out.println( a.intern() == b.intern() ) ;
}结果是: false
true
true
jvm中有一个常量池
String a = new String("aa");
String b = new String("aa");a.equals(b)为false
但
a.intern()==b.intern()为true
a.equals(b)怎么会为false???应该是true啊。又不是==。至于intern,It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true. 由此可以看出,只要equal相等。那么pool里面的两个s和t的content也是相等的。
建议
String str;
str = "abc";
的写法.
能不能详细介绍一下这个池,或者说哪有这方面的资料??
先谢