您的位置:首页 > 编程语言 > Java开发

Java笔试中遇见奇怪问题积累篇

2017-03-14 16:41 246 查看
1:接口可以使用abstract方法修饰

public abstract interface HelloWorld {

boolean sayHello();

}


2:我们在实现一个比较时候一般实现Comparator接口,然后编译器强制我们实现compare方法,但是我们强制要求我们实现equals方法,但是看Comparator源码你会发现有两个方法声明:

public interface Comparator<T> {

int compare(T o1, T o2);

boolean equals(Object obj);
}


因为Java中所有的类都是Object的子类(接口也不例外),所以equals方法默认使用使用的Object的equals方法

3:使用null调用方法竟然不报空指针异常:

public class Null {

public static void print() {
System.out.println("Null ... ");
}

public static void main(String[] args) {

Null nl = null;
nl.print();

}
}


我个人分析:应该虽然nl对象是null,但是nl对象有类型信息,可以获取class字节码信息然后调用static方法

4:引用类型为null时候自动拆箱为报空指针异常

public class IntegerNull {

// 引用类型为null时候自动拆箱为报空指针异常
static Integer i;

public static void main(String[] args) {

System.out.println(i == 5);

}

}


5:使用Integer的方法直接转成固定进制数

public static void main(String[] args) {

// 将十进制8转成2进制数
System.out.println(toString(8, 2));

System.out.println(toString(14, 7));//20
//7进制20转10十进制:7的0次幂*1+7的1次幂*2=14

// 将十进制1000转成2进制
System.out.println(Integer.toString(1000, 2));

// 将十进制1000转成6进制
System.out.println(Integer.toString(1000, 6));

// static String toBinaryString(int i)
// 以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
System.out.println(Integer.toBinaryString(8));
// static String toHexString(int i)
// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
System.out.println(Integer.toOctalString(8));
// static String toOctalString(int i)
// 以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
System.out.println(Integer.toHexString(15));

System.out.println("--------------将给定数字转成任意进制-----------------");
String a = "0100";
int d = Integer.parseInt(a, 2); // 2进制
int o = Integer.parseInt(a, 8); // 8进制
System.out.println(d);
System.out.println(o);

}


String source = "0100";
int d = Integer.parseInt(a, 2); 

讲解:Integer.parseInt(source , 2)是将a转成2进制,这里面输出结果默认就是十进制!输出的进制不可以指定。

  int source =8;
System.out.println(Integer.toString(source, 2));

讲解:将指定数转换成2进制,输出结果是指定的进制,输入数是默认10进制,不可以指定

以后自己写代码实现可以参考JDK源码实现!

6:已知一个数列:f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,用递归法求f(10)的值.

耍小聪明直接交换左右两项得:f(n)=f(n+2)-2*f(n+1),然后不假思索的就开始写算法,结果运行一看,栈内存溢出。刚开始怀疑是递归调用层次较深导致的,后来求f(3)溢出秒懂了!递归没有出口!!!

public static long ferror(int n) {
if (n == 0)
return 1;
else if (n == 1)
return 4;
else if (n == 2)
return 19;
else
return ferror(n+2)-2*ferror(n+1);

}


正确实现:可以推到出f(n)=2*f(n-1)+f(n-2)就有出口了,然后实现即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: