Csdn乐知——IT就业培训专家
http://www.tjitcast.com
}
... } 而非
s = new String(\
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即 StringBuffer。
31、是否可以继承String类?
String类是final类故不可以继承。
32、String s = new String(\创建了几个String Object? 二者之间有什么区别?
两个,一个放在常量区,不管写多少遍,都是同一个。New String每写一遍,就创建一个新。
33、String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。
Csdn乐知——IT就业培训专家
http://www.tjitcast.com
接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。
StringBuffer sbf = new StringBuffer(); for(int i=0;i<100;i++) { sbf.append(i); }
上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。
String str = new String(); for(int i=0;i<100;i++) { str = str + i; }
34、如何把一段逗号分割的字符串转换成一个数组?
如果不查jdk api,我很难写出来!我可以说说我的思路: 1. 用正则表达式,代码大概为:String [] result = orgStr.split(“,”);
2. 用 StingTokenizer ,代码为:StringTokenizer tokener = StringTokenizer(orgStr,”,”);
String [] result = new String[tokener .countTokens()]; Int i=0;
while(tokener.hasNext(){result[i++]=toker.nextToken();}
35、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。
36、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
Csdn乐知——IT就业培训专家
http://www.tjitcast.com
我的答案是在return中间执行,参看下一题的讲解。
public class Test {
static int test() { } }
---------执行结果 ---------
int x = 1; try { } finally { }
++x; return x;
/**
* @param args add by zxx ,Dec 9, 2008 */
public static void main(String[] args) { }
// TODO Auto-generated method stub System.out.println(new Test().test());;
1
37、下面的程序代码输出的结果是多少?
public class smallT { public static void main(String args[]) { smallT t = new smallT(); int b = t.get(); System.out.println(b); } public int get() {
Csdn乐知——IT就业培训专家
http://www.tjitcast.com
}
}
try { return 1 ; }
finally { return 2 ; }
返回的结果是2。
我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。
在讲解答案时可以用下面的程序来帮助分析:
public class Test {
int test() { }
int func1() {
System.out.println(\); try { } finally { }
return func2(); return func1();
/**
* @param args add by zxx ,Dec 9, 2008 */
public static void main(String[] args) { }
// TODO Auto-generated method stub System.out.println(new Test().test());;
Csdn乐知——IT就业培训专家
http://www.tjitcast.com
}
}
int func2() {
System.out.println(\); return 2; return 1;
}
-----------执行结果-----------------
func1 func2 2
结论:finally中的代码比return 和break语句后执行
38、final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用
39、运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
40、error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。