Java基础面试题(特别好记)

148 阅读16分钟

自己总结了下,预祝各位面试顺利~~~加油吖

1.面向对象有什么特征

抽象、继承、封装、多态

2.访问修饰符中public private protected 以及不写的区别

public 公共的最高 protected被保护的其他包访问不到,default只能同包能访问,private这个的话只能当前类访问

3.String是基本数据类型吗

不是,他是一种引用类型

4.float f=3.4是否正确

不正确,因为小数默认为double如果想要来float类型的一个数,需要后面加F,或者进行一个强转

5.short s1=1;s1=s1+1 有错吗short s1=1;s1+=1有错吗

这种题,其实注意一点,对于整数来说,默认的类型都是int,你想让s1是个short类型,所以第一个是错的,没有强转,对于第二个来说,+=默认已经进行强转了,所以是正确的

6.java中有没有goto

保留字,没发使用

7. int和Integer的区别

int是一个基本数据类型,但是为了当成一个对象进行操作就引入了Integer

8.&和&&的区别?

第二个是这样,短路与,只要第一个条件为false就不进行判断第二个条件了,提升了效率

9.内存中的栈、堆、方法区的用法

堆区

  • 存储的全部是对象,每个对象都包含一个与之对象的class的信息

  • jvm中只有一个堆区(head)被所有的线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区

  • 栈中保存基础数据类型和自定义对象的引用

  • 每个栈中的数据都是私有的,其他栈不能访问

  • 栈分为三个部分:基本类型的变量区、执行环境上下文、操作指令区

  • 由编译器自动分配释放,存放函数的参数值,局部变量的值等

静态区/方法区

  • 方法区又叫静态区,跟堆一样,被所有的线程共享,方法区中包含所有的class和static变量

  • 方法区中包含的都是整个程序中永远唯一的元素

  • 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的静态变量在相邻的另一块区域

10 Math.round(11.5)等于多少?Math.round(-11.5)等于多少

第一个是 12 第二个是 -11

11、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上

swith的条件表达式只能数据类型只能用int以前的,byteshortchar都是可以的,long肯定不行,后续Java7以后String也行

12.用效率最高的方式计算2乘以8

2<<3

13.数组中有没有length()方法,String有没有length()方法

数组中没有,有length属性,String有length()方法

14、在java中,如何跳出当前的多重嵌套循环

在最外层加一个标记A,然后break A,可以跳出多重循环

15.构造器可否被重写

不能被重写,只能被重载。因为不能被继承

16.两个对象值相同,但却可有不同的hashcode,这句话对不对?

不对,equals相等,比较的是对象地址,对象地址既然相同,他们的hashcode肯定是相等的

17.是否可以继承String类

String类是final类,不可以被继承

18.当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递

是值传递,java语言的方法调用只支持值传递。如果是一个对象,传递的是对该对象引用地址的值

19.String和StringBulider、StringBuffer的区别

1.可变与不可变

String是只读字符串,也就意味着String引用的字符串内容是不能被改变的,而StringBuffer/StringBulider类表示的字符串对象可以直接进行修改

2.是否线程安全

String是线程安全的

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的

StringBulider没有对方法加锁,所以是线程不安全的

StringBulider和Stringbuffer的共同点

StringBulider和StringBuffer都继承自AbstractStringBulider(抽象类)

如果程序不是多线程,那么使用StringBulider的效率要高于StringBuffer

如果是多线程得话,StringBuffer的安全性要高于StringBulider。

总结一下

String适用于少量字符串操作的情况

StringBulider:使用于单线程下字符缓冲区进行大量操作的情况

StringBuffer:适用于多线程下字符缓冲区进行大量操作的情况

对于运行速度而言:

StringBulider>Stringbuffer>String

20.重载和重写的区别

重载就是参数类型不一样,具体指的是 顺序个数类型,最简单的重载就是有参构造和无参构造,根本就和返回值类型就没关系,而重写呢,重写的话是对一个方法进行@Override,主要是方法的调用发生了变化,子类继承父类

21.描述一下JVM加载CLASS文件的原理机制

Classload类加载器来实现。

总体来说3个步骤:装载---链接---初始化

  • 装载,查找并加载类的二进制数据

  • 链接

    • 验证:确保被加载类的正确性

    • 准备:为类的静态变量分配内存,并将其初始化为默认值

    • 解析:把类中的符号引用转换为直接引用

  • 初始化:为类的静态变量赋予正确的初始值

