java面试之基础(面试必看)

面试是进入一家公司的门槛,每一个求职者都需要经历,但是最苦逼最头疼的就是面试题,我帮大家整理了一些java基础部分的面试题,希望对你们有所帮助。整理不易,感谢支持!

java基础面试题

  • 1.jre,jdk,jvm之间的区别是什么?
  • 2.Java中一个char类型是否可以存储一个汉字?
  • 3.Java的数据类型?
  • 4.自动类型转换规则是什么?
  • 5.运算符优先级顺序是什么?
  • 6.if和switch选择结构的区别是什么?
  • 7.While循环和do while循环的区别是什么?
  • 8.break和continue的区别?
  • 9.数组使用的步骤?
  • 10.类和对象的关系?
  • 11.类的开发步骤是什么?
  • 12.局部变量和成员变量的区别是什么?
  • 13.静态变量和实例变量的区别?
  • 14.String类可以被继承吗?
  • 15.String类中常用的方法都有哪些?
  • 16.String、StringBuffer、StringBuilder之间的区别?
  • 17.你对面向对象4大特性的理解?
  • 18.方法的重载和重写的区别是什么?(方法的重载是发生在一个类里面的,方法的重写是发生在父子类之间的)
  • 19.public、protected、private、默认的(缺省friendly)之间的区别是什么?
  • 20.多重继承下初始化顺序是什么?
  • 21.使用运行时多态开发的思路是什么?
  • 22.类中向上转型和向下转型的区别是什么?
  • 23.接口和抽象类的区别?
  • 24.java中常见的异常类型?
  • 25.多重异常编写的注意事项?
  • 26.Error和Exception的区别?
  • 27.检查型Exception和运行时Exception的区别?
  • 28.Final、Finally、Finalize的区别?
  • 29.Throw和Throws的区别?
  • 30.什么是装箱和拆箱,包装类的应用场景?
  • 31.List、Set、Map的区别?
  • 32.ArrayList、LinkedList的区别?
  • 33.如果一个HashMap存放有很多值,但是在不知道KEY是什么的情况下,如何遍历出所有的KEY和VALUE?
  • 34.进程和线程的区别?
  • 35.线程的实现方式有哪几种?
  • 36.多线程中调用start方法和run方法的区别?
  • 37.多线程中的问题?
  • 38.HashTable与HashMap的区别?
  • 39.Join和yield的区别?
  • 40.线程的状态?
  • 41.获取Class对象的三种方法是什么?
  • 42.什么是反射?
  • 43.工厂模式和单例模式?

1.jre,jdk,jvm之间的区别是什么?

JVM :英文名称(Java Virtual Machine),就是我们都知道的 Java 虚拟机。它只认识 xxx.class 这种类型的文件。
JRE :英文名称(Java Runtime Environment),我们叫它Java运行环境,包括Java虚拟机和Java程序所需的核心类库等。如果想要运行一个开发好的Java程序,计算机只需要安装JRE即可。
JDK :英文名称(Java Development Kit),JDK是提供给Java考法人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就不用了在单独安装JRE了。其中的开发工具:编译工具(javac.exe)、打包工具(jar.exe)等。
简单来说:JDK>JRE>JVM,使用JDK开发完成的Java程序,交给JRE去运行。

2.Java中一个char类型是否可以存储一个汉字?

java采用unicode,2个字节(16位)来表示一个字符, 无论是汉字还是数字字母,或其他语言,char 在java中是2个字节。所以可以存储中文。

3.Java的数据类型?

java面试之基础(面试必看)_第1张图片

4.自动类型转换规则是什么?

规则1:如果一个操作数为double型,则整个表达式可提升为double型
规则2:满足自动类型转换的条件
两种类型要兼容
数值类型(整型和浮点型)互相兼容
目标类型大于源类型
例如:double 型大于 int 型

5.运算符优先级顺序是什么?

算术运算符>关系运算符>逻辑运算符
!> 算数运算符 > 比较运算符 > && > ||

6.if和switch选择结构的区别是什么?

a.相同点
都是用来处理多分支条件的结构
b.不同点
switch选择结构只能处理等值条件判断的情况
多重if选择结构适合某个变量处于某个连续区间时的情况

