面试题集锦--java基础--javaweb--hadoop--spark--数据结构--逻辑思维

面试题,必背,必备 1. HashMap实现原理,比较ArrayList,LinkedList的存储特性和读写性能 HashMap底层是一个数组,数组的每个元素又是一个链表,当我们往HashMap中put元素的时候,先根据key...

1. Java基础面试题

1. HashMap实现原理,比较ArrayListLinkedList的存储特性和读写性能

HashMap底层是一个数组,数组的每个元素又是一个链表,当我们往HashMapput元素的时候,先根据keyhashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标)。ArrayList 查找块,增删慢;LinkedList增删快,查找慢

 

2. 写出你用过的设计模式,并举例说明解决的实际问题

单例模式:只能创建一个实例,可以节省内存,加快访问速度,可用于创建需要频繁实例化然后销毁的对象

装饰模式:指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。如java中的静态代理

工厂模式:是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制,只要我们更换一下具体的工厂方法,系统其他地方无需一点变换,就有可能将系统功能进行改头换面的变化。

3. Java多线程的实现方式

1. 继承Thread类,实现run方法,创建子类对象,调用start方法

2. 实现Runnable接口,实现run方法,创建Thread对象,传入Runnable子类对象,调用Thread对象的start方法

3. 线程池

4. Java中有哪些锁实现方式,并分别说明各自特点

公平锁/非公平锁: 公平锁是指多个线程按照申请锁的顺序来获取锁。

非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。

独享锁/共享锁: 独享锁是指该锁一次只能被一个线程所持有。共享锁是指该锁可被多个线程所持有。

乐观锁/悲观锁: 乐观锁与悲观锁不是指具体的什么类型的锁,而是指看待并发同步的角度。

悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此对于同一个数据的并发操作,悲观锁采取加锁的形式。悲观的认为,不加锁的并发操作一定会出问题。

乐观锁则认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据。乐观的认为,不加锁的并发操作是没有事情的。

5. Java中的反射是什么,是如何实现反射的?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

反射的实现主要要依赖于Class(字节码)对象,通过该对象可以获取类中的所有属性、方法、构造方法,并进行使用。

6. Java中实现多态的原理

Java 里对象方法的调用是依靠类信息里的方法表实现的,虽然对象方法引用调用和接口方法引用调用的实现有所不同但大致思想是一样的。总体而言,当调用对象某个方法时,JVM查找该对象类的方法表以确定该方法的直接引用地址,有了地址后才真正调用该方法。

我们知道java程序运行时,类的相关信息放在方法区,在这些信息中有个叫方法表的区域,该表包含有该类型所定义的所有方法的信息和指向这些方法实际代码的指针。

7. 以下逻辑表达式有什么问题?

s!””||s=null假设s是空字符串

第一个!后边是不是少了一个=号,否则s无法和””用!相连。通过题干,可能想表达的是应该把!=null的判断放在最前边,再把括号加上。

8. 阅读代码:

public class Test{

public static void changeStr(String str){

str="welcome";

}

public static void main(String[] args){

String str="1234";

changeStr(str);

System.out.println(str);

}

}

运行结果是:1234

String作为形式参数,其改变并不会影响到实际参数的值,因为重新赋值并不是在原来地址上做改变,而是把一个新的地址赋值给了新的str,对main方法中的值并不产生影响。

 

10、阅读代码,选择正确的输出:()

Object i=123;

System.out.println(i.getClass());

