你以为的Java面试只是背答案?跳槽涨薪不还是得靠自己的技术

Java
222
0
0
2023-05-26
标签   Java面试

前言

Java面试当然不能只靠背答案,为了应付面试背完答案拿到offer只是进入了这个行业,后面的实操还是得看自己的技术!技术的挂钩当然和技术底层也是挂钩的。

这是我在工作、面试中学习并总结到的一些知识点,都是一些比较典型的、面试常常被问到的问题。如果你平时没有注意去总结的话,那么当你面试被问到的时候可能会是一脸懵圈,就算这个问题你知道怎么回事,但是你平时没有认真总结,你也可能会出现逻辑混乱的情况,从而错失工作机会。

有些知识点不经常使用就会忘记,但是面试还会问,对此,我也是深受其害,所以我决定将这些遇见的问题整理下来,分享出去,帮助更多的人,我们共同进步。所谓“温故而知新”,没事的时候多翻看一下这些知识,没准就会有新的收获, 小编接下来会大家分享Java面试中都会遇到的12个专题,由于每个专题的题目比较多,小编这里精选挑选一些分享给到你们!

获取方式:关注小编+转发文章+私信【面试总结】获取最新Java面试题资料合集

一、Java中间件专题

zookeeper

Zookeeper 是一个分布式协调服务的开源框架。主要作用是为分布式系统提供协调服务,包括但不限于:分布式锁、统一命名服务、配置管理、负载均衡、主控服务器选举以及主从切换等。

Zookeeper 保证了如下分布式一致性特性:

(1)顺序一致性

(2)原子性

(3)单一视图

(4)可靠性

(5)实时性(最终一致性)

客户端的读请求可以被集群中的任意一台机器处理,如果读请求在节点上注册了监听器,这个监听器也 是由所连接的 zookeeper 机器来处理。对于写请求,这些请求会同时发给其他 zookeeper 机器并且达成一致后,请求才会返回成功。因此,随着 zookeeper 的集群机器增多,读请求的吞吐会提高但是写 请求的吞吐会下降。

Zookeeper提供了 (1)文件系统 (2)通知机制

Zookeeper Watcher 机制 — 数据变更通知

Zookeeper 的典型应用场景

Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布和订阅。

通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机制,可以非常方便的构建一系列分布式应用中年都会涉及的核心功能,如:

(1)数据发布/订阅

(2)负载均衡

(3)命名服务

(4)分布式协调/通知

(5)集群管理(6)Master 选举

(7)分布式锁

(8)分布式队列

RabbitMQ

MQ就是消息队列。是软件和软件进行通信的中间件产品

解耦 : A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?

A 系统负责人几乎崩溃…A 系统跟其它各种乱七八糟的系统严重 耦合 ,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。如果使用 MQ ,A系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。

如果新系统需 要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑 人家是否调用成功、失败超时等情况。就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。

但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦。

异步: A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,自己本地写库 要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求。 如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个 请求到返回响应给用户,总时长是 3 + 5 = 8ms。

削峰: 减少高峰时期对服务器压力

1、你们公司生产环境用的是什么消息中间件?

2、 Kafka 、 ActiveMQ 、 RabbitMQ 、RocketMQ 有什么优缺点?

3、MQ 有哪些常见问题?如何解决这些问题?

4、RabbitMQ的工作模式

二、微服务全家桶专题

Spring Boot

1、 Spring Framework 中有多少个模块,它们分别是什么?

2、什么是 Spring IOC 容器?

3、区分构造函数注入和 setter 注入

4、 Spring IOC 的实现机制

Spring 中的 IOC 的实现原理就是工厂模式加反射机制

 interface Fruit {
	public  abstract   void  eat();
}
class Apple implements Fruit {
	public void eat(){
		System.out.println("Apple");
	}
}
class Orange implements Fruit {
	public void eat(){
		System.out.println("Orange");
	}
}
class Factory {
	public  static  Fruit  getInstance (String ClassName) {
		Fruit f=null;
		try {
			f=(Fruit)Class.forName(ClassName).newInstance();
		}
		catch ( Exception  e) {
			e.printStackTrace();
		}
		return f;
	}
}
class Client {
	public static void main(String[] a) {
		Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
		if(f!=null){
			f.eat();
		}
	}
}  

3、什么是基于注解的容器配置

4、@Component, @Controller, @Repository,@Service 有何区别?

@Required 注解

这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出 bean InitializationException。

 public class Employee {
	 private  String name;
	@Required public void setName(String name){
		this.name=name;
	}
	public string getName(){
		return name;
	}
}  

