今儿面试某公司的Java研发工程师面试题,把相关面试题回忆了一下,大家可以看看
1、写出下列程序的输出结果
public class TestFor {
public static boolean foo(char c) {
System.out.print(c);
return true;
}
public static void main(String[] args) {
int i = 0;
for (foo('A'); i < 2 && foo('B'); foo('C')) {
i++;
foo('D');
}
}
}
分析:该题目主要考察了 for 循环语句的执行,平时开发的时候并没有注意过这个问题,其实想想还是比较基础的问题,对于for(A; B; C) { D; } 执行顺序是 A、B、D、C 再次循环的时候 B、D、C ,同时该题目还考察了短路与的用法,到此你是否明白了输出结果? 如果上题修改为下面的形式,其打印结果又不一样了。
public class TestFor {
public static boolean foo(char c) {
System.out.print(c);
return true;
}
public static void main(String[] args) {
int i = 0;
for (foo('A'); foo('B') && i < 2; foo('C')) {
i++;
foo('D');
}
}
}
2、finally的用法,写出程序输出结果,记住一条finally无论如何都是必须且一定要执行的,所以打印结果就了然了,我在做这个题的时候第二输出结果搞错了。
public class TestException {
public static int testExp(int n) {
try {
if (n > 0) {
return n;
} else {
throw new Exception();
}
} catch (Exception e) {
return 0;
} finally {
return -1;
}
}
public static void main(String[] args) {
System.out.println(testExp(1));
System.out.println(testExp(-1));
}
}
3、写出打印结果,该题考的是static关键字,到现在我也还没想明白,有高手路过可以留言指点一下!!!
public class B {
public static int y = A.x + 1;
public B() {
}
public static void main(String[] args) {
String str = String.format("x={%d}, y={%d}", A.x, B.y);
System.out.println(str);
}
}
class A {
public static int x;
static {
x = B.y + 1;
}
}
4、设计题
略过
5、编程题
5.1、实现一个线程安全的懒汉式单例类,尽可能高效
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
// 同步块,可以高效处理多线程
synchronized (Singleton.class) {
// 防止一根线程正好释放了synchronized时 第二根线程获取了对象锁又重新new了一个对象
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
5.2、写一个写文件的函数,实现多线程同时写入同一个文件成功,不能使用synchronized、Lock同步锁:
集思广益,面试官说实现不唯一,能把你想到的方法留下么?
5.3、请实现一个函数能够判断一个数组是否有序(升序降序都有可能,可能含有相同的元素),有序则返回true,无序则返回false
/**
* 可以改成判断首尾两个元素,这样就可以了 如果相等,在有序情况下,所有元素都应相等
*/
public class ArrayIsSort {
public static void main(String[] args) {
// int[] arr = { 2, 2, 5, 6, 7, 8, 20 };
int[] arr = { 100, 100, 80, 70, 60, 50, 40, 30 };
boolean fg = isSort(arr);
System.out.println(fg);
}
private static boolean isSort(int[] arr) {
boolean flag = true;// 有序
int len = arr.length;
if (len > 1) {
for (int i = 0; i < len; i++) {
if (arr[0] >= arr[len - 1]) {
// 如果排序了则应该为升序
if (i != len - 1 && arr[i] < arr[i + 1]) {
flag = false;
}
} else {
// 如果排序了则应该为降序
if (i != len - 1 && arr[i] > arr[i + 1]) {
flag = false;
}
}
}
}
return flag;
}
}
5.4、输入一个表达式,没有括号,数字小于 0-99之间,输出计算结果,所有的中间结果化为整数字符串,如果输入是非法表达式 返回 ""
例如: 输入 3+8*2/9-2
输出:2
6、被问到的算法问题:
一个小猴子边上有100根香蕉,它要走过50米才能到家, 每次它最多搬50根香蕉,(多了就被压死了),它每走 1米就要吃掉一根,请问它最多能把多少根香蕉搬到家里。
提示:他可以把香蕉放下往返的走,但是必须保证它每走 一米都能有香蕉吃。也可以走到n米时,放下一些香蕉,
拿着n根香蕉走回去重新搬50根。