java string方面考题

(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

感谢金丝燕大学校长


你可能感兴趣的:(java string方面考题)