1.Java三大特性
封装:把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口(get获取数据/set进行设值)
继承:从已有类得到信息创建新类的过程,子类继承父类(可继承父类的全部方法)
多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应
2.访问权限修饰符
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
3.Java八大基本数据类型
整数类型——byte,short,int,long
浮点类型——float,double
字符类型——char
boolean类型——其值只有true和false
4.是否可以继承String
String类是final类,不可以被继承,继承String本身就是一个错误行为
5.重载和重写
方法重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载:发生在一个类中,相同的方法名,参数却不同,则视为重载。
方法重载的规则:
- 方法名称必须相同
- 参数列表不同(个数不同、或类型不同、参数排列顺序不同)
- 方法返回类型可以相同也可以不同
重写: 需要有继承关系,发生在子类与父类之间,子类的方法必须与父类一致,方法体不同。
方法重写的规则:
- 方法名必须相同
- 参数列表必须相同
- 访问权限不能比父类中被重写的方法的访问权限更低
- 抛出的异常范围可以被缩小,但不能扩大
6.构造器
- 和类名相同
- 没有返回值
作用:
- 使用new关键字,本身就是在调用构造器
- 初始化对象的值
注意点:
- 定义有参构造之后,如果想使用无参构造,显示的定义一个无参构造
public class Application{
public static void main(String[] args){
//new 实例化一个对象
Person person = new Person("种田的");
System.out.println(person.name);
}
}
public class Person(){
//一个类即使什么都不写,他也会存在一个构造器
String name;
//这就是一个构造器
//实例化对象 初始值
public Person(){
// this.name="种田的";
}
//有参构造
public Person(String name){
this.name = name;
}
}
7.抽象类和接口的区别
抽象类(abstract) | 接口(interface) |
抽象类可以定义构造器 | 接口不能定义构造器 |
可以有抽象方法和具体方法 | 方法全部是抽象方法 |
抽象类可以包含静态方法 | 接口中不能有静态方法 |
成员可以是public 默认 protected public | 接口都是public |
一个类只能继承一个抽象类 | 一个类可以实现多个接口 |
抽象类只能单继承 | 接口之间可以多继承 |
相同点:
- 不能够实例化(没有构造方法)
- 可以将抽象类和接口作为引用类型
8.静态变量和实例变量的区别
静态变量: 是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝。
实例变量: 必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。
9.==和equals的区别
equals 和== 最大的区别是一个是方法一个是运算符。
==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
equals():用来比较方法两个对象的内容是否相等。
注意:equals 方法不能用于基本数据类型的变量,如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址。
10.break和continue的区别?
break 和 continue 都是用来控制循环的语句。
break 用于完全结束一个循环,跳出循环体执行循环后面的语句。
continue 用于跳过本次循环,执行下次循环。
11.常见的RuntimeException
- java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
- java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。
- java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
- java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生。
- java.lang.IllegalArgumentException 方法传递参数错误。
- java.lang.ClassCastException 数据类型转换异常。
- java.lang.NoClassDefFoundException 未找到类定义错误。
- SQLException SQL 异常,常见于操作数据库时的SQL 语句错误。
- java.lang.InstantiationException 实例化异常。
- java.lang.NoSuchMethodException 方法不存在异常。
12.throw和throws的区别
throw:语句用在方法体内,执行 throw 一定是抛出了某种异常。
throws:语句是用在方法声明后面,表示出现异常的一种可能性,并不一定会发生这种异常。
13.final、finally、finalize的区别?
-
final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
-
finally:异常处理语句结构的一部分,表示总是执行。
-
finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,解决内存溢出。
14.String、StringBuilder、StringBuffer的区别?
- String 是只读字符串,也就意味着String 引用的字符串内容是不能被改变的。
- StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。
- StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比StringBuffer 要高。
- 但是StringBuffer是线程安全的(对调用方法加入同步锁)StringBuilder:是线程不安全的。
15.如何格式化日期
Java 8 中可以用 java.time.format.DateTimeFormatter 来格式化时间日期
DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
16.Java中几种类型的流
按照流的方向:输入流(inputStream)和输出流(outputStream)。
按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)
按照处理数据的单位: 字节流和字符流。字节流继承于 InputStream 和 OutputStream, 字符流继承于InputStreamReader 和OutputStreamWriter。
17.java集合 List和Map、Set
List 和 Set 是存储单列数据的集合,
Map 是存储键和值这样的双列数据的集合;
List 中存储的数据是有顺序,并且允许重复;Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的,Set 中存储的数据是无序的,且不允许有重复。
实现类
List 接口有三个实现类
- ArrayList 基于动态数组的数据结构 查找快,但不便于插入删除
- LinkList 基于链表的数据结构,链表增删快,查找慢
-
Vector:基于数组实现,线程安全的,效率低
Map 接口实现类
- HashMap:非线程安全,高效,支持 null 值和 null 键
- HashTable :线程安全,低效,不支持 null 值和 null 键
Set 接口有两个实现类
HashSet:底层是由 HashMap 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hashCode()方法;
LinkedHashSet:继承与 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMp。
18.设计模式
-
单例模式
-
工厂设计模式
-
建造者模式
-
适配器设计模式
19. 原生JDBC操作数据库流程
第一步:Class.forName()加载数据库连接驱动;
第二步:DriverManager.getConnection()获取数据连接对象;
第三步:根据SQL 获取 sql 会话对象,有 2 种方式 Statement、PreparedStatement ;
第四步:执行SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX();
第五步:关闭结果集、关闭会话、关闭连接。
20.http常见的状态码
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
404 Not Found //请求资源不存在,eg:输入了错误的 UR
500 Internal Server Error //服务器发生不可预期的错误
21.Get和Post的区别
GET 请求的数据会附在URL 之后(就是把数据放置在 HTTP 协议头中)
POST 把提交的数据则放置在是 HTTP 包的包体中
22.重定向和转发的区别?
本质区别:转发是服务器行为,重定向是客户端行为。
重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会丢失。
请求转发特点:一次强求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会丢失。
23.Cookie和Session的区别
cookie数据保存在客户端,session数据保存在服务端。
SpringMVC
SpringMVC工作流程
- 用户发送出请求到前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
- HandlerMapping找到具体的控制器(可查找xml配置或注解配置),生成处理器对象的执行链(如果有),再一起返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter(处理器适配器)。
- HandlerAdapter经过适配调用具体的处理器(controller)。
- Controller执行完成返回ModelAndView对象。
- HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
- ViewReslover解析后返回具体View(视图)。
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户。
SpringMVC常用注解
- @requestMapping 用于请求 url 映射。
- @RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
-
@ResponseBody 注解实现将 controller 方法返回对象转化为 json 响应给客户。
Spring
Spring 是一个开源框架,它有两大特性IOC(控制反转)和AOP(面向切面编程)
IOC:帮助我们创建对象,我们不用手动new创建对象,spring容器会帮我们去创建对象进行实例化,我们可以直接在spring容器里面去取。负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。
AOP:将安全,事务等于程序逻辑相对独立的功能抽取出来,利用spring的配置文件将这些功能插进去,提高了复用性
不同类型的IOC注入方式:
- Set 注入
- 构造器注入
- 静态工厂的方法注入
- 实例工厂的方法注入
mybatis
mybatis中#和$的区别?
#:能防止sql注入
$:不能防止sql注入
#比$更为安全,一般情况下能使用#就不使用$
mybatis的编程步骤是什么样的?
1、创建 SqlSessionFactory
2、通过 SqlSessionFactory 创建 SqlSession
3、通过sqlsession 执行数据库操作
4、调用session.commit()提交事务
5、调用session.close()关闭会话
mybatis一级缓存与二级缓存
一级缓存: 一级缓存是mybatis默认就帮我们开启的,我们不需要多做配置,它是基于SqlSession实现的,作用域为 sqlsession,不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。
二级缓存:二级缓存是默认是没有开启的,二级缓存基于Mapper实现,(多个SqlSession可以共用二级缓存,跨SqlSession的)缓存,它可以提高对数据库查询的效率,以提高应用的性能。多个SqlSession去操作同一个Mapper的sql语句,。二级缓存开启后,同一个namespace下的所有操作语句,都影响着同一个Cache, 当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
开启二级缓存:
A.mybatis.xml配置文件中加入:
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
在需要开启二级缓存的mapper.xml中加入caceh标签
<cache/>
Redis
缓存(Cache)的作用是减少服务器对数据源的访问频率,从而提高数据库的稳定
访问流程:
新技术的一个了解:
消息队列ActiveMQ
集成模式的开源服务器,消息队列是在消息传输的过程中保存消息的容器。
Dubbo
Dubbo是一个分布式服务框架,高性能高可用性。
Nginx
反向代理,就是可以将你的访问域名变成本地虚拟机的一个ip
ZooKeeper
ZooKeeper 是一个开源的分布式协调服务。
ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
Zookeeper 保证了如下分布式一致性特性:
(1)顺序一致性
(2)原子性
(3)单一视图
(4)可靠性
(5)实时性(最终一致性)