@Autowired 注解

@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。

 public class Employee {
	private String name;
	@Autowired public void setName(String name) {
		this.name=name;
	}
	public string getName(){
		return name;
	}
}  

@Autowired和@Resource之间的区别

@Qualififier 注解

当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualififier注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。

@ Request Mapping 注解

获取方式:关注小编+转发文章+私信【面试总结】获取最新Java面试题资料合集

Spring MVC

Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图- 控制器 分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合

1、 Spring MVC的主要组件?

2、 请描述Spring MVC的 工作流程 ?描述一下 DispatcherServlet 的工作流程?

(1)用户发送请求至前端控制器DispatcherServlet;

(2) DispatcherServlet收到请求后,调用 Handler Mapping处理器映射器,请求获取 Handle ;

(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;

(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;

(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);

(6)Handler执行完成返回ModelAndView;

(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;

(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;

(9)ViewResolver解析后返回具体View;

(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

(11)DispatcherServlet响应用户。

3、 MVC是什么?MVC设计模式的好处有哪些

4、 Spring MVC常用的注解有哪些?

  • @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。

@RequestMapping注解的作用

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

@ResponseBody注解的作用

  • @Conntroller:控制器的注解,表示是表现层,不能用用别的注解代替

@Controller注解的作用

Spring Cloud

Spring Cloud 是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、 断路器 、数据监控等,都可以用 Spring Boot的开发风格做到一键启动和部署。

Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

1、 SpringCloud 的优缺点

2、SpringCloud由什么组成

Eureka

1、服务注册和发现是什么意思?Spring Cloud 如何实现?

2、什么是Eureka

  • Eureka作为SpringCloud的服务注册功能服务器,他是服务注册中心,系统中的其他服务使用Eureka的客户端将其连接到Eureka Service中,并且保持心跳,这样工作人员可以通过EurekaService来监控各个微服务是否运行正常。

3、Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别

Zuul

网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务

1、什么是Spring Cloud Zuul(服务网关)

2、网关与过滤器有什么区别

网关是对所有服务的请求进行分析过滤,过滤器是对单个服务而言。

3、既然 Nginx 可以实现网关?为什么还需要使用Zuul框架

Zuul 是 SpringCloud 集成的网关,使用 Java 语言编写,可以对 SpringCloud 架构提供更灵活的服务。

Ribbon

1、Ribbon底层实现原理

Ribbon 使用 discoveryClient 从注册中心读取目标服务信息,对同一接口请求进行计数,使用 % 取余算法获取目标服务集群索引,返回获取到的目标服务信息。

2、Nginx与Ribbon的区别

Hystrix

1、在 微服务 中,如何保护服务?

2、谈谈服务降级、熔断、服务隔离

3、服务降级底层是如何实现的?

  • Hystrix实现服务降级的功能是通过重写HystrixCommand中的getFallback()方法,当Hystrix的run方法或construct执行发生错误时转而执行getFallback()方法。

Feign

  • Feign 是一个声明web服务客户端,这使得编写web服务客户端更容易
  • 他将我们需要调用的服务方法定义成抽象方法保存在本地就可以了,不需要自己构建Http请求了,直接调用接口就行了,不过要注意,调用方法要和本地抽象方法的签名完全一致。

1、Ribbon和Feign调用服务的区别

2、SpringCloud有 Feign、RestTemplate两种 调用接口方式!

Bus

1、什么是 Spring Cloud Bus?

Config

1、什么是Spring Cloud Config?

2、分布式配置中心的作用?

动态变更项目配置信息而不必重新部署项目。

Gateway

1、什么是Spring Cloud Gateway?

SpringCloud主要项目

  • Spring Cloud Netflix (重点,这些组件用的最多)
  • Spring Cloud Config
  • Spring Cloud Consul
  • Spring Cloud Bus
  • Spring Cloud Security
  • Spring Cloud Sleuth
  • Spring Cloud Task
  • Spring Cloud Stream
  • Spring Cloud Zookeeper
  • Spring Cloud OpenFeign
  • Spring Cloud Gateway

三、Java并发编程专题

1、为什么要使用并发编程

2、并发编程三个必要因素是什么?

3、线程和进程区别

4、什么是线程死锁

5、创建线程的四种方式

  • 继承 Thread 类;
 public class My thread   extends  Thread {
	@ Override 
	public void run() {
		System.out.println(Thread.currentThread().getName() + " run()方法正在执
行...");
	}  
  • 实现 Runnable 接口;
 public class MyRunnable implements Runnable {
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + " run()方法执行
中...");
	}  
  • 实现 Callable 接口;
 public class MyCallable implements Callable<Integer> {
	@Override
	public Integer call() {
		System.out.println(Thread.currentThread().getName() + " call()方法执行
中...");
		return 1;
	}  
  • 使用匿名内部类方式
 public class CreateRunnable {
	public static void main(String[] args) {
		//创建 多线程 创建开始
		Thread thread = new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 10; i++) {
					System.out.println("i:" + i);
				}
			}
		}
		);
		thread.start();
	}
}  

6、线程的状态

7、Java 中你怎样唤醒一个阻塞的线程?

8、 线程 类的 构造方法 、静态块是被哪个线程调用的

9、 Java 中怎么获取一份线程 dump 文件?你如何在 Java 中获取线程堆栈?

10、什么是线程同步和线程互斥,有哪几种实现方式?

11、 多线程的常用方法

12、Java 线程数过多会造成什么异常?

13、同步方法和同步块,哪个是更好的选择?

14、如果你提交任务时,线程池队列已满,这时会发生什么

15、 一个线程运行时发生异常会怎样?

16、 你对线程优先级的理解是什么?

17、 为什么 wait(), notify()和 notifyAll()必须在同步方法或者同步块中被调用?

18、线程的 sleep()方法和 yield ()方法有什么区别?

19、 在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

20、为什么 Thread 类的 sleep()和 yield ()方法是静态的?

21、什么是阻塞式方法?

22、如何停止一个正在运行的线程?

23、什么叫线程安全?servlet 是线程安全吗?

24、Thread 类中的 yield 方法有什么作用?

25、如何在两个线程间共享数据?

26、在 Java 程序中怎么保证多线程的运行安全?

27、Java 如何实现多线程之间的通讯和协作?

28、Java 中 interrupted 和 isInterrupted 方法的区别?

29、 notify() 和 notifyAll() 有什么区别?

获取方式:关注小编+转发文章+私信【面试总结】获取最新Java面试题资料合集

四、Java基础专题

1、什么是Java

2、 Jdk 和 Jre 和JVM的区别

3、什么是 字节码 ?采用字节码的最大好处是什么

4、 Oracle JDK 和 OpenJDK 的对比

5、 short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗

6、访问修饰符 public,private,protected,以及不写(默认)时的区别

7、final finally finalize区别

8、super关键字的用法

 class Person{
	protected String name;
	public Person(String name) {
		this.name = name;
	}
}
class Student extends Person{
	private String name;
	public Student(String name, String name1) {
		super(name);
		this.name = name1;
	}
	public void getInfo(){
		System.out.println(this.name);
		//Child
		System.out.println(super.name);
		//Father
	}
}
public class Test {
	public static void main(String[] args) {
		Student s1 = new Student("Father","Child");
		s1.getInfo();
	}
}  

9、面向对象和 面向过程 的区别

10、面向对象的特征有哪些方面

五、 Redis 专题

Redis 是一个使用 C 语言写成的,开源的高性能 key-value 非关系缓存数据库。它支持存储的 value 类型相对更多,包括string( 字符串 ) 、 list( 链表 ) 、 set( 集合 ) 、 zset(sorted set — 有序集合 ) 和 Hash (哈希类型)。 Redis 的数据都基于缓存的,所以很快,每秒可以处理超过 10 万次读写操作,是已知性能最快的Key-Value DB 。 Redis 也可以实现数据写入磁盘中,保证了数据的安全不丢 失,而且Redis 的操作是原子性的。

Redis 主要有 5 种数据类型,包括 String List Set Zset Hash ,满足大部分的使用要求

1、Redis 的持久化机制是什么?各自的优缺点?

2、Redis 的回收策略(淘汰策略)?

3、Redis 如何设置密码及验证密码?

设置密码: confifig set requirepass 123456 授权密码: auth 123456

4、怎么理解 Redis 事务?

答:

1) 事务是一个单独的隔离操作: 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中, 不会被其他客户端发送来的命令请求所打断。

2) 事务是一个 原子操作 : 事务中的命令要么全部被执行, 要么全部都不执行。

5、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?

6、Redis 最适合的场景?

7、使用过 Redis 做异步队列么,你是怎么用的?

8、如何实现集群中的 session 共享存储?

六、MySQL优化专题

随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解 索引 及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能、高并发和高可用的系统。 今天小编首先会跟大家分享一下MySQL 索引中的各种概念,然后介绍优化索引的若干条规则,最后利用这些规则,针对面试中常考的知识点,做详细的实例分析。

1、MySQL 中有哪几种锁?

  • 表级锁: 开销小, 加锁快; 不会出现死锁; 锁定粒度大, 发生锁冲突的概率最高, 并发度最低。
  • 行级锁: 开销大, 加锁慢; 会出现 死锁 ; 锁定粒度最小, 发生锁冲突的概率最低, 并发度也最高。
  • 页面锁: 开销和加锁时间界于表锁和行锁之间; 会出现死锁; 锁定粒度界于表锁和行锁之间, 并发度一般。

2、简述在MySQL 数据库中 MyISAM 和InnoDB 的区别

3、MySQL_fetch_array 和MySQL_fetch_object 的区别是什么?

4、什么是通用 SQL 函数?

5、MySQL 里记录货币用什么字段类型好

6、MySQL 数据库作发布系统的存储,一天五万条以上的增量, 预计运维三年,怎么优化?

7、简单描述 MySQL 中,索引,主键,唯一索引,联合索引

8、SQL 注入漏洞产生的原因?如何防止?

9、对于关系型数据库而言,索引是相当重要的概念,请回答

10、什么样的对象可以使用 CREATE 语句创建?

七、Linux技术专题

Linux知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准。在这里我们将详细的整理常见的Linux面试题目, 提供给大家学习参考。

1、Unix和Linux有什么区别?

2、Linux 的体系结构

从大的方面讲,Linux 体系结构可以分为两块:

3、什么是CLI?

4、简单 Linux 文件系统?

5、Linux 的目录结构是怎样的?

6、什么是硬链接和软链接?

7、一台 Linux 系统初始化环境后需要做一些什么安全工作?

8、如何选择 Linux 操作系统版本?

9、请问当用户反馈网站访问慢,你会如何处理?

10、Linux 性能调优都有哪几种方法?

1、Disabling daemons (关闭 daemons)。

2、Shutting down the GUI (关闭 GUI)。

3、Changing kernel parameters (改变内核参数)。

4、Kernel parameters (内核参数)。

5、Tuning the processor subsystem (处理器子系统调优)。

6、Tuning the memory subsystem (内存子系统调优)。

7、Tuning the fifile system (文件系统子系统调优)。

8、Tuning the network subsystem(网络子系统调优)。

八、Mybatis专题

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

1、Mybatis优缺点

2、请说说MyBatis的工作原理

在学习 MyBatis 程序之前,需要了解一下 MyBatis 工作原理,以便于理解程序。 MyBatis 的工作原理如下图:

3、 在mapper中如何传递多个参数

方法1:顺序传参法

 public User selectUser(String name, int deptId);
<select id="selectUser" resultMap="UserResultMap"> 
  select * from user 
  where user_name = #{0} and dept_id = #{1} 
    </select>

#{}里面的数字代表传入参数的顺序。
这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。  

方法2:@Param注解传参法

 public User selectUser(@Param("userName") String name, int @Param("deptId")
deptId);

<select id="selectUser" resultMap="UserResultMap">
			select * from user
			where user_name = #{userName} and dept_id = #{deptId}
</select>

#{}里面的名称对应的是注解@Param括号里面修饰的名称。
这种方法在参数不多的情况还是比较直观的,(推荐使用)。  

方法3:Map传参法

 public User selectUser(Map<String, Object> params);

<select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">

select * from user

where user_name = #{userName} and dept_id = #{deptId}

</select>

#{}里面的名称对应的是Map里面的key名称。
这种方法适合传递多个参数,且参数易变能灵活传递的情况。(推荐使用)。  

方法4:Java Bean传参法

 public User selectUser(User user);

<select id="selectUser" parameterType="com.jourwon.pojo.User"

resultMap="UserResultMap">

select * from user

where user_name = #{userName} and dept_id = #{deptId}

</select>

#{}里面的名称对应的是User类里面的成员属性。
这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理方
便,推荐使用。(推荐使用)。  

4、MyBatis编程步骤是什么样的?

  • 1、 创建SqlSessionFactory
  • 2、 通过SqlSessionFactory创建SqlSession
  • 3、 通过sqlsession执行数据库操作
  • 4、 调用session.commit()提交事务
  • 5、 调用session.close()关闭会话

5、为什么需要预编译

九、多线程专题

随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4 核、8 核甚至 16 核的也都不少见,如果是单线程的程序,那么在双核 CPU 上 就浪费了 50%, 在 4 核 CPU 上就浪费了 75%。单核 CPU 上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快, 看着像多个线程”同时”运行罢了。多核 CPU 上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU 的优势来,达到充分利用CPU 的目的。

1、线程和进程的区别是什么?

2、为什么要使用线程池?

3、什么是活锁、饥饿、无锁、死锁?

4、什么是原子性、可见性、有序性?

5、什么是 CAS 算法?在多线程中有哪些应用。

十、性能调优专题

Tomcat

在工作中,作为 Java 开发的程序员,Tomcat 服务器是大家常用的,也是很多公司现在正在用的。但是,在系统并发量比较大的情况下,Tomcat 就会出现卡死和自动关闭等问题。如何优化 Tomcat,让它更高效的运行就成了问题,在本次面试题分享中,我将为你解答如何更好的提升 Tomcat 性能。

1、tomcat 有哪几种Connector 运行模式(优化)?

2、tomcat容器是如何创建servlet类实例?用到了什么原理?

当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)在servlet注册时加上如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

3、垃圾回收策略调优

4、打印类的加载情况及对象的回收情况

5、Tomcat一个请求的完整过程

 Ng:(nginx)
upstream yy_001{
server 10.99.99.99:8080;
server 10.99.99.100:8080;
hash $**;
healthcheck_enabled;
healthcheck_delay 3000;
healthcheck_timeout 1000;
healthcheck_failcount 2;
healthcheck_send 'GET /healthcheck.html HTTP/1.0' 'Host: wo.com'
'Connection: close';
}
server {
include base.conf;
server_name wo.de.tian;
...
location /yy/ {
proxy_pass 
}  

Nginx

在所有互联网公司中,Nginx 作为最常用的 7 层负载均衡代理层,每个后端开发人员和运维人员都应该对其有较为深入的理解。

1、BIO和NIO、AIO的区别

2、IO流的分类

3、非阻塞NIO(noblocking I/O)

4、异步AIO(asynchronous I/O)

5、什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别

十一、Java异常专题

Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。

1. Throwable

Throwable 是 Java 语言中所有错误与异常的超类。

Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。

Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。

2. Error(错误)

定义:Error 类及其子类。程序中无法处理的错误,表示运行应用程序中出现了严重的错误。

特点:此类错误一般表示代码运行时 JVM 出现问题。通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内存不足错误;StackOverflflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。这些错误是不受检异常,非代码性错误。因此,当此类错误发生时,应用程序不应该去处理此类错误。按照Java惯例,我们是不应该实现任何新的Error子类的!

3. Exception(异常)

程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常。

运行时异常

定义:RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。

特点:Java 编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既”没有通过throws声明抛出它”,也”没有用try-catch语句捕获它”,还是会编译通过。比如NullPointerException空指针异常、ArrayIndexOutBoundException数组下标越界异常、ClassCastException类型转换异常、ArithmeticExecption算术异常。此类异常属于不受检异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。虽然 Java 编译器不会检查运行时异常,但是我们也可以通过 throws 进行声明抛出,也可以通过 try-catch 对它进行捕获处理。如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

RuntimeException 异常会由 Java 虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。

编译时异常

定义: Exception 中除 RuntimeException 及其子类之外的异常。

特点: Java 编译器会检查它。如果程序中出现此类异常,比如 ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常),要么通过throws进行声明抛出,要么通过trycatch进行捕获处理,否则不能通过编译。在程序中,通常不会自定义该类异常,而是直接使用系 统提供的异常类。该异常我们必须手动在代码里添加捕获语句来处理该异常。

4. 受检异常与非受检异常

Java 的所有异常可以分为受检异常(checked exception)和非受检异常(uncheckedexception)。

受检异常

编译器要求必须处理的异常。正确的程序在运行过程中,经常容易出现的、符合预期的异常情况。一旦发生此类异常,就必须采用某种方式进行处理。除 RuntimeException 及其子类外,其他的Exception 异常都属于受检异常。编译器会检查此类异常,也就是说当编译器检查到应用中的某 处可能会此类异常时,将会提示你处理本异常——要么使用try-catch捕获,要么使用方法签名中用 throws 关键字抛出,否则编译不通过。

非受检异常

编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有try-catch捕获它,也没有使用throws抛出该异常,编译也会正常通过。该类异常包括运行时异常(RuntimeException极其子类)和错误(Error)。

十二、Git常用命令专题

工作中 Git 是一项必不可少的技能,在项目的开发进程中起着至关重要的作用。下面介绍一些 Git 在工作中的一些使用实践、常用流程、常用命令,供大家参考!

配置操作

本地操作

分支操作

变更历史

标签操作

远端交互

获取方式:关注小编+转发文章+私信【面试总结】获取最新Java面试题资料合集

最后

希望能帮助到你在面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。重要的事情说三遍,转发+转发+转发,一定要记得点赞转发哦!!!