String s="abc";
String s1=new String("abc");
以上两句是调用哪种构造函数完成初始化的呢?
String s1=new String("abc");
以上两句是调用哪种构造函数完成初始化的呢?
解决方案 »
- foreach 时remove(obj)抛出异常,非常简单的代码,帮我分析一下。
- 有一道AWT的题,解不出,郁闷
- 关于 throws 语句的疑问,请大家帮忙给我点一下,谢谢!
- 数据库中datetime型数据运算和java.util.date与java.sql.date类型转化问题 在线等!!!!
- 用哪个类型替代ResultSet来返回
- 請問如何運行bat文件???
- 新手上路:能多个组件共用一个事件适配器嘛?
- 我在xp下安装jdk1.2,安装可以成功,但执行java,javac系统报错
- 在一个类里声明了一个Vector 我想在别的类里访问它,对他进行操作,我应该怎么做
- sharetop(天生不笨) 朋友来看。谢谢。。。。
- 在线跪求 String 正则表达式
- JAXP是如何在底层工作的
String s="abc";--若之前创建了"abc"这个变量,将共享该内存。
调用String(String original)完成初始化,那 这两种类型是如何初始化的呢?
String s="abc";
String s1=new String("abc");其实是在查看String源代码时,搞不明白,String类的变量是如初始化的,才发觉原来连上面的问题也没明白
比如我想调试,String类中String(String original)构造函数时,应该如何操作呢
public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
// The array representing the String is bigger than the new
// String itself. Perhaps this constructor is being called
// in order to trim the baggage, so make a copy of the array.
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
// The array representing the String is the same
// size as the String, so no point in making a copy.
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}
在栈中先创建一个字符串引用s,然后在字符串常量池里找有没有abc,如果找到就将s指向这个abc(引用),如果没有就新创建一个abc并将s指向它
String s1=new String("abc"):
在栈中先创建一个字符串引用s,然后在堆中创建一个初始值为abc的String对象,最后将s指向这个对象
区别就在于s和s1使用"=="操作符
用第一种方法创建的两个abc的String对象实际指向同一个abc,所以==判断引用是否指向同一个对象结果为true
第二种方法创建两个abc的String对象是在堆中分别开辟空间创建的两个对象,用==判断引用是否指向同一个对象结果为false
用第一种方式创建String对象有利于节省内存空间,在一定程度上也能提高运行速度(在堆中开辟空间会加重程序负担)
你可能误解了我的意思,大概是我没有描述清楚
原本我是想看看String中的compareTo方法是如何实现的,源码如下:public int compareTo(String anotherString) {
int len1 = count;
int len2 = anotherString.count;
int n = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset; if (i == j) {
int k = i;
int lim = n + i;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
} else {
while (n-- != 0) {
char c1 = v1[i++];
char c2 = v2[j++];
if (c1 != c2) {
return c1 - c2;
}
}
}
return len1 - len2;
}接着我就想搞清楚compareTo方法中使用的String类的变量初值是多少,如count,value,offset
我开始查看构造函数是如何初始化这些变量的,结果发现完全没能搞明白,所以就有了本贴开始处提问的String s="abc";是如何初始化的
也就是想知道用哪个构造函数,怎么给count,value,offset这些变量赋值的