Java面试(作者亲身经历 一个毕业生的多次面试总结)送给刚出校门找工作的你

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.重载和重写

方法重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

重载:发生在一个类中,相同的方法名,参数却不同,则视为重载。

方法重载的规则:

  1. 方法名称必须相同
  2. 参数列表不同(个数不同、或类型不同、参数排列顺序不同)
  3. 方法返回类型可以相同也可以不同

重写: 需要有继承关系,发生在子类与父类之间,子类的方法必须与父类一致,方法体不同。

方法重写的规则:

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 访问权限不能比父类中被重写的方法的访问权限更低
  4. 抛出的异常范围可以被缩小,但不能扩大

6.构造器

  1. 和类名相同
  2. 没有返回值

作用:

  1. 使用new关键字,本身就是在调用构造器
  2. 初始化对象的值

注意点:

  • 定义有参构造之后,如果想使用无参构造,显示的定义一个无参构造 
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

  1.  java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
  2. java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。
  3. java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
  4. java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生。
  5. java.lang.IllegalArgumentException 方法传递参数错误。
  6. java.lang.ClassCastException 数据类型转换异常。
  7. java.lang.NoClassDefFoundException 未找到类定义错误。
  8. SQLException SQL 异常,常见于操作数据库时的SQL 语句错误。
  9. java.lang.InstantiationException 实例化异常。
  10. java.lang.NoSuchMethodException 方法不存在异常。

12.throw和throws的区别

throw:语句用在方法体内,执行 throw 一定是抛出了某种异常。

throws:语句是用在方法声明后面,表示出现异常的一种可能性,并不一定会发生这种异常。

13.final、finally、finalize的区别?

  1. final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。

  2. finally:异常处理语句结构的一部分,表示总是执行。

  3. finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,解决内存溢出。

14.String、StringBuilder、StringBuffer的区别? 

  1. String 是只读字符串,也就意味着String 引用的字符串内容是不能被改变的。
  2. StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。
  3. StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比StringBuffer 要高。
  4. 但是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.设计模式 

  1. 单例模式

  2. 工厂设计模式

  3. 建造者模式

  4. 适配器设计模式

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工作流程

  1. 用户发送出请求到前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
  3. HandlerMapping找到具体的控制器(可查找xml配置或注解配置),生成处理器对象的执行链(如果有),再一起返回给DispatcherServlet。
  4. DispatcherServlet调用HandlerAdapter(处理器适配器)。
  5. HandlerAdapter经过适配调用具体的处理器(controller)。
  6. Controller执行完成返回ModelAndView对象。
  7. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
  8. DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
  9. ViewReslover解析后返回具体View(视图)。
  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户。

SpringMVC常用注解 

  • @requestMapping 用于请求 url 映射。
  • @RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
  • @ResponseBody 注解实现将 controller 方法返回对象转化为 json 响应给客户。

Spring

Spring 是一个开源框架,它有两大特性IOC(控制反转)AOP(面向切面编程)

IOC:帮助我们创建对象,我们不用手动new创建对象,spring容器会帮我们去创建对象进行实例化,我们可以直接在spring容器里面去取。负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

AOP:将安全,事务等于程序逻辑相对独立的功能抽取出来,利用spring的配置文件将这些功能插进去,提高了复用性

不同类型的IOC注入方式

  1. Set 注入
  2. 构造器注入
  3. 静态工厂的方法注入
  4. 实例工厂的方法注入

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)实时性(最终一致性)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值