Java几道面试题的笔记-阿里云开发者社区

开发者社区> 开发与运维> 正文

Java几道面试题的笔记

简介:

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

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

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

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

  src:要被复制的源数组

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

  dest:复制到的目标数组

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

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

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

  例如:

1
2
3
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.    

1
2
3
4
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. 

1
2
3
4
5
while(…){
    if(…){
       break;//这个break不是退出if,而是退出while循环
    }
}

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

Father.java:

1
2
3
4
5
6
public class Father {
    private String name;
    public Father(String name){
        this.name=name;
    }
}

Son.java

1
 public class Son extends Father{ }//报错

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

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

6.  

1
2
3
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)对象永不改变,只能复制

1
2
3
4
5
String s1="abc";
String s2=s1;
s1+="def";
System.out.println(s1);//abcdef>>>s1新开辟了一块空间存放结果
System.out.println(s2);//abc

8. 

1
2
3
4
5
6
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的地址不等

  对于i3,是Integer对象,但是当其值<=127时,Integer类型的相同值的对象就只有一个。但当其值>=128时,Integer i3=128就相当于Integer i3=new Integer();就是说产生了一个新的对象,这个新的Integer对象肯定会跟i4不同地址。

9. 线程安全与不安全比较:

  StringBuffer是Java早期提供的(JDK1.0),速度稍慢,线程安全

  StringBuilder是Java5以后提供的,速度快,线程不安全

  ArrayList和LinkedList,线程不安全  -----   Vector,线程安全

  HashMap,不安全   ---   HashTable,安全

通过以下代码可以将非线程安全的list包装为线程安全的

1
2
List list=new ArrayLsit();
list=Collections.synchronizedList(list);

通过以下代码可以将非线程安全的map包装为线程安全的

1
2
Map map=new HashMap();
map=Collections.synchronizedMap(map);

10.下面代码的输出结果是:

1
2
3
4
String regex="\\\\";//4个“\”
String str2="\\\\\\\\";//8个“\”
String str3=str2.replaceAll(regex, "*");
System.out.println(str3);

  答案:****

  解释:字符串中存在转义字符,因此\\\\表示两个斜线,即“\\”,而用在正则表达式中,两个斜线又有一个是转义字符,在正则表达式中就被看成了一个字符“\”。str2其实是4个斜线,因此,用一个斜线作为替换规则,去替换4个斜线,得到4个心号。

11. 

1
2
3
4
5
6
7
8
public class EJB {
    class a{
       private static int b=12;
       public void print(){
           System.out.println(b);
       }
    }
}

  b的声明处报错,The field b cannot be declared static; static fields can only be declared in static or top level types。

  静态域只能声明在静态或顶层类型中。

12.

1
2
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(“file.dat”));
bos.write(100);

  假设file.dat不存在,运行该程序段后,文件file.dat的字节数为

  A.0         B.1         C.2         D.3

  【选A】。如果不刷新缓冲区,那么写入的字节信息就是写在缓冲区的(也就是内存)。如果显示的调用bos.flush(),或者显示调用bos.close()【bos.close的时候,会自动调用flush方法,清空缓冲区的内容】那么会将缓冲区中的数据写入文件,此时文件就有内容了。

13.  接口java.lang.Comparable<T>

  此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器

  接口java.util.Comparator<T>

  强行对某个对象 collection 进行整体排序的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

14. InputStream、OutputStream、Reader、Writer都是抽象类。java.util.List extends Collection是接口

15.XML的默认字符集是UTF-8。

16.JavaScript中:

1
2
typof(undefined)=undefined; 
typeof(null)=object;

17.解析DOM树时,是从上到下的解析,如果遇到脚本(不是函数,是script之中,function之外的脚本),也依次执行。

18.JS变量没有块级作用域,如果在function中的一个语句块(例如for循环中)定义了一个变量,那么在这个function中,哪怕是出了for的地方,也可以使用这个变量。

19.用select查询rownum的时候,只能使用小于,如果条件是大于,则不会有结果的。

20.下面语句输出什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class T15 {
    public static void main(String[] args) {
        int s=99;
        switch (s) {
        case 0:
            System.out.println();
        default:
            System.out.println("error");
        case 9:
            System.out.println("good");
        case 2:
            System.out.println("best");
        }
    }
}

  答案:error, good, best。

  原因:遇到switch,就依次将可选的值进行比较。这个比较会比较所有的值,不管default在中间还是在最后。如果把除了default的值都比较后,能够找到匹配的,则执行匹配的值的代码。如果之后没有退出(没有break语句),还会依次执行之后的代码。如果没找到匹配的值,那么开始执行default语句。如果之后也没有退出,则还会依次执行default之后的case语句,直到遇到break或者花括号。

21. 如果一个类实现了两个不同的接口,而这两个接口定义了相同的方法时,以下原则不正确的是:(   C   )

  A、如果每个接口的两个方法具有相同的方法声明,则在类中实现一个方法,并且该方法同时满足两个接口;

  B、如果两个方法参数不同,则需要实现两个方法,分别满足各自的接口定义;

  C、如果两个方法参数相同,但返回类型不同,也需要定义两个不同方法,分别返回不同的类型;

  D、如果两个方法参数相同,但返回类型不同,则不能创建满足两个接口的方法。

  解答:C中,不能在一个类里面定义只有返回值相同的两个方法

22.下列有关类继承的说法正确的是:(    C    )

  A、基类中定义了private方法A,派生类中不能定义同名的方法;(可以定义)

  B、基类中定义了protected方法A,派生类中可以重载方法A,并可以将访问级别修改为private;(子类不能减小父类方法的可见性,就是说不能从protected变为private)

  C、基类中定义了private的变量a,派生类中可以定义同样的变量a,并可以将访问级别修改为public;

  D、基类中定义了protected静态变量A,派生类中不能定义同样的变量。(可以定义)

23.两种方式添加一个下拉列表项:

       1).

1
2
document.getElementById(‘s1’).options[i]=
new Option(‘shanghai’,’sh’);

       2).

1
2
3
4
var op=document.createElement(‘option’);
op.value=’sh’;
op.innerHTML=’shanghai’;
document.getElementById(‘s1’).appendChild(op);

24.一个接口可以继承于多个接口

25. 一个抽象类可以继承于一个普通类


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章