7.While循环和do while循环的区别是什么?

a.执行次序不同
While 先判断再执行
Do while 先执行再判断
b.初始情况不满足循环条件时
While循环一次都不会执行
Do while循环至少执行一次

8.break和continue的区别?

a.使用场合
break常用于switch结构和循环结构中
continue一般用于循环结构中
b.作用(循环结构中)
Break语句终止本层循环,程序跳转到循环块外的下一条语句
Continue跳出本次循环,进入下一次循环

9.数组使用的步骤?

1.声明
2.分配空间
3.赋值(边声明边赋值;动态从键盘录入信息赋值)
4.处理数据

10.类和对象的关系?

1.类是一个抽象的概念,它不存在于现实中的时间/空间里,类只是为所有的对象定义了抽象的属性与行为。
2.对象是类的一个具体。它是一个实实在在存在的东西。
*简单来说:类是对象的模板,对象是类的实例化。

11.类的开发步骤是什么?

1.发现类(定义类)
2.编写属性
3.编写方法
4. 使用属性和方法

12.局部变量和成员变量的区别是什么?

a. 作用域不同
成员变量作用在整个类内都是可见的;局部变量仅限于它定义的方法内。
b. 初始值不同
会为成员变量赋初值;不会给局部变量赋初值。
c.优先级不同
在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级。
d.声明位置
成员变量类内方法外,局部变量在方法内

13.静态变量和实例变量的区别?

a.静态变量是被 static 修饰符修饰的变量,在内存中只有一个内存空间,在加载类的过程中完成静态变量的内存分配,可以直接通过(类名.)来访问。
b.实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它,每创建一个实例对象,就会为实例变量分配不同的内存,各个对象访问自己的实例变量。
c.无论创建了一个类的多少个对象,静态变量只初始化一次,所有的实例都可以访问此静态变量,而且可以通过类名直接访问。

14.String类可以被继承吗?

不可以。String 类是由final修饰的,所以不可以被继承。

15.String类中常用的方法都有哪些?

获得字符串的长度:length()
比较字符串:equals()
连接字符串:concat()
提取字符串:substring()
搜索字符串:indexOf()
拆分字符串:split()
忽略字符串大小写:equalsIgnoreCase()
将所有英文字符转换为小写字母:toLowerCase()
将所有英文字符转换为大写字母:toUpperCase( )
去空格:trim()

16.String、StringBuffer、StringBuilder之间的区别?

String:适用于少量的字符串操作的情况
StringBuilder:线程不安全,适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:线程安全,效率低适用多线程下在字符缓冲区进行大量操作的情况
(操作就是对字符串的拼接)JDBC中拼接sql

17.你对面向对象4大特性的理解?

封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。(减少代码冗余)
继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

18.方法的重载和重写的区别是什么?(方法的重载是发生在一个类里面的,方法的重写是发生在父子类之间的)

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载; 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。
方法重载的规则
1.方法名一致,参数列表中参数的顺序,类型,个数不同。
2.重载与方法的返回值无关,发生在一个类里面的。
3.可以抛出不同的异常,可以有不同修饰符。
方法重写的规则
1.参数列表、返回类型必须完全与被重写方法的一致。
2.构造方法不能被重写,声明为 final 的方法不能被重写,声明为 static 的方法不能被重写,但是能够被再次声明。
3. 发生在父子类之间的,访问权限子类不能严于父类。

19.public、protected、private、默认的(缺省friendly)之间的区别是什么?

java面试之基础(面试必看)_第2张图片

20.多重继承下初始化顺序是什么?

先父类后子类,先属性后构造方法。

21.使用运行时多态开发的思路是什么?

a.编写父类
b.编写子类,子类重写父类方法
c.运行时,使用父类的类型,子类的对象
向上转型 Pet pet = new Dog();

22.类中向上转型和向下转型的区别是什么?

向下转型:父类转换为子类(使用instanceof强制类型转换)(对象 instanceof 类或接口)
向上转型:子类转换为父类(自动进行类型转换)使用父类的类型,子类的对象

23.接口和抽象类的区别?

