普华永道笔试题

javaliuliu 2014-08-02 05:55:38
希望同学们看后,写输出的答案和解释原因(越详细越好)
Q1:

package com.victor.test;

public class TestMain {
public static void main(String[] args) {
String value = "Hello";
System.out.println("Hello" + "World" == "HelloWorld");
join(value);
System.out.println(value);
}

public static void join(String value) {
value+="World";
System.out.println(value=="HelloWorld");
}
}



Q2:

package com.victor.test;

public class TestMain2 {

public static void main(String[] args) {

System.out.println(getResult("a"));

}

public static String getResult(String str) {
String result = "defalut";
switch (str) {
case "a":
result = "a";
case "b":
result = "b";
default:
result = "c";
}
return result;
}
}



Q3:

package com.victor.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;


public class TestMain3 {
public static void main(String[] args) {

List<String> aList = new ArrayList<String>();
aList.add(null);

Set aset = new HashSet();
aset.add(null);

Map<String,String> aMap = new HashMap<String,String>();
aMap.put(null,null);

Hashtable<Object, Object> attributeTypes = new Hashtable<Object, Object>();

attributeTypes.put("String",null);

attributeTypes.put(null,null);


}

}



Q4:

package com.victor.test;

public class TestMain4 {
public static void main(String[] args) {

System.out.println(getValue());

}

public static int getValue(){
int i=1;
try {
throw new Exception();
} catch (Exception e) {
return ++i;
}finally{
++i;
System.out.println("finally : " + i);
}
}
}


javascript:
Q1:

var foo = function() {
speak();
jumpp;
var jump = function jumpp(){
console.log('how high');
}
return;
function speak(){
console.log('howdy');
}
};

foo();


Q2:

console.log("" == 0);
console.log(0 == '0');
console.log(false == 'false');
console.log(false == '0');
console.log(false == null);
console.log(null == undefined);


暂时先发这些,希望知道原理的童鞋写出心得供大家学习,谢谢了。
...全文
992 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
逍遥jc 2014-08-07
  • 打赏
  • 举报
回复
引用 19 楼 u010111184 的回复:
[quote=引用 8 楼 zhujuyu 的回复:] [quote=引用 7 楼 xiangnan129 的回复:] [quote=引用 6 楼 zhujuyu 的回复:] 刚学java小白一枚,请哪位仁兄解释下第一题为什么value + "World" == “HelloWorld” 的输出结果是false。
因为“==”比较的是字符串的地址值+字符串的内容。只有两个都相等的时候才会为ture,当把之前的value的地址值传到方法join时,再进行操作,value+="World"; 这时其实是新创建了一个Sring,与常量池的HelloWorld已经不同了,所以地址值是不同的。[/quote] 我稍微测试了一下

String value = "Hello";
		boolean a;
		a= (value + "World" == "HelloWorld");
		boolean b =("Hello" + "World" == "HelloWorld");
		System.out.println(a+"\t"+b);
输出的结果为:false true 可见方法join的存在是无关紧要的,按你说的道理,应该是变量value与常量直接相加后,所得到的结果与常量池“HelloWorld”的地址值不同——你看是不是这样? 另外有什么办法可以看到变量的地址值?[/quote] 第一个false是因为value是String类型的,存放在堆中,value+"World"会先在内存中开辟空间才能保存结果,而且“Hello”+"World",两者原本就存放在常量池中,所以相加后还是存在常量池,所以地址相等。[/quote] 最主要的原因还是因为value是在堆中,在编译期是无法确定的,所以必须新创建一个对象。如果用value.intern()。就和第二个结果一样了。
逍遥jc 2014-08-07
  • 打赏
  • 举报
回复
引用 8 楼 zhujuyu 的回复:
[quote=引用 7 楼 xiangnan129 的回复:] [quote=引用 6 楼 zhujuyu 的回复:] 刚学java小白一枚,请哪位仁兄解释下第一题为什么value + "World" == “HelloWorld” 的输出结果是false。
因为“==”比较的是字符串的地址值+字符串的内容。只有两个都相等的时候才会为ture,当把之前的value的地址值传到方法join时,再进行操作,value+="World"; 这时其实是新创建了一个Sring,与常量池的HelloWorld已经不同了,所以地址值是不同的。[/quote] 我稍微测试了一下

String value = "Hello";
		boolean a;
		a= (value + "World" == "HelloWorld");
		boolean b =("Hello" + "World" == "HelloWorld");
		System.out.println(a+"\t"+b);
输出的结果为:false true 可见方法join的存在是无关紧要的,按你说的道理,应该是变量value与常量直接相加后,所得到的结果与常量池“HelloWorld”的地址值不同——你看是不是这样? 另外有什么办法可以看到变量的地址值?[/quote] 第一个false是因为value是String类型的,存放在堆中,value+"World"会先在内存中开辟空间才能保存结果,而且“Hello”+"World",两者原本就存放在常量池中,所以相加后还是存在常量池,所以地址相等。
lliiqiang 2014-08-06
  • 打赏
  • 举报