A. class java.lang.Object B.int C.class java.lang.Integer D.class[I

答案:C123是一个int类型,用Object接收,默认转成其包装类,而getClass获取的是他的字节码对象。

11、阅读代码,选择输出结果()

Object i=123;

String str=(String)i;

System.out.println(str);

A. 123 B.throw NullPointorExeception C. null D. throw ClassCastException

答案:Di本身是一个Integer类型的对象,无法通过强转的方式把一个Integer转成String.

12、为了区分重载多态中同名的不同方法,要求:

A.采用不同的参数列表B.返回值类型不同C.调用时用类名或对象名做前缀D。参数名不同

答案:A。方法的重载值的是一个类中可以存在多个同名的方法,但是 必须保证他们的参数个数或参数类型不同,与返回值无关。

13、下面是有关子类调用父类构造函数描述正确的是?

A. 子类定义了自己的构造函数,就不会调用父类的构造函数

B. 子类必须通过super关键字调用父类没有参数的构造函数

C. 如果子类的构造函数没有通过super调用父类的构造函数,那么子类会先调用父类不含参数的构造函数,再调用子类自己的构造函数,然后调用父类的构造函数。

D. 创建子类对象时,先调用子类自己的构造函数,然后调用父类的构造函数。

答案:C。这道题的答案都不太准确,通过排除法,只有C说的还比较合适。创建子类对象时,必须要调用先父类的构造方法,默认是调用父类的无参构造方法(有一个super可以不用写),也可以调用有参数的,需显示调用。C选项调用完子类的构造方法,就不用再调用一遍父类的构造方法了。

14、下面关于hashcode的描述哪些是不正确的?

A. 两个相等对象的hashcode值一定相等

B. 两个不想等的对象的hashcode值一定不同

C. 如果两个不想等对象的hashcode值总是不同的话,有助于提高程序性能

答案:B。两个相等的对象hashCode是一定相等的,两个不相等的对象HashCode也有可能相等,这个时候就需要在使用equals进行进一步的判断。

15、下面哪些类事项了java.util.List接口(多选)

A. java.util.LinkedList B. java.util.HashsetC.java.util.StackD.java.util.Vector

答案:AD.这两个类是直接实现了List接口的。而Stack类是Vector的子类,应该属于间接实现。

16、以下代码中,能编译通过的是?(多选)

A. StringBuffer sb1=abcd;

B. Boolean b=new Boolean(abcd);

C. Byte b=255;

D. Int x=0x1234;

E. Float f1=1.2

答案:BD.A选项需要使用构造方法赋值,B选项可以传一个String,如果字符串的内容不是True(不区分大小写),则该值就是false;C 选项超过了byte的范围。D选项是将一个十六进制数赋值给intE选项最后要加f 

17、阅读代码,写出输出结果:

Integer i1=new Integer(33);

Integer i2=new Integer(33);

System.out.println(i1==i2);

System.out.println(i1.equals(i2));

Integer i3=33

Integer i4=33;

System.out.println(i3==i4)

System.out.println(i3.equals(i4));

运行结果是:false truetrue

==比较的是地址值,equals比较的是值。第一条语句,由于new了两次所以是两个对象,地址值不同,而值相同。第三条语句比较有难度,当Integer的值落在-128~127之间时,如Integer i1 = 2; Integer i2 = 2;此时JVM首先检查是否已存在值为2Integer对象。如果是,则i2直接是引用已存在对象。超过了这个值,就会创建新的引用。题中是33没有超过127,随意会引用已存在的对象,所以最后一个是true

 

13. 写一个java类,实现对整数数组由大到小进行排序?

是排序么?题干不清楚

18、请简述操作系统的线程和进程的区别。

线程:进程中的一个执行单元,或者称为一个执行路径

进程:一个程序的运行就可以看做是一个进程,其实就是程序在内存中分配的那片空间

19、编程实现:给定两个字符串s1s2,要求判定s2是否能够被通过s1做循环移位得到的字符串,例如给定s1=AABCDs2=CDAA,返回true;给定s1=ABCDs2=ACBD,返回false.

String s1="AABCD";

        String s2="CDAA";

        if(s1.concat(s1).indexOf(s2)!=-1){

            System.out.println ("true");

        }else{

            System.out.println ("false");

        }

 

20、指出下列程序运行的结果

Public calss Example{

String str=new String(good);

Char[] ch={a,b,c};

Public static void main(String args[]){

Example ex=new Example();

Ex.change(ex.str,ex.ch);

System.out.println(ex.str+ and );

System.out.print(ex.ch);

}

}

这道题没有change方法,无法看出结果

21、编译和执行下面的代码:会发生什么事?答案:A;因为没有无参构造方法

class Test{

Test(int i){}

void printName(String name){

System.out.println(name);

}

public static void main(String[] args){

Test myClass=new Test();

myClass.printName(hello,i did not crasb!);

}

}

A. 8行发生编译错误

B. 2行发生编译错误

C. 正常编译但产生运行异常

D. 程序输出hello,i did not crasb!

 

22、阅读下面的代码片段:

FileOutputStream fos=new FileOupputStream(myFile.txt);

DataOutputStream dos=new DataOutputStream(fos);

dos.writeInt(9);

dos.writeDouble(4.20);

dos.close();

 

有多少8-bit字节写入到文件中? 答案:C;因为int4个字节,double8个字节

A.2 B.5 C.12 D.16

 

24、编译和执行下面的代码,会发生什么事?答案:首先会打印I was to try,最后会执行finally里面的,finally;所以最后会打印:I was to try,finally

try {

 System.out.print("I was to try");

 throw new RuntimeException();

 } catch (Exception e) {

 } finally {

 System.out.print(",finally");

 

A. 输出I was to try

B. 输出I was to try,finally

C. 出现编译器错误

D. 在执行时候扔出异常

 

25、如果编译和执行下面的代码,会发生什么事?答案:C,因为主线程和子线程谁先执行无法确定,当然可以使用join方法进行控制哪个线程先执行

public class ThreadTest{

Public static void main(String args[]){

Counter ct=new Counter();

ct.start();

System.out.println(The thread has bean started);

}

}

class Counter extends Thread{

protected void run(){

System.out.println(Hello);

}

}

 

A. The thread has bean started

Hello

B. Hello

The thread has bean started

C A,B中任意一个

 

26、Java程序出现OutOfMemoryError:unable to create new native thread 的原因可能有哪些?如何分析和解决?

答案:原因是创建过多thread引出的问题,JVM此时无法再创建出更多的线程。这里可以使用线程池进行优化,将用完的线程进行回收

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
majia

8 篇文章

作家榜 »

  1. majia 8 文章
  2. 刘娜娜 6 文章
  3. 在下选择隐性埋名 4 文章
  4. 上神白浅 3 文章
  5. 李家兴 2 文章
  6. 小马甲 2 文章
  7. 刘东鑫 1 文章
  8. 崔楷文 1 文章