区别1:语法方面
1.继承实现方面((抽象类单继承,接口多实现)接口也可以继承其他接口)
2.成员变量方面
①.抽象类中可以有普通成员变量,接口中没有普通成员变量
②.抽象类和接口中都可以包含静态成员变量
3.方法方面
①.抽象类可以有构造方法,接口中不能有构造方法。
②.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
③.抽象类中的抽象方法的访问类型可以是public,protected默认类型 , 但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
④.抽象类中可以包含静态方法,接口中不能包含静态方法。
区别2:概念方面
抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,"has-a"的关系。
接口在设计时要注意稳定性,不能随意改动方法的参数和返回值。
区别3:设计方面
抽象层次不同,抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

24.java中常见的异常类型?

java面试之基础(面试必看)_第3张图片

25.多重异常编写的注意事项?

a.排列catch语句的顺序:先子类后父类
b.发生异常时按顺序逐个匹配
c.只执行第一个与异常类型匹配的catch语句
(不要“吃异常”,父类兜底)
在catch中要输出异常信息和打印异常发生的堆栈信息,如果没有输出,则会造成异常发生了,但因为没有相关错误信息的输出,不知道异常发生的情况。这种情况简称“吃异常”。

26.Error和Exception的区别?

Error 类和 Exception 类的父类都是 Throwable 类,他们的区别如下:
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

27.检查型Exception和运行时Exception的区别?

运行时异常(Runtime Exception)编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。(bug的来源,出现运行时异常要排查)(父类RunTimeException)
受检查的异常(Checked Exception)要么用 try。。。catch 捕获,要么用 throws 字句声明抛出,交给它的父类处理,否则编译不会通过。(父类Exception)

28.Final、Finally、Finalize的区别?

final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally:异常处理语句结构的一部分,表示总是执行。
finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。这是一个被动的方法(其实就是回调方法),不需要我们调用。

29.Throw和Throws的区别?

Throw
a.语句用在方法体内,表示抛出异常,由方法体内的语句处理。
b.是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。
Throws
a.是声明异常语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
b.主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
c. 表示出现异常的一种可能性,并不一定会发生这种异常

30.什么是装箱和拆箱,包装类的应用场景?

拆箱——包装类的变量可以被赋值为一个基本类型
装箱——基本类型的变量可以被赋值为一个包装类
包装类的应用场景
主要应用在集合类中.(集合不允许存放基础数据类型,存放数字时,要用到包装类型)
包装类的作用
a、集合不允许存放基础数据类型,存放数字时,要用包装类型;
b、包装类提供一系列实用的方法

31.List、Set、Map的区别?

①.List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合;
②.List 中存储的数据是有顺序,并且允许重复;
③.Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。
④.Set 中存储的数据是无序的,且不允许有重复,但元素在集合中的位置由元素的hashcode决定,位置是固定的(Set集合根据hashcode来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)

32.ArrayList、LinkedList的区别?

ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。
LinkedList采用链表存储方式。插入、删除元素时效率比较高。

33.如果一个HashMap存放有很多值,但是在不知道KEY是什么的情况下,如何遍历出所有的KEY和VALUE?

java面试之基础(面试必看)_第4张图片
获取Iterator :Collection 接口的iterator()方法
* Iterator的方法
* boolean hasNext(): 判断是否存在另一个可访问的元素
* Object next(): 返回要访问的下一个元素
entrySet(),返回此映射中包含的映射关系(键-值)
getKey()方法得到key;getValue()方法得到value
keySet(),返回键集
取出所有key的集合、获取Iterator对象、取出key、根据key取出对应的值

34.进程和线程的区别?

进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。
线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程。
进程包含了线程,线程必须属于某个进程,进程中的多个线程共享进程的内存,二者之间是一对多的关系。

35.线程的实现方式有哪几种?

①.继承Thread类
特点:编写简单,可直接操作线程;适用于单继承
②.实现Runnable接口
特点:避免单继承局限性;便于共享资源
③.编写callable实现类
特点:需要实现call()方法,call方法与run方法不同,call有返回值.

36.多线程中调用start方法和run方法的区别?