22.char类型能不能存储一个中文汉字,为什么

char类型占2个字节,一个中文也是2个字节,所以是可以保存的,温习一下,byte一个字节short2个字节 int是4个字节 long 8个字节 float是4个字节,double是8个字节

23,抽象类和接口有什么区别?

A.成员的区别

抽象类:

构造方法:可以有

成员变量:可以有

成员方法:可以是抽象的,也可以是非抽象的

接口:

构造方法:没有

成员变量:只能是常量 默认修饰符是public static final

成员方法:

B.体现的理念不同

抽象类中定义的都是一个继承体系中的共性内容

接口是功能的集合,是一个体系额外的功能,是暴露出来的规则

C.你选择的接口和抽象类的依据是什么

接口和抽象类的概念是不一样的,接口是对动作的抽象,抽象类是对根源的抽象

抽象类表示的是:这个对象是什么,接口表示的是这个对象能做什么

24.Java中会存在内存泄漏吗,请简单描述

理论上因为有垃圾回收机制不会存在内存泄漏,但是实际开发中吗,还是可能遇到的,

25.抽象的方法是否可同时是静态的,是否可同时是本地方法native,是否同时被synchronized修饰

都不能,抽象方法需要子类重写,而静态方法是不能被重写的,因此二者是矛盾的,而本地方法是由本地代码C实现的,抽象方法是没有实现的,也是矛盾的,synchronized和方法的实现细节有关,而抽象方法不关注实现细节,也是矛盾的

26.阐述静态变量和实例变量的区别

静态变量指的是被Static修饰的对象,被多个对象共享,直接可以用,不用new对象

27.是否可以从一个静态的方法内部发出对非静态方法的调用

不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,但是此对象可能并没有被初始化

28.如何实现对象的clone

1.实现cloneable接口并重写Object类中的clone()方法

2.实现Serializablej接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆

29.GC是什么,为什么会有GC

垃圾回收,对于长时间不用的对象会进行自动回收

30.String s=new String(“xyz”)创建了几个字符串对象

创建了两个对象,一个是静态区的,另一个是new 创建在堆上的对象

31.接口是否可继承接口,抽象类是否可实现接口,抽闲类是否可继承具体的类

都可

32. 一个.java源文件是否可以包含多个类,有什么限制

可以,一个源文件中最多偶一个公开类

33.匿名内部类是否可以继承其他接口,是否可以实现接口

可以继承其他类和实现其他接口

34.内部类可以引用他的包含类的成员吗,有什么限制

一个内部类对象可以访问创建他的外部类对象的成员,包括私有成员

35.java中final关键字的作用

修饰类,表示该类不能被继承,修饰方法,表示方法不能被重写,修饰变量:表示变量只能以此赋值以后值不能被修改,是个常量

36.数据类型之间的转换

1.如何将字符串类型转换成基本数据类型

调用基本数据类型中对应的包装类的方法parseInteger(String)或者ValueOf(String)即可返回相应的基本类型

2.如何将基本数据类型转换成字符串

一种方法直接拼接用+,另一种方法:valueof()方法返回相应的字符串

37.日期和时间

1.如何获取年月日时分秒