回复
+字符串产生一个新的字符串对象。 局部变量引用改变不会改变外面传递的变量.
zsjpower0124 2014-08-05
  • 打赏
  • 举报
回复
引用 14 楼 forever_loved 的回复:
[quote=引用 11 楼 sunbo624 的回复:] Q1 true 编译器自动优化 将字符串常量先相加 false 地址不等 hello 调用完 value本身没改变 仍然指向的Hello Q2 c 传什么都是c 因为没有break; Q3 Hashtable 不允许空key和空value Q4 2 return语句后 再对栈中的数据做操作是无效的 我觉得题出的很好 考验的是一个人的细心程度 程序员就需要细心
你可以去试试代码, finally是一定会执行的,不管有没有return。[/quote] finally肯定会执行,但finally中的操作是不会影响到return的栈数据的。
sunbo624 2014-08-05
  • 打赏
  • 举报
回复
引用 14 楼 forever_loved 的回复:
[quote=引用 11 楼 sunbo624 的回复:] Q1 true 编译器自动优化 将字符串常量先相加 false 地址不等 hello 调用完 value本身没改变 仍然指向的Hello Q2 c 传什么都是c 因为没有break; Q3 Hashtable 不允许空key和空value Q4 2 return语句后 再对栈中的数据做操作是无效的 我觉得题出的很好 考验的是一个人的细心程度 程序员就需要细心
你可以去试试代码, finally是一定会执行的,不管有没有return。[/quote] 会执行 但是返回的一定是执行前的
forever_loved 2014-08-05
  • 打赏
  • 举报
回复
引用 11 楼 sunbo624 的回复:
Q1 true 编译器自动优化 将字符串常量先相加 false 地址不等 hello 调用完 value本身没改变 仍然指向的Hello Q2 c 传什么都是c 因为没有break; Q3 Hashtable 不允许空key和空value Q4 2 return语句后 再对栈中的数据做操作是无效的 我觉得题出的很好 考验的是一个人的细心程度 程序员就需要细心
你可以去试试代码, finally是一定会执行的,不管有没有return。
乔不思 2014-08-05
  • 打赏
  • 举报
回复
引用 8 楼 zhujuyu 的回复:
[quote=引用 7 楼 xiangnan129 的回复:] [quote=引用 6 楼 zhujuyu 的回复:] 刚学java小白一枚,请哪位仁兄解释下第一题为什么value + "World" == “HelloWorld” 的输出结果是false。
因为“==”比较的是字符串的地址值+字符串的内容。只有两个都相等的时候才会为ture,当把之前的value的地址值传到方法join时,再进行操作,value+="World"; 这时其实是新创建了一个Sring,与常量池的HelloWorld已经不同了,所以地址值是不同的。[/quote] 我稍微测试了一下

String value = "Hello";
		boolean a;
		a= (value + "World" == "HelloWorld");
		boolean b =("Hello" + "World" == "HelloWorld");
		System.out.println(a+"\t"+b);
输出的结果为:false true 可见方法join的存在是无关紧要的,按你说的道理,应该是变量value与常量直接相加后,所得到的结果与常量池“HelloWorld”的地址值不同——你看是不是这样? 另外有什么办法可以看到变量的地址值?[/quote]打印 hashCode()
sunbo624 2014-08-04
  • 打赏
  • 举报
回复
Q1 true 编译器自动优化 将字符串常量先相加 false 地址不等 hello 调用完 value本身没改变 仍然指向的Hello Q2 c 传什么都是c 因为没有break; Q3 Hashtable 不允许空key和空value Q4 2 return语句后 再对栈中的数据做操作是无效的 我觉得题出的很好 考验的是一个人的细心程度 程序员就需要细心
javaliuliu 2014-08-04
  • 打赏
  • 举报
回复
引用 2 楼 vnvlyp 的回复:
字符串比较,常量池,参数传递,Java7版switch,各Collection对null的处理,try catch finally机制 一看就知道这公司目的很明确,招熟练工累死你,并且从这个难度来看,进这样的公司没前途
我想申明以下,这是技术讨论贴,如果觉得太肤浅就不要发些与技术无关的言论,因为这对技术讨论没有任何帮助,csdn不是你廉价吐槽的地方IT MAN
javaliuliu 2014-08-04
  • 打赏
  • 举报
回复
没几个讨论技术的,伤心
zsjpower0124 2014-08-04
  • 打赏
  • 举报
