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

来源:互联网 发布:阿里巴巴网络银行 编辑:程序博客网 时间:2024/06/05 17:16

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;elsereturn ferror(n+2)-2*ferror(n+1);}


正确实现:可以推到出f(n)=2*f(n-1)+f(n-2)就有出口了,然后实现即可。









0 0
原创粉丝点击