public class DateTimeTest {    public static void main(String[] args) {        Calendar cal = Calendar.getInstance();        System.out.println(cal.get(Calendar.YEAR));        System.out.println(cal.get(Calendar.MONTH));        // 0 - 11        System.out.println(cal.get(Calendar.DATE));        System.out.println(cal.get(Calendar.HOUR_OF_DAY));        System.out.println(cal.get(Calendar.MINUTE));        System.out.println(cal.get(Calendar.SECOND));        // Java 8        LocalDateTime dt = LocalDateTime.now();        System.out.println(dt.getYear());        System.out.println(dt.getMonthValue());        // 1 - 12        System.out.println(dt.getDayOfMonth());        System.out.println(dt.getHour());        System.out.println(dt.getMinute());        System.out.println(dt.getSecond());    }}​

2.如何获取从1970年到现在的毫秒数

Calendar.getInstance().getTimeInMillis();System.currentTimeMillis();Clock.systemDefaultZone().millis();// Java 8

3.如何取得某月的最后一天?

Calendar time = Calendar.getInstance();time.getActualMaximum(Calendar.DAY_OF_MONTH

4.如何格式化日期

import java.text.SimpleDateFormat;import java.time.LocalDate;import java.time.format.DateTimeFormatter;import java.util.Date;class DateFormatTest {    public static void main(String[] args) {        SimpleDateFormat oldFormatter = new        SimpleDateFormat("yyyy/MM/dd");        Date date1 = new Date();        System.out.println(oldFormatter.format(date1));        // Java 8        DateTimeFormatter newFormatter =        DateTimeFormatter.ofPattern("yyyy/MM/dd");        LocalDate date2 = LocalDate.now();        System.out.println(date2.format(newFormatter));    }}

5.打印昨天的当时当刻

import java.util.Calendar;class YesterdayCurrent {    public static void main(String[] args){        Calendar cal = Calendar.getInstance();        cal.add(Calendar.DATE, -1);        System.out.println(cal.getTime());    }}

38.比较一下java和javaScript

解释和编译,java必须先编译,javascript则由浏览器解释执行

java采用的强类型变量检查,但是javascript使用的是弱类型检查

代码格式不一样

38.Error和Exception的区别

error比较严重的错误,exception是异常

39.try里有一个return语句,那么紧跟在这个try后的finally里的代码会不会执行,什么时候执行,是在return前还是后

会执行,在方法返回调用者之前执行

如果有finally,try的执行语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值

40.java中如何进行异常处理,关键字throws、throw、try、catch、finally分别如何使用?

throws会直接写在方法后面,抛出异常,throw则在方法体内直接抛出异常

41.运行时异常和受检异常有何异同

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示的是虚拟机的通常操作中可能遇到的异常,是一种常见的运行错误,受检异常跟陈谷运行的上下文环境有关

42.列出一些常见的异常

ArithmeticException算数异常

ClassCastExceptin类转换异常

lllegalArgumentException非法参数异常

IndexOutOfBoundsException下表越界异常

NullPointerException空指针异常

SecurityException安全异常

43.阐述final finally finalize的区别

final主要来修饰方法类变量 finally主要是捕捉异常的最后执行方法,finalize这个方法是由垃圾收集器在销毁对象时调用的

44.List Set Map是否继承自Collection接口

List和Set是继承Collection接口,Map不是

45.阐述ArrayList Vector LinkedList的存储性能和特性

ArrayList 和Vector都是使用数组的方式存储数据,所以,他们插入慢查询快

Vector的方法添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,LinkedList使用双向链表实现存储,按序号索引数据需要进行前向和后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

46. Collection和Collections的区别

collection是一个接口 他是Set和list等容器的父接口,Collections是一个工具类,搜索排序线程安全化等等的操作

47.List Map Set 三个接口存取元素时,各有什么特点

List根据索引来存取元素,可以有重复元素

Set不能存放重复元素(用对象的equals方法来区分元素是否重复)

Map保存键值对映射,映射关系可以是一对一或多对一。

48.TreeMap和TreeSet在排序时如何比较元素,Collections工具类中的sort()方法如何比较元素

TreeSet实现了Comparable接口,比较的话用ComparaTo()方法

根据键对元素进行排序

49.Thread类中的sleep方法和对象wait()方法都可以让线程暂停执行,他们有什么区别

sleep方法休眠,是先后才能类的静态方法,调用此方法会让当前先后才能暂停执行指定时间,将执行机会让给其他线程,但是对象中的锁依旧保持,休眠时间结束会自动恢复状态。wait是Object类的方法,线程暂停执行,导致当前线程放弃对象的锁,进入对象的等待池,只有调用对象的notify或者notifyAll时才能唤醒等待池中的线程进入等待池,如果线程获得对象的锁就可以进入就绪状态

简言之:sleep是休眠,自己会醒,wait是等待,只有等待notify或者notifyAll才能给她叫醒,比较矫情

50.线程中的sleep方法和yield方法有什么区别

yield 线程让步 使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。

sleep的话直接就是休眠,不考虑线程的优先级

51.当一个线程进入一个对象的synchronized方法A之后,其他线程是否可进入此对象的synchronized方法B?

不能,其他线程只能访问非同步方法,同步方法不能进入,锁已经被获取走了,其他先后才能肯定获取不到

52.请说出与先后才能同步以及线程调度相关的方法

  • wait():使一个先后才能处于等待状态,并且释放所持有的对象的锁

  • sleep():使一个正在运行的线程处于休眠状态,是一个静态方法,调用此方法要处理异常

  • notify():唤醒一个处于等待状态的线程,当然调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关

  • notifyAll():唤醒所有处于等待状态的线程,只有获得锁的线程才能进入就绪状态

53.编写多线程程序有几种实现方式

实现callable接口继承Thread类和实现Runnable接口,两种方式都要通过重写run()方法来定义线程的行为

54.synchronized关键字的用法

可以将对象和方法标记为同步,以实现对对象和方法的互斥访问,也可以来定义同步代码块

55. 举例说明同步和异步

正在写的数据以后可能被另一个线程读到,或者正在读的数据可能被另一个线程写过了,那么这些数据就必须进行同步保存,数据库中的排他锁就是最好的例子,当应用程序在对象调用上需要花费很长时间来执行方法,并且不希望程序等待方法返回时,就用异步编程,更有效率

典型的就是ajax,异步刷新技术,很常见

56.启动一个线程是调用run()还是start()方法

调用start()方法

57.什么是线程池

首先你要理解为什么创建线程池

因为创建和销毁对象是很费时间的,所以提高服务程序的效率的一个有效手段就是尽可能的减少创建和销毁对象的次数,特别是一些很耗资源的对象的创建和销毁,这也池化资源技术产生的原因

事先创建若干个可执行的线程放到一个容器中,需要时直接池中拿,用完再放进去,不用进行创建和销毁,这就减少了创建和销毁的开销

58.线程的结伴状态和状态之间的关系

运行状态 就绪状态 阻塞状态

59简述synchronized和lock的异同

Lock能完后才能synchronized所实现的所有功能,

区别在于。Lock有比Synchronized更精确的线程语义和更好的性能,而且不强制的要求一定要获得锁,sync会自动释放锁,而lock一定要求手工释放,并且最好在finally块中释放

60.java中如何实现序列化,有什么意义?

要实现序列化,需要实现Serializable接口,然后其实就是把对象变成流来进行传递

61.java中有几种类型的流

字节流和字符流

62.简述JDBC操作数据库的步骤

1.加载驱动class.forName

2.创建连接

3.创建语句

4.执行语句

5.处理结果

6.关闭连接

63.Statement和PreparedStatement有什么区别,哪个性能更好

  • preparedStatement预编译的,防止sql注入,减少sql编译错误

  • 性能比Statement要好,而且预编译的,下次再执行相同的语句会更快

64.使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能

提升更新数据的性能的话就用prepared语句来执行

65.在进行数据库编程时,连接池有什么作用

用空间换时间的策略,浪费空间存储连接,但节省了创建和释放连接的时间,降低了系统的开销

66.什么是Dao模式

数据对象 pojo 数据访问 mapper写sql

67.事务的ACID是指什么

原子性:要么都执行,要么都不执行

一致性:系统状态一致

隔离性:互不影响

持久性:会持久化的保存

脏读:A读取了B未提交的数据,B回滚了,A读的数据就是脏数据

不可重复读:事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了

68.JDBC中如何进行事务处理

硬编码

69.三次握手和四次挥手给解释解释

首先为什么是三次握手,而两次不可以,目的是服务端和客户端确认双方的接受和发送能力是否正常,主要是两个报文来进行测试,首先是SYN报文和ACK报文

三次握手

  • 第一次握手,客户端先来一下,向服务端发送一个SYN报文(服务端此时确认了一下客户端的发送能力和服务端的接收能力)

  • 第二次握手:服务器接到syn报文之后,会应答一个SYN+ACK报文(客户端确认了服务端的发送和客户端的接收能力是正常的,但是服务端不知道客户端接收报文是不是正常,所以要进行再次确认)

  • 第三次握手:客户端接收到SYN+ACK报文,会回应一个ACK报文(双方都确认对方的发送和接收能力都是正常的,就可以安心传数据了)

  • 服务器收到ACK报文之后,三次握手完成

    因此,需要进行三次握手才能确认双方的接收和发送能力是是否正常

    还有就是一个数据传递的问题,第一二次握手的过程中是不能传递数据的,第三次握手的时候可以传递数据

    四次挥手(目前不是太明白,面试过程中可以主要讲3次握手,挥手主要是一个断开tcp连接的确认,4次肯定也有4次的道理,3次肯定是不行的)