vlambda博客
学习文章列表

Java基础常见笔试题总结

一个领悟,少走3年弯路!


以下是自己总结的一些Java常见的基础知识题,答案仅供参考,如有异议请指出。一直保持更新状态。


1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。


2.“static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。

Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。


3.是否可以在static环境中访问非static变量?

static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。


4.Java支持的数据类型有哪些?什么是自动拆装箱?

Java语言支持的8中基本数据类型是:

• byte

• short

• int

• long

• float

• double

• boolean

• char

自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。


5.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载O verloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。


一. Java基础部分

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同

2、说说&和&&的区别。

&和&&都可以用作逻辑与的运算符,&&为短路与,&不是短路与。

另外&可以做为整数的位运算符

例1:对于if(str != null&& !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。

例2:If(x==33 &++y>0) y会增长,If(x==33 && ++y>0)不会增长

3、在JAVA中如何跳出当前的多重嵌套循环?

1. Break + 标签

2. 使用多个条件判断

3. 使用方法的return

在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。例如,

ok: for (int i = 0; i < 10; i++) {

for (int j = 0; j < 10; j++) {

System.out.println("i=" + i + ",j=" + j);

if (j == 5)

break ok;

}

}

另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。

int arr[][] ={{1,2,3},{4,5,6,7},{9}};

boolean found = false;

for(int i=0;i<arr.length&& !found;i++) {

for(int j=0;j<arr[i].length;j++){

System.out.println("i=" + i + ",j=" + j);

if(arr[i][j] ==5) {

found = true;

break;

}

}

}

第三种,使用方法的return

private static int test() {

int count = 0;

for (int i = 0; i < 10; i++) {

for (int j = 0; j < 10; j++) {

count++;

System.out.println("i=" + i + ",j=" + j);

if (j == 5) {

return count;

}

}

}

return 0;

}

4、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

作用在byte, short, char, int, enum

封装类对象,其它基本数据类型及引用数据类型都不能做为case的条件

6、用最有效率的方法算出2乘以8等於几?

2 << 3

因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。

7、请设计一个一百亿的计算器

如果只是大整数运算,使用BigInteger就可以

如果有浮点数据参与去处,需要使用BigDecimal进行运算

Java中基本类型的浮点数运算是不精确的,需要使用BigDecimal运算,尤其是金融、会计方向的软件

8、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

引用变量不能重新赋值,但是引用指向的对象的内容可以变化

例1:final StringBuffer a=new StringBuffer("immutable");

a=new StringBuffer("");

有编译错

例2:

final StringBuffer a=new StringBuffer("immutable");

a.append(“123”);

正确

9、"=="和equals方法究竟有什么区别?

他们的区别主要存在在引用数据类型上

==可以两侧都为null,但equals左侧的引用指向的对象不能空,不然有NullPointerException

除非需要比较两个引用指向的对象是同一对象,一般都使用equals方法进行比较。尤其是String之类的值对象,另外,常量尽量放在比较的左侧

10、静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。

JVM知识

  1. 什么情况下会发生栈内存溢出。

  2. JVM的内存结构,Eden和Survivor比例。

  3. JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。

  4. JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数。

  5. 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。

  6. 垃圾回收算法的实现原理。

  7. 当出现了内存溢出,你怎么排错。

  8. JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。

  9. 简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。

  10. 讲讲JAVA的反射机制。

  11. 你们线上应用的JVM参数有哪些。


在这里我给大家整理了300道Java面试经典题型并附带答案 有需要的伙伴 可以查看下方图片自行免费领哦(仅限粉丝哦)