Java基础题

 一

以下哪些类是线程安全的()

A. Vector  --------√
B. HashMap
C. ArrayList     
D. StringBuffer   ------√
E. Properties     ------√

解释一下Properties:

HashTable的方法是同步的,而Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法。此类是线程安全的:多个线程可以共享单个 Properties 对象而无需进行外部同步。 

以下代码执行的结果显示是多少()?

public class Demo{
	public static void main(String args[]) {
		int count = 0;
		int num = 0;
		for(int i = 0; i <= 100;i++){
		num = num + i;
		count = count++;
	}
}
System. out. println("num * count =”+ (num * count)); 

要知道此题答案需要知道jvm虚拟机的后自增原理。count++;这一句在jvm虚拟机中会先创建一个临时变量,int temp = count; 然后再count= count+1;最后如果有赋值语句时再把temp给出去这里则是 count = temp;

虽然这波操作看起来有点奇怪,但是其实这才符合算术运算符的优先顺序,而以往刚开始学习说的先使用后++反而有点问题,因为++的优先级是高于=的,如果按大多数的地方理解后++就是先使用后++的话 这里就不太符合优先级了。

(其实我学jvm的时候看过这里指令是咋执行的,这里大概说一下,就是将存在栈中槽位的值先count=0 中的0放进了操作数栈,然后槽位中的0经过加1变成了1,然后赋值操作有把操作数栈中那个存的1给了count的槽位,结果count又变成了1,过程就是这样,如果没看懂这几句也没关系,后期学了jvm自然就懂了)

简言之:count++是先执行的,此时count=1,但是返回的是加之前的变量0,结果为1的count又变成0了。

根据下面这个程序的内容,判断哪些描述是正确的:( )

public class Test {
    public static void main(String args[]) {
        String s = "tommy";
        Object o = s;
        sayHello(o); //语句1
        sayHello(s); //语句2
    }
    public static void sayHello(String to) {
        System.out.println(String.format("Hello, %s", to));
    }
    public static void sayHello(Object to) {
        System.out.println(String.format("Welcome, %s", to));
    }
}

A. 这段程序有编译错误
B. 语句1输出为:Hello, tommy
C. 语句2输出为:Hello, tommy
D. 语句1输出为:Welcome, tommy
E. 语句2输出为:Welcome, tommy
F. 根据选用的Java编译器不同,这段程序的输出可能不同

答案:CD

方法的调用首先以参数类型最符合作为原则。

至于为啥Object那个输出的不是对象的地址是因为多态,String重写的Object的 toString 方法,而 String.format 输出是调用的 toString 方法,用的是String的 toString 方法

你可能感兴趣的:(java基础知识,java)