1.执行以下程序后的输出结果是()D
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println(a + "," + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y); y = x;
}
}
A,A
A,B
B,B
AB,B
这题不多说了,虽然没错,也拿出来记录一下。人类迷惑大赏,还记得在Java疯狂讲义的笔记中说StringBuffer是个可变类嘛,可变又是通过哪些方法实现的,还有印象的话这题就不会错;或者想想值传递,StringBuffer类的两个变量a和b是new出来的,传递的时候传递的是这个对象的地址值,append操作改变的是地址里面的值,y=x是改变引用地址,把y的地址改成x的了,但是b还是指向原地址,所以选D。
理解这个题,最好的办法可以在IDEA里面打个断点调试,再把StringBuffer换成String试试,比较一下就明白了。
2.下面代码将输出什么内容?
public class SystemUtil{
public static boolean isAdmin(String userId){
return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
System.out.println(isAdmin("Admin"));
}
}
//false
第三行==后面的那个admin指向字符串常量池里admin的地址,而toLowerCase方法在源码中重新new String()返回的,指向的是这个字符串对象在堆内存中的地址。一个是堆区,一个是常量池,显然就不等。
那么下面的代码返回的是啥呢?答案是true
public class SystemUtil{
public static boolean isAdmin(String userId){
return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
System.out.println(isAdmin("admin"));
}
}
不需要new String()返回新的对象,都指的是常量池里admin的地址,所以是true。
3.request.getHeader和request.getCookies都可以取得http请求中的cookie值。
4.有以下一个对象:
public class DataObject implements Serializable{
private static int i=0;
private String word=" ";
public void setWord(String word){
this.word=word;
}
public void setI(int i){
Data0bject. i=I;
}
}
创建一个如下方式的DataObject:
DataObject object=new Data0bject ( );
object. setWord("123");
object. setI(2);
将此对象序列化为文件,并在另外一个JVM中读取文件,进行反序列化,请问此时读出的Data0bject对象中的word和i的值分别为:D
", 0
"", 2
"123", 2
"123", 0
序列化保存的是对象的状态,静态变量属于类的状态,因此,序列化并不保存静态变量。所以i是没有改变的。
5.下面这条语句一共创建了多少个对象:String s=“welcome”+“to”+360。答案是1个。
String s = “a” + “b” + “c” + 360;编译器将其优化为String s = “abc360”,若常量池中不存在这个字符串则会常量池中创建一个对象,若存在则不创建。不过如果常量池中如果没有“welcome"和”to‘,那还得新建,答案就肯定不止1个了。这题也没说清楚。
6.Object里面没有copy()方法,有getClass(), hashCode(), equals(), clone(), toString(), notify(), notifyAll(), wait(), finalize()。
7.私有线程区域:程序计数器、虚拟机栈、本地方法栈;线程共享区域:堆、方法区
8.java并发框架支持锁包括读写锁、自旋锁、乐观锁,这一块内容得补补深入理解JVM。