(1)运算符的重载 表达式10.4+"4.2"的结果是什么? A返回double类型14.6 B返回string类型14.6 C返回long类型14 D返回string类型10.442 试题分析: Java不支持运算符重载,但是在Java内部提供了一些特殊运算符,它们具有重载的特性。 例如,“+”。当一个操作数为原始数据类型,另一个操作数为string数据类型的时候,则基本类型的操作数要转换为等价的字符串,这时候的+不再是加运算符,而是连接符,所以表达式返回的结果是10.442。 “+”在实现字符串连接时候,操作数可以是两个字符串,也可以是一个字符串和其他类型。 String类型的字符串连接是通过StringBuilder来实现的。 Stringa = "a"; Stringb = "b"; Stringc = a+b; Stringd = c+1; 将上面代码编码后在反编译,可以得到的结果如下: Stringa = "a"; Stringb = "b"; Stringc =(newStringBuilder(String.valueOf(a))).append(b).toString(); Stringd =(newStringBuilder(String.valueOf(c))).append(1).toString(); 通过上面的反编译结果可以看出“+”在实现字符串连接过程中,实际上是借助StringBuilder类及其append()方法来实现的。 参考答案: D (2)string参数的传递方式 写出下面程序的运行结果: publicclass Test{ publicstatic void method(String str){ str= "good-bye"; } publicstatic void main(String args[]) { Stringstr = "abcd"; method(str); System.out.println(str); } } 参考答案: Abcd (3)String内存存储 例题一: 下面选项那些返回true? Strings ="hello"; Stringt ="hello"; char[] c = {'h','e','l','l','o'}; System.out.println(s.equals(t));//true System.out.println(t.equals(c));//false System.out.println(s==t);//true System.out.println(t.equals(newString("hello")));//true System.out.println(t==c); 试题分析: 字符串是程序中使用频率最高的一种数据类型,Java为了加强程序的运行速度,因此设计了两种不同的方法来生成字符串对象。一种是调用string类的构造函数,另一种是使用“”。这两种方法产生的字符串对象在内存中存放的机制不同。 Java为string类型提供了缓冲池机制,当使用双引号定义对象时,java环境首先去缓冲池寻找相同内容的字符串,如果存在就直接拿出来使用,如果不存在则创建一个新的字符串放入缓冲池中。 在使用string构造函数定义字符串对象时,Java环境会和创建其他类型的对象一样,每次调用,都会创建一个新的对象。 String对象的equals函数是比较两个对象的string内容是否相等。需要指出的是由于s和t并不是由new产生的,他们所指的是内存池中同一个字符串的常量,所以地址是相同的。 ==和equal的区别: ==是一个关系运算符,用于比较两个简单类型变量的值是否相等,或者两个引用变量的引用地址是否相等。 equals()是一个方法,用于判断引用变量引用地址指向的存储内容是否相等。 注意:在最根本的object类中定义的equals()方法是直接使用==实现的,因此,在自定义类型时建议重写equals()方法,实现自定义的比较规则。例如string,integer等类型都已经对equals()方法进行过重写。 例题二: 认真分析下面的程序段,按要求回答问题。 1 public static void main(String args[]) { 2 String str = new String ("good"); 3 String str1 = "good"; 4 String str2= new String ("good"); 5 System.out.println(str==str1); 6 System.out.println(str.equals(str2)); 7 System.out.println(str2==str1); } 在程序的第2-4行,string对象创建了几个对象,分别写出? 在程序的5-7行,分别写出输出结果? 参考答案: 第2行处的答案是:两个对象 第3行处的答案是:没有对象 第4行处的答案是:一个对象 第5行处的答案是:false 第6行处的答案是:true 第7行处的答案是:false 试题分析: 首先我们要清楚什么是StringPool?stringpool就是string池,也就是内存的数据段区域,专门存放静态变量和字符串的区域。如果stringstr = "abc",那么字符串"abc"就存放在StringPool中,如果stringstr = new String("abc")就存放在内存的Heap里面。 在本程序中,当Java执行到第二行的时候,首先在StringPool中查找有没有字符串常量"good",因为没有所以创建"good"的对象。当执行newString ("good")则在Heap里面创建"good"对象,而str则是该对象的引用,因此共创建两个对象。 当执行第3行时候,首先还是在StringPool查找有没有字符串常量"good",有则直接将str1当做StringPool中"good"的引用,当你重新一个string类型变量为"good"时候,将使用StringPool中原来那个"good",而不重新分配内存。也就是说str和str1指向同一块儿内存,因此此时没有创建任何对象。 当执行到第4行的时候,还是先在StringPool查找有没有字符串常量"good",有则不在进行创建。由于这里使用new关键字,所以便在java堆内存中又建立一个"good"对象,而str2是这个对象的引用。因此执行此句话只创建了一个对象。 在第5行,==是比较对象的,str是指向java堆中的对象,而str1是指向javaString Pool中的对象,所以输出false 在执行到第6行,由于equals函数是判断函数的内存相等而不是地址内容,所以返回true 第7行判断同第5行。 (4)StringBuffer 下列选项是StringBuffer的构造方法,那些选项是正确的? AStringBuffer() BStringBuffer(int capacity) CStringBuffer(String str) DStringBuffer(CharSequence cq) EStringBuffer(Char [] data) 参考答案:ABC 试题分析: StringBuffer有三个构造函数: 不带参数的构造方法——StringBuffer() 创造一个不带字符的字符串缓存区,其初始容量为16个字符。 以int为参数的构造方法——StringBuffer(intlength) 创造一个不带字符串,但是具有指定初始容量的字符串缓存区。 以string对象作为参数——StringBuffer(Stringstr) 构造一个字符串缓存区,并将其初始化为指定的字符串。 (5)String,StringBuffer和StringBuilder区别 String:是被final修饰的类,是不可变类,也就是说我们通常定义的String类型的变量的值是不可改变的 StringBuffer:是线程安全的可变的字符序列 StringBuilder:是非线程安全的可变的字符序列,它和StringBuffer基本上差不多吧,在不涉及多线程使用时用StringBuilder会更快些 总体来说就是:String不可变,StringBuffer和StringBuilder可变,线程同步时用StringBuffer,非同步用StringBuilder 感谢金丝燕大学校长