Java几道面试题的笔记

1.Java中求数组char ch[]的长度(元素的个数): ch.length;求字符串s的长度:s.length();

2.arraycopy函数用于拷贝数组,定义如下:

  static void (Object src, int srcPos, Object dest, int destPos, int length)

  从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

  src:要被复制的源数组

  srcPos:要被复制的数组的起始位置,从0开始算

  dest:复制到的目标数组

  destPos:要放入的目标数组的位置,从0开始算

  length:被复制的源数组的长度

  NB:注意目标位置的元素将会被替换掉

  eg:int a=new int[]{1,2,3,4,5}; int b=new int[]{6,7,8,9}

  System.arraycopy(a,2,b,1,3);

  这句之后,b={6,3,4,5}

3. byte b1=10+1;//通过

byte b2=2; byte b3=3;

byte b4=b2+b3;//出错,类型不兼容

byte b5=(byte)(b2+b3);//通过

问:b1的右边是加法,b4的右边也是加法,为什么第一句通过,美国服务器,第二句报错?

答:编译器在编译时,会将能够直接计算出来的数据先计算,便于提升效率。因此b1的右边,会被编译器看作11而不是10+1,编译器知道int类型的11转换成byte类型时,没有超过byte类型的表示范围,因此不报错;对于b4,由于b2和b3不是直接量,编译器在编译时不能直接识别b2+b3的值是多少,而在运行时才能够确定,因此编译器不能确定int类型值(b2+b3)在转换成byte类型时是否会超过byte类型的有效表示范围,又因为Java是一种安全的语言,因此编译器会报错,说不能转换成byte类型。而把右边强制转换成byte类型后,编译器的错误就消失了,就像b5一样。因为编译器知道是程序员让编译器这样做的,就算超过byte的表示范围,编译器也会忽略这个问题,因为编译器知道这个问题程序员已经考虑到了。

4. while(…){

if(…){

break;//这个break不是退出if,而是退出while循环

}

}

5.分析以下代码出错的原因:

Father.java:

public class Father {

private String name;

public Father(String name){

this.name=name;

}

}

Son.java

public class Son extends Father{}//报错

  答:子类虽然什么都没写,但是系统会为子类添加一个默认的构造函数,如果这个构造函数没有this关键字,则第一句会调用父类的无参构造函数。而父类中没有无参构造函数,因此报错。英文的意思是:隐含的super()默认构造函数没有定义,必须定义一个隐含的构造函数。

  记住:任何一个子类的构造函数,一定会调用父类的构造函数。

6.char[] c=new char[]{‘A’,’B’,’C’,’D’,’E’};

  System.out.println(c);//输出c内的元素:ABCED

  System.out.println(“char[] c:”+c);//输出char[] c:[C+地址(hashCode)

  打印一个boolean的数组时,若参数直接为该数组,则打印结果为[Z@+地址

  任何值与字符串想加得到的都是字符串

7. Java中的字符串(String)对象永不改变,只能复制

  String s1=”abc”;

  String s2=s1;

  s1+=”def”;

  System.out.println(s1);//abcdef>>>s1新开辟了一块空间存放结果

  System.out.println(s2);//abc

8. String str1=”abc”; String str2=”abc”; str1==str2–>true

  String str3=”a”+”bc”; str1==tr3–>true

  String str4=str1+””; str1==str4–>false

  Integer i1=12; Integer i2 =12; i1==i2–>true

  Integer i3=128; Integer i4=128; i3==i4–>false

  说明:str1的值“abc”放在堆中的常量池中,定义str2时,系统发现字面量”abc”已经在常量池中存在,因此直接将此返回给str2,于是str2和str2共享同一个字面量。创建str3时,编译器会把能够直接计算的值先算出来,因此在编译的时候就发现str3的值是“abc”,于是再将“abc”返回给str3。此时str1,str2,str3共享同一个变量,指向同一个地址。对于str4,编译的时候不能直接计算出它的值,因此需要重新去建一个对象,此时与str1,str2,str3的地址不等

漫无目的的生活就像出海航行而没有指南针

Java几道面试题的笔记

相关文章:

你感兴趣的文章:

标签云: