Java面试题整理自用

Java基础

1.Java的三大基础特性?(面向对象的三大特性?)

继承、封装、多态

一.继承:继承是从已有类得到继承信息创建新类的过程。

二.封装:封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口

三.多态:不同对象调用相同方法即使参数也相同,最终表现行为是不一样的。

2.JDK和JRE的区别是什么?

1. JDK:Java开发工具包(Java Development Kit),提供了Java的开发环境和运行环境。

2. JRE:Java运行环境(Java Runtime Environment),提供了Java运行所需的环境。

JDK包含了JRE。如果只运行Java程序,安装JRE即可。要编写Java程序需安装JDK.

3.java的基础数据类型有哪些?什么是自动装箱拆箱?

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

byte: 占用1个字节,取值范围-128 ~ 127

short: 占用2个字节,取值范围-2^15^ ~ 2^15^-1

int:占用4个字节,取值范围-2^31^ ~ 2^31^-1

long:占用8个字节

float:占用4个字节

double:占用8个字节

char: 占用2个字节

boolean:占用大小根据实现虚拟机不同有所差异

装箱就是自动将基本数据类型转换为包装器类型,拆箱就是自动将包装器类型转换为基本数据类型

4. 简述Java访问修饰符

default: 默认访问修饰符,在同一包内可见

private: 在同一类内可见,不能修饰类

protected : 对同一包内的类和所有子类可见,不能修饰类

public: 对所有类可见

5. 接口和抽象类的区别是什么?

抽象类:体现的是is-a的关系,如对于man is a person,就可以将person定义为抽象类。

接口:体现的是can的关系。是作为模板实现的。如设置接口fly,plane类和bird类均可实现该接口。

一个类只能继承一个抽象类,但可以实现多个接口。

6. final、finally和finalize的区别是什么?

final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。

finally作为异常处理的一部分,只能在try/catch语句中使用,finally附带一个语句块用来表示这个语句最终一定被执行,经常被用在需要释放资源的情况下。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法。当垃圾回收器准备好释放对象占用空间时,首先会调用finalize()方法,并在下一次垃圾回收动作发生时真正回收对象占用的内存。

7. String s = null ; 和 String s = "" ; 之间的区别

string s = null; 表示一个空串,没有占用了空间,不在内存中开辟空间

string s = "";在内存中开辟空间,但空间中没有值(""也是一个字符串),表示一个空串,被实列化了,占用了内存空间

Java线程

8. 进程和线程的区别是什么?

进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

9. 创建线程有几种不同的方式?

有三种方式可以用来创建线程:

继承Thread类

实现Runnable接口

实现Callable接口

应用程序可以使用Executor框架来创建线程池

10. 并发编程的三要素

原子性:原子是不可再分割的最小单元,原子性是指一个或多个操作要么全部执行成功,要么全部执行失败。

可见性:一个线程对共享变量的修改,另一个线程能看到(synchronized,volatile)

有序性:程序的执行顺序按照代码的先后顺序

反射

11. 什么是反射?

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

12. 动态代理是什么?

动态代理是一种创建java对象的能力,让你不用创建JD类,就能创建代理类对象。

动态代理使用java反射包中的类和接口实现动态代理的功能。

动态代理使用到的三个类:反射包 java.lang.reflect , 里面有三个类:InvocationHandler , Method, Proxy.

异常

13. throw 和 throws 的区别?

throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。

14. 异常处理的时候,finally代码块的重要性是什么?

无论是否抛出异常,finally代码块总是会被执行。就算是没有catch语句同时又抛出异常的情况下,finally代码块仍然会被执行。

容器

15. Array 和 ArrayList 有何区别?

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

Array大小是固定的,ArrayList的大小是动态变化的。

ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

16. ArrayList 、Vector和 LinkedList 的区别是什么?

ArrayList、Vector和LinkedList都是可伸缩的数组,即可以动态改变长度的数组。

ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的空间来存储,支持下标、索引访问。但在涉及插入元素时可能需要移动容器中的元素,插入效率较低。当存储元素超过容器的初始化容量大小,ArrayList与Vector均会进行扩容。

Vector是线程安全的,其大部分方法是直接或间接同步的。ArrayList不是线程安全的,其方法不具有同步性质。LinkedList也不是线程安全的。

LinkedList采用双向列表实现,对数据索引需要从头开始遍历,因此随机访问效率较低,但在插入元素的时候不需要对数据进行移动,插入效率较高。

Java Web

17. 什么是Servlet?

Servlet是用来处理客户端请求并产生动态网页内容的Java类。Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。

18. doGet()方法和doPost()方法有什么区别?

doGet:GET方法会把名值对追加在请求的URL后面。因为URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种方式传递。

doPOST:POST方法通过把请求参数值放在请求体中来克服GET方法的限制,因此,可以发送的参数的数目是没有限制的。最后,通过POST请求传递的敏感信息对外部客户端是不可见的。

19. HTTP响应的结构是怎么样的?

HTTP响应由三个部分组成:

状态码(Status Code):描述了响应的状态。可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。如果Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK。

HTTP头部(HTTP Header):它们包含了更多关于响应的信息。比如:头部可以指定认为响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式。如何在Serlet中检索HTTP的头部看这里。

主体(Body):它包含了响应的内容。它可以包含HTML代码,图片,等等。主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的。

Spring / Spring MVC

20.什么是MVC?

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。

View(视图) - 视图代表模型包含的数据的可视化。

Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

21.什么是AOP?

AOP(Aspect Oriented Programming),即面向切面编程。它通过消除代码纠缠和交叉问题,在我们的项目中支持面向方面的模块化。AOP允许您准确定义要集成您定义的特定方面的位置。

22.什么是IOC?

控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。

通俗的讲就是给你提供一个容器,你可去直接获取你想要的,不不需要进行中间的步骤了

23. 说一下 spring mvc 运行流程?

快速记忆:核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回

Spring Boot / Spring Cloud

24. 什么是 spring boot?

Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用。简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架 。

25. spring boot 核心配置文件是什么?

SpringBoot使用的是全局配置文件,配置文件的名称是固定的,但是有两种文件格式:

application.properties(默认)

application.yml (推荐)

Mybatis

26. mybatis 中 #{}和 ${}的区别是什么?

mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。

mybatis在处理${}时,就是把${}替换成变量的值。

使用#{}可以有效的防止SQL注入,提高系统安全性。原因在于:预编译机制。

数据库

27.数据库的内连接、左连接、右连接有什么区别?

内连接: 只连接匹配的行

左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行

右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行

28. 什么是索引?

数据库索引,是数据库管理系统中一个排序的数据结构,索引的实现通常使用B树及其变种B+树。

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

后续补充或修改

29你知道的容器有哪些

List,Map,Set Collection List LinkedList ArrayList Vector Stack Set

Map Hashtable HashMap WeakHashMap

30.StringStringBufferStringBuilder区别?

String类采用利用final修饰的字符数组进行字符串保存,因此不可变。如果对String类型对象修改,需要新建对象,将老字符和新增加的字符一并存进去。

StringBuilder,采用无final修饰的字符数组进行保存,因此可变。但线程不安全。

StringBuffer,采用无final修饰的字符数组进行保存,可理解为实现线程安全的StringBuilder

31.ssm分别代表什么

SpringSpring 是一个轻量级的控制反转( IoC)和面向切面( AOP )的容器框架。

Spring MVCSpring MVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

MyBatisMyBatis 是一个基于Java的持久层框架。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和JavaPOJOs映射成数据库中的记录。

32. ArrayList LinkedList 的区别?

如果应用程序对数据有较多的随机访问,ArrayList对象要优于LinkedList对象;

如果应用程序有更多的插入或者删除操作,较少的随机访问,LinkedList对象要优于ArrayList对象;

33. springbootspringmvc的区别

联系:

Spring最初利用工厂模式(DI)和代理模式解耦应用组件,为了解耦开发了springmvc;而实际开发过程中,经常会使用到注解,程序的样板很多,于是开发了starter,这套就是springboot。

区别:

1.springboot是约定大于配置,可以简化spring的配置流程;springmvc是基于servlet的mvc框架,个人感觉少了model中的映射。

2.以前web应用要使用到tomat服务器启动,而springboot内置服务器容器,通过@SpringBootApplication中注解类中main函数启动即可。

34.数据库主键、外键和索引的区别?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值