调用run()方法:只有主线程一条执行路径;不启动新线程(普通方法调用)。
调用start()方法:多条执行路径,主线程和子线程并行交替执行;启动一个线程。
调用start方法就是线程启动,调用后线程进入了就绪状态,
Run方法编写了线程要实现的功能,一般不直接调用,由系统来调用,如果调用就是普通的方法调用。

37.多线程中的问题?

何时用到多线程开发
①.程序需要同时执行两个或多个任务。例如:手机淘宝中"我的界面"的后台程序,开启多个线程从不同系统获取数据,组合发给前端APP。
②.程序需要实现一些需要等待的任务,例如:导出过大的Excel文件。
③.需要一些后台运行的程序,例如:Java垃圾回收器程序。
线程安全几点注意
1、出现线程安全问题:当多线程有共享数据的时候,由于一个线程对共享数据的操作尚未完成,其它线程就参与进来,于是就产生了数据篡改的问题。
2、如何解决线程安全的问题:要保证一个线程操作共享数据的时候,其它线程必须在外边等候,直到操作共享数据的线程执行完,其它线程才可以操作共享数据。
3、同步方法的锁就是当前对象this,同步代码块需要指定锁对象(必须保证唯一);相比较而言,同步代码块能够更加精准地控制所要管理的代码。
另:调试多线程的排查手段是多输出日志,不再是Debug,使用log4j来输出中间处理结果,来进行问题的排查。

38.HashTable与HashMap的区别?

都是实现Map接口,Hashtable继承Dictionary类,Hashmap继承AbstractMap类
Hashtable是线程安全的,效率低,键和值都不允许为空。
Hashmap是非线程安全的,效率高,键和值都允许为空。
Hashtable为什么效率低就是线程安全的:
线程安全是以牺牲效率为代价的,Hashtable是synchronized(一种同步锁,用来共享数据,一次仅有一个线程能够访问共享数据)的,所以线程安全,多个线程访问时不需要为他自己的方法实现同步。

39.Join和yield的区别?

Yield:(礼让)当前线程贡献出对CPU的使用权,但是当前线程还是有可能再次获得CPU的使用权。
Join:当出现该方法时,暂停当前线程,执行其他进程,等待其他线程执行完后再执行暂停的进程。

40.线程的状态?

java面试之基础(面试必看)_第5张图片
线程的状态
线程在一定条件下,状态会发生变化。线程一共有以下几种状态:
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
阻塞的情况分三种:
(1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。
(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

41.获取Class对象的三种方法是什么?

第1种方式:
没有new,根据类的class属性来获取Class对象(类名.class)
第2种方式
在new的情况下通过对象.getClass()方法来获取Class对象
第3种方式
通过Class.forName(“包名+类名”)方法来获取Class对象

42.什么是反射?

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
反射(Reflection)机制
能够动态获取类的信息以及动态调用对象的方法。
反射机制主要提供以下功能
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
对反射的理解:
1、平时我们创建对象的时候,都是通过New某某类来创建的,但是通过反射技术,我们可以通过Class.forName(类的全路径)来创建实例,例如:加载JDBC驱动的时候,就是采用反射技术。
2、反射在平时开发中主要应用于框架层的开发,例如Spring框架内部就采用了反射技术来创建实例。

43.工厂模式和单例模式?

单例模式:应用该模式的类一个类只能有一个实例。它必须自行创建这个实例,必须自行向整个系统提供这个实例。从具体实现角度来说:一是单例模式的类只提供私有的构造函数;二是类定义中含有一个该类的静态对象私有对象;三是该类提供了一个静态的公有函数用于创建或获取它本身的静态私有对象。
工厂模式:就简单说,对象的创建由传统的自身创建交付给一个工厂类创建,然后自身通过工厂类的工厂方法获得对象即可,适用场景是对象的创建步骤繁琐,过程比较复杂。
工厂模式和单例模式的区别
区别1:工厂模式可以创建不同种类的对象实例,单例模式只能创建一种的对象实例;
区别2:工厂模式创建的对象实例在内存中没有只能创建一份的要求,单例模式创建的对象实例在内存中只有一份。

你可能感兴趣的:(java面试之基础(面试必看))