回复
引用 7 楼 xiangnan129 的回复:
[quote=引用 6 楼 zhujuyu 的回复:] 刚学java小白一枚,请哪位仁兄解释下第一题为什么value + "World" == “HelloWorld” 的输出结果是false。
因为“==”比较的是字符串的地址值+字符串的内容。只有两个都相等的时候才会为ture,当把之前的value的地址值传到方法join时,再进行操作,value+="World"; 这时其实是新创建了一个Sring,与常量池的HelloWorld已经不同了,所以地址值是不同的。[/quote] 兄弟,可以编译下这个类再用反编译工具看下,会发现不同。 虚拟机在编译时会比较“智能”的预编译下。 System.out.println("Hello" + "World" == "HelloWorld"); 这句话在编译后直接为System.out.println(true);
vnvlyp 2014-08-04
  • 打赏
  • 举报
回复
引用 10 楼 javaliuliu 的回复:
[quote=引用 2 楼 vnvlyp 的回复:] 字符串比较,常量池,参数传递,Java7版switch,各Collection对null的处理,try catch finally机制 一看就知道这公司目的很明确,招熟练工累死你,并且从这个难度来看,进这样的公司没前途
我想申明以下,这是技术讨论贴,如果觉得太肤浅就不要发些与技术无关的言论,因为这对技术讨论没有任何帮助,csdn不是你廉价吐槽的地方IT MAN[/quote] 我只是没具体说而已,上面每一个内容对应一道题,你搜索一下不就知道了,难道要别人把答案全部详详细细像教科书一样写出来才叫技术讨论?而且我说的是客观事实,被你说得倒变成主观吐槽了?
zqfddqr 2014-08-03
  • 打赏
  • 举报
回复
普华永道 不是会计事物的么 还干开发?
zhujuyu 2014-08-03
  • 打赏
  • 举报
回复
引用 7 楼 xiangnan129 的回复:
[quote=引用 6 楼 zhujuyu 的回复:] 刚学java小白一枚,请哪位仁兄解释下第一题为什么value + "World" == “HelloWorld” 的输出结果是false。
因为“==”比较的是字符串的地址值+字符串的内容。只有两个都相等的时候才会为ture,当把之前的value的地址值传到方法join时,再进行操作,value+="World"; 这时其实是新创建了一个Sring,与常量池的HelloWorld已经不同了,所以地址值是不同的。[/quote] 我稍微测试了一下

String value = "Hello";
		boolean a;
		a= (value + "World" == "HelloWorld");
		boolean b =("Hello" + "World" == "HelloWorld");
		System.out.println(a+"\t"+b);
输出的结果为:false true 可见方法join的存在是无关紧要的,按你说的道理,应该是变量value与常量直接相加后,所得到的结果与常量池“HelloWorld”的地址值不同——你看是不是这样? 另外有什么办法可以看到变量的地址值?
scott_129 2014-08-03
  • 打赏
  • 举报
回复
引用 6 楼 zhujuyu 的回复:
刚学java小白一枚,请哪位仁兄解释下第一题为什么value + "World" == “HelloWorld” 的输出结果是false。
因为“==”比较的是字符串的地址值+字符串的内容。只有两个都相等的时候才会为ture,当把之前的value的地址值传到方法join时,再进行操作,value+="World"; 这时其实是新创建了一个Sring,与常量池的HelloWorld已经不同了,所以地址值是不同的。
zhujuyu 2014-08-03
  • 打赏
  • 举报
回复
刚学java小白一枚,请哪位仁兄解释下第一题为什么value + "World" == “HelloWorld” 的输出结果是false。
qingyuan18 2014-08-02
  • 打赏
  • 举报
回复
普华永道还有做开发实施的?不是早就卖给IBM了么? 这类试题太基础了,招的不是实习生就是初级程序员,而且JDK7以后,case逻辑已经可以支持字符类型了,还在考原来老的JDK的case比较,这些题目没有太多参考价值
grapepaul 2014-08-02
  • 打赏
  • 举报
回复
我说说javascript那两题吧 1. focus on 函数声明和函数表达式的区别,解析器对待它们的加载策略是不同的。 具体来说函数声明会提前加载好,而表达式要js走到它那一行才加载。 所以jumpp; 是未定义的变量,而speak();可以console出来。 2.有点蛋疼,明知道两等号在js里面不可靠就尽量避开好了,我们组严厉禁止==出现。 答案不打了,建议自己测试就好,另外,undefined也可以被赋值,所以...更无聊的问题,算了,到此为止。
vnvlyp 2014-08-02
  • 打赏
  • 举报
回复
字符串比较,常量池,参数传递,Java7版switch,各Collection对null的处理,try catch finally机制 一看就知道这公司目的很明确,招熟练工累死你,并且从这个难度来看,进这样的公司没前途
groovy2007 2014-08-02
  • 打赏
  • 举报
回复
看了一下,只想说真jb无聊的题目 如果是我去面试,当场把面试官骂一顿,出这种题目的公司不值得去

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