1、
String str=new String("abc")
在内存中是怎样分配的?
2、
String str1="abc";
和
String str1=new String("abc");
这两个的区别是什么?
public class StringTest {
public static void main(String[] args) {
String str1 = new String("strOne");
String str2 = new String("strOne");
String str3 = "strTwo";
String str4 = "strTwo";
System.out.println(str1 == str2);
System.out.println(str3 == str4);
}
}
估计答案是什么?是不是false,false ?
因为String类不能直接"=="号比较!new出来的两个String对象不在同一内存。应该用"equals()"比较两个两个String类型的数据是否相等。
------------------------------------
可是答案是:false,true;
------------------------------------
怎么理解呢?问题有:
1、String str = new String("string");与String str = "string";是否一致?有没有区别?
2、toString()会不会调用 String()的构造函数呢?
我的理解:
看到toString()方法,我会想到调用了String() 的构造函数。
可是:String str3 = "strTwo";String str4 = "strTwo";为什么构造出来是同一个String对象呢?
"strTwo"=>new StringBuffer("strTwo").toString()
String str = new String("string");与 String str = "string";
声明:以下解释是保证正确的,我会从内存空间上来解释,比较清楚。
区别是:
new String是在堆空间上分配一个空间,将指针指向这个空间,每一个new都是新的空间,==判断当然是不等。
而String str = "ssss",说一下,在每种语言中对于字符串都有特殊的处理。Java有一个专门的字符串池来保存可以重用的字符串。对于相同的字面值(也就是"双引号里面你看到东西")相同,多少个变量他们都指向相同的空间,==判断当然相等。
所以最正确的判断字符串内容相等的方法,就是用equals方法。String类这个immuable的类已经覆盖了这个从Object类继承的eqauls方法,达到了对于内容相等的判断。
关于Java String对象创建问题解惑
public String makinStrings(){
String s = "Fred";
s = s + "47";
s = s.substring(2, 5);
s = s.toUpperCase();
return s.toString();
}
问:调用makinStrings方法会创建几个String对象呢。
答案:3个
上面的方法有五条语句:现在让我们来一条一条分析一下。
String s = "Fred";结论:创建了一个String对象。这条语句相当于String s = new String("Fred");因此,毫无疑问,第一条语句创建了一个String对象,我想没有有疑问吧?
s = s + "47";结论:未创建String对象。这条语句也许很多人认为是创建了String对象,我一开始也是这么认为的。但是为了验证我的想法。决定用点法术恢复这条语句的本来面目(有很多时候,编译器总是在里面搞一些小动作,javac.exe也不例外)。现在找到这个程序所生成的.class文件(假设是Test.class),找一个反编译工具,我推荐JAD,可以http://www.softpedia.com/progDownload/JAD-Download-85911.html下载下载后,有一个jad.exe,将其路径放到环境变量path中(只限windows)。并在.class文件的当前路径执行如下的命令:
jad Test然后大喊一声“还我本来面目”会在当前目录下生成一个Test.jad文件,打开它,文件内容如下:
public String makinStrings(){
String s = "Fred";
s = (new StringBuilder(String.valueOf(s))).append("47").toString();
s = s.substring(2, 5);
s = s.toUpperCase();
return s.toString();
}
哈哈,其他的语句都没变,只有第二条变长了,虽然多了个new,但是建立的是StringBuilder对象。原来这是java编译器的优化处理。原则是能不建String对象就不建String对象。而是用StringBuilder对象加这些字符串连接起来,相当于一个字符串队列。这种方式尤其被使用在循环中,大家可以看看下面的代码:
String s = "";
for(int i=0; i < 10000000; i++){
s += "aa";
}
没有哪位老大认为这是建立了10000000个String对象吧。但不幸的是,上面的代码虽然没有建立10000000个String对象但却建立了10000000个StringBuilder对象,那是为什么呢,自已用jad工具分析一下吧。正确的写法应该是:
StringBuilder sb = new StringBuilder("");
for(int i=0; i < 10000000; i++){
sb.append(String.valueOf(i));
}
s = s.substring(2, 5);结论:创建了一个String对象也许有很多人一开始就认为这条语句是创建了一个String对象,那么恭喜你,这条语句确实创建了一个String对象实际上就是substring方法创建了一个String对象。这也没什么复杂的,自已下一个JDK源代码,看看substring是如何实现的就可以知道了。我先说一下吧。先不用管substring是如何实现的,反正在substring方法返回时使用了一个new显式地建立了一个String对象不信自己看看源码。
s = s.toUpperCase();结论:创建了一个String对象toUpperCase()和substring方法类似,在返回时也是使用了new建立了一个String对象。
这道题还算比较简单,再给大家出一个更复杂一点的,也是关于String对象的创建的(只是改了一个原题)。
public String makinStrings(){
String s = "Fred";
s = s + "Iloveyou.".substring(1).toLowerCase();
s = s.substring(0);
s = s.substring(0,1).toUpperCase();
return s.toString();
}
先公布答案吧,上述代码也创建了
3个String对象,哈哈!
为什么呢?
要想知道为什么,先得弄清楚substring、toLowerCase和toUpperCase什么时候创建String对象,什么时候不创建对象。
substring方法在截取的子字符串长度等于原字符串时,直接返回原字符串。并不创建新的String对象。
toLowerCase方法在字符串中更本没有需要转换的大写字母时直接返回原字符串,如"abcd".toLowerCase()直接返回abcd,并不创建新的String对象。
toUpperCase方法和toLowerCase类似。"ABCD".toUpperCase()直接返回ABCD。
return s.toString();结论:未创建String对象,toString方法返回的就是this,因此,它的返回值就是s。
知道了这个,上面的代码就非常清楚了。
public String makinStrings(){
String s = "Fred";//创建一个String对象
s = s + "Iloveyou.".substring(1).toLowerCase();//substring(1)创建一个String对象,由于toLowerCase()转换的字符串是"loveyou.",没有大写字母,因此,它不创建新的String对象
s = s.substring(0);//由于substring(0)截获的是s本身,因此,这条语句不创建新的String对象
s = s.substring(0,1).toUpperCase();//substring(0,1)创建了一个String对象, 但由于substring(0,1)的结果是"F",为一个大写字母,因此,toUpperCase直接返回"F"本身。
return s.toString();
}
分享到:
相关推荐
描述中提到的“常见C/C++笔试题整理,含答案”进一步确认了这是一个用于学习和复习的资源,包含了多道经典的C/C++编程题目,目的是为了帮助读者熟悉和掌握C/C++的基础知识和高级概念,以便在实际的公司笔试中能够...
【亿迅笔试题】主要考察了Java编程语言的基础知识,面向对象设计原则,以及接口和类的使用。以下是对这些知识点的详细解释: 1. **char变量与中文字符**: - Java中的`char`类型占用一个字节,即16位,但通常一个...
C++ 笔试题汇总是对 C++ 语言基础知识的总结和实践,涵盖了链表反转、字符串处理、运算符重载、引用和指针等多个知识点。本文通过实际代码示例和问题分析,帮助读者更好地理解和掌握 C++ 语言的基础知识。 1. 链表...
在Java面试和笔试中,掌握核心的Java知识是至关重要的。以下是一些关键点的详细解释: 1. **面向对象的特征**:面向对象编程(OOP)的四大特征是抽象、继承、封装和多态性。 - **抽象**:抽象是忽略不相关细节,...
综上所述,这份Java基础String类选择题练习题主要覆盖了String和StringBuffer类的基础概念、基本操作方法以及它们之间的区别等内容。通过这些练习题,学习者可以更好地理解和掌握这两个类的使用方法,为实际编程工作...
标题:JSP典型笔试题及答案 描述:这份文档提供了JSP(Java Server Pages)的典型笔试题目及其解答,被视为面试准备的宝贵资源。 知识点详解: 1. **JSP的内置对象及其方法** - `request`:表示`...
### C/C++经典笔试题汇总知识点解析 #### 题目一:单向链表的反转 **知识点:** 1. **链表基础知识**:理解单向链表的基本结构(包含节点、节点间的链接关系等)。 2. **迭代反转算法**:掌握如何通过迭代方式实现...
宏利金融java笔试题1 一、 equals()和"=="的区别 在 Java 中,equals() 和 "==" 是两个不同的概念。"==" 是一个比较符号,用于比较两个对象的内存地址是否相同,而 equals() 是一个方法,用于比较两个对象的内容...
本资源摘要信息将详细解释C++笔试题中的知识点,涵盖选择题、填空题、简答题和编程题四个部分。 一.选择题 1. 计算机科学中,函数func(x)的返回值是多少?这个问题考察了位操作的知识。函数func(x)使用while循环...
- 继承:继承允许创建新类(子类)从现有类(父类)继承属性和行为,从而实现代码复用和扩展。 - 封装:封装是隐藏对象的内部细节,只通过公共接口与外界交互,增强安全性。 - 多态性:多态性允许不同类型的对象...
【JAVA笔试题与面试题详解】 1. **Java基础知识** - Java的基本数据类型包括整型(byte, short, int, long)、浮点型(float, double)、字符型(char)和布尔型(boolean)。String不是基本数据类型,而是类,它...
- **真题解析**:通过分析以往的笔试题目及其解答方式,可以帮助求职者更好地准备面试,理解公司对应聘者的技能要求。 ### 2. 文件处理与字符串操作 在部分给出的内容中,可以看到一个具体的编程问题:如何统计一...
在Java编程语言中,`String`与`StringBuffer`是两个重要的字符串处理类,它们各自具有独特的特性和用途,尤其在面试或笔试中常被提及作为考察应聘者对Java基础知识掌握程度的重要知识点。 ### `String`类:不可变性...
【Java笔试题解析】 在2020年兴业银行的Java笔试中,涉及了多个核心的Java编程和技术概念。以下是对部分题目进行的详细解答: 1. 输入一个正整数,计算并输出距离它最近的对称数 对称数是指从左向右读和从右向左...
扩展String功能方法:一直好忙,没有时间写属于自己的东西,但是看着一天天不更新心情也不是个滋味,只有从网上收罗一些比较好的东东贴上。
HTC的Android笔试题中涉及了资源目录结构、资源引用方式、国际化和本地化策略,以及一些常用的UI控件如单选框、多选框和下拉列表框的使用。 1. **资源目录结构**: - `res`目录是存放应用资源的地方,通常包含`...
交通银行的笔试题也可能包含设计模式、继承、封装和多态等面向对象编程的概念,考察应聘者对类和对象的理解及应用。 7. **集合框架**: Java的集合框架是面试常考的内容,包括List、Set、Map接口及其实现类的使用...
Java作为世界上最受欢迎的编程语言之一,其面试题涵盖了广泛的...通过阅读"Top 1000 Java Interview Questions.pdf"和"绝对经典Java英文笔试题、答案.doc",你可以深入理解和实践这些概念,提升自己的Java技术水平。