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.String、StringBuffer和StringBuilder区别?
String类采用利用final修饰的字符数组进行字符串保存,因此不可变。如果对String类型对象修改,需要新建对象,将老字符和新增加的字符一并存进去。
StringBuilder,采用无final修饰的字符数组进行保存,因此可变。但线程不安全。
StringBuffer,采用无final修饰的字符数组进行保存,可理解为实现线程安全的StringBuilder。
31.ssm分别代表什么?
Spring:Spring 是一个轻量级的控制反转( IoC)和面向切面( AOP )的容器框架。
Spring MVC:Spring MVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
MyBatis:MyBatis 是一个基于Java的持久层框架。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs映射成数据库中的记录。
32. ArrayList 和 LinkedList 的区别?
如果应用程序对数据有较多的随机访问,ArrayList对象要优于LinkedList对象;
如果应用程序有更多的插入或者删除操作,较少的随机访问,LinkedList对象要优于ArrayList对象;
33. springboot和springmvc的区别
联系:
Spring最初利用工厂模式(DI)和代理模式解耦应用组件,为了解耦开发了springmvc;而实际开发过程中,经常会使用到注解,程序的样板很多,于是开发了starter,这套就是springboot。
区别:
1.springboot是约定大于配置,可以简化spring的配置流程;springmvc是基于servlet的mvc框架,个人感觉少了model中的映射。
2.以前web应用要使用到tomat服务器启动,而springboot内置服务器容器,通过@SpringBootApplication中注解类中main函数启动即可。
34.数据库主键、外键和索引的区别?