百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

24W字Java经典面试题总结(附答案)

bigegpt 2025-01-31 11:58 5 浏览

前言

最近有很多粉丝问我,有什么方法能够快速提升自己,通过阿里、腾讯、字节跳动、京东等互联网大厂的面试,我觉得短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天。

目录

Java相关

基础&进阶篇

1.什么是Java

2. Java的特点有哪些

3. JDK和JRE和JVM的区别

4. Oracle JDK 和 OpenJDK 的对比

5. Java有哪些数据类型

6. Java中引用数据类型有哪些,它们与基本数据类型有什么区别?

7. 从使用方面来说

8. Java中的自动装箱与拆箱

9. 为什么要有包装类型?

10. a=a+b与a+=b有什么区别吗?

11. 能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?

12. Java程序是如何执行的

13. final 在 Java 中有什么作用?

14. final有哪些用法?

15. static都有哪些用法?

16. static和final区别

17. 为什么有些java类要实现Serializable接口

18. 什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。

19. 什么是内部类?内部类的作用

20. Excption与Error包结构

......

45. Java 中 IO 流分为几种?

字符串&集合面试题汇总

1. Java 中操作字符串都有哪些类?它们之间有什么区别?

2. String、StringBuffer和StringBuilder区别(类似上一题)

4. String str="i"与 String str=new String("i")一样吗?

5. String 类的常用方法都有那些?

6. String s = new String("xyz");创建了几个StringObject?是否可以继承String类?

7. 下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

8. 简述Java中的集合

9. List、Map、Set三个接口,存取元素时,各有什么特点?

10. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?

11. ArrayList和LinkedList区别?

12. ArrayList和Vector的区别

13. ArrayList,Vector,LinkedList的存储性能和特性

14. HashMap和Hashtable的区别

15. Java中的同步集合与并发集合有什么区别?

16. Java中的集合及其继承关系

17. poll()方法和remove()方法区别?

18. LinkedHashMap和PriorityQueue的区别

19. WeakHashMap与HashMap的区别是什么?

20. ArrayList和LinkedList的区别?

......

74. TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

Java并发编程

1. 多线程有什么用?

2. 多线程和单线程的区别和联系?

3. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?

4. 线程的创建方式

5. 线程有哪些基本状态?

6. 如何停止一个正在运行的线程

7. start()方法和run()方法的区别

8. 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

9. Runnable接口和Callable接口的区别

10. 什么是线程安全?

11. 线程的状态转换?

12. 在多线程中,什么是上下文切换(context-switching)?

13. Java中堆和栈有什么不同?

14. 如何确保线程安全?

15. 什么是竞态条件?你怎样发现和解决竞争?

16. 用户线程和守护线程有什么区别?

17. 如何创建守护线程?以及在什么场合来使用它?

18. 线程安全的级别

19. 你对线程优先级的理解是什么?

20. 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?

......

79. Linux环境下如何查找哪个线程使用CPU最长

JVM面试题

1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

2. Java内存结构?

3. Java内存分配

4. Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?

5. Java 中堆和栈有什么区别?

6. 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

7. JVM内存分哪几个区,每个区的作用是什么?

8. 怎么获取 Java 程序使用的内存?堆使用的百分比?

9. JVM有哪些内存区域?(JVM的内存布局是什么?)

10. 类加载器

11. JVM加载class文件的原理机制?

12. Java类加载过程

13. JVM中对象的创建过程

14. Java对象结构

15. 类的生命周期

16. 如何判断对象可以被回收?

17. 如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存?

18. Java的四种引用,强弱软虚

19. 什么情况下会发生栈溢出?

20. GC是什么?为什么要有GC

......

56. safepoint是什么?

数据结构与算法

1. 什么是数据结构?

2. 为什么我们需要数据结构?

3. 常见的数据结构

4. 冒泡排序

5. 插入排序

6. 选择排序

7. 归并排序

8. 快速排序

9. 二分查找

10. 二分查找 II

11. 删除排序数组中的重复项

12. 删除排序数组中的重复项 II

13. 移除元素

14. 移动零

15. 数组中重复的数字

16. 旋转数组

17. 螺旋矩阵

18. 两数之和

19. 三数之和

20. 四数之和

......

56. 排序算法的各自的使用场景和适用场合。

网络协议面试题

1. 什么是网络编程

2. 网络编程中两个主要的问题

3. 网络协议是什么

4. 为什么要对网络协议分层

5. 计算机网络体系结构

6. 什么是TCP/IP和UDP

7. TCP与UDP区别:

8. TCP和UDP的应用场景:

9. 形容一下TCP和UDP

10. 运行在TCP 或UDP的应用层协议分析。

11. 什么是Http协议?

12. Http和Https的区别?

13. 什么是http的请求体?

14. HTTP的响应报文有哪些?

15. HTTPS工作原理

16. 三次握手与四次挥手

17. 为什么 TCP 链接需要三次握手,两次不可以么?

18. 用现实理解三次握手的具体细节

19. 建立连接可以两次握手吗?为什么?

20. 为什么要四次挥手?

......

50. Cookie与Session区别

数据库

MySQL面试题

1. MySQL中的varchar和char有什么区别.

2. varchar(10)和int(10)代表什么含义?

3. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义

4. innodb的事务与日志的实现方式

5. MySQL的binlog有有几种录入格式?分别有什么区别?**

6. 超大分页怎么处理?**

7. 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?**

8. 上面提到横向分表和纵向分表,可以分别举一个适合他们的例子吗?

9. 什么是存储过程?有哪些优缺点?

10. 说一说三个范式

11. MySQL的复制原理以及流程

12. MySQL由哪些部分组成, 分别用来做什么

13. 如果一个表有一列定义为TIMESTAMP,将发生什么?

14. MySQL 里记录货币用什么字段类型好

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

16. 优化数据库的方法

17. 简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)

18. SQL 注入漏洞产生的原因?如何防止?

19. 存储时期

20. 解释 MySQL 外连接、内连接与自连接的区别

......

59. 如何优化SQL

52条 SQL性能优化策略

一千行SQL命令

基本操作

数据库操作

表的操作

数据操作

字符集编码

数据类型(列类型)

列属性(列约束)

建表规范

SELECT

UNION

子查询

连接查询(join)

TRUNCATE

备份与还原

视图

事务

锁表

触发器

SQL编程

存储过程

用户和权限管理

表维护

杂项

Redis面试题

1. 什么是 Redis?简述它的优缺点?

2. 为什么要用 redis/为什么要用缓存

2. Redis 与 memcached 相比有哪些优势?

3. Redis 支持哪几种数据类型?

4. Redis 主要消耗什么物理资源?

5. Redis 有哪几种数据淘汰策略?

6. Redis 官方为什么不提供 Windows 版本?

7. 一个字符串类型的值能存储最大容量是多少?

8. 为什么 Redis 需要把所有数据放到内存中?

9. 如何保证缓存与数据库双写时的数据一致性?

10. Redis中数据库默认是多少个db即作用?

11. Redis 集群方案应该怎么做?都有哪些方案?

12. Redis 集群方案什么情况下会导致整个集群不可用?

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

14. Redis 有哪些适合的场景?

15. 说说 Redis 哈希槽的概念?

16. Redis 集群的主从复制模型是怎样的?

17. Redis 集群会有写操作丢失吗?为什么?

18. Redis 集群之间是如何复制的?

19. Redis 集群最大节点个数是多少?

20. Redis 集群如何选择数据库?

21.Redis 中的管道有什么用?

......

48. 为什么redis需要把所有数据放到内存中?

MongoDB面试题

1. mongodb是什么?

2. mongodb有哪些特点?

3. mongodb的结构介绍

4. MongoDB的优势有哪些

5. 什么是集合

6. 什么是文档

7. 什么是NoSQL数据库?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点?

8. NoSQL数据库有哪些类型?

9. MySQL与MongoDB之间最基本的差别是什么?

10. 你怎么比较MongoDB、CouchDB及CouchBase?

11. MongoDB成为最好NoSQL数据库的原因是什么?

12. journal回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗?

13. 分析器在MongoDB中的作用是什么?

14. 如果用户移除对象的属性,该属性是否从存储层中删除?

15. 能否使用日志特征进行安全备份?

16. 允许空值null吗?

17. 更新操作立刻fsync到磁盘?

18. 如何执行事务/加锁?

19. 为什么我的数据文件如此庞大?

20. 启用备份故障恢复需要多久?

......

83. 在MongoDB中什么是副本集

框架相关面试题

Spring面试题

1. 什么是spring?

2. 说说你对Spring的理解

3. 使用Spring框架的好处是什么?

4. Spring由哪些模块组成?

5. Spring框架使用了哪些设计模式

6. Spring支持的ORM

7. Spring Framework 有哪些不同的功能?

8. 什么是Spring的MVC框架?

9. springmvc常用到的注解,作用是什么,原理。

10. 在 Spring 中,有几种配置 Bean 的方式?

11. 请解释一下 Spring Bean 的生命周期?

12. BeanFactory和ApplicationContext有什么区别?

13. Spring框架中的单例bean是线程安全的吗?

14. Spring如何处理线程并发问题?

15. 什么是Spring的内部bean?

16. Spring Bean 有哪些作用域,它们之间有什么区别?

17. Springmvc controller方法中为什么不能定义局部变量?

18. 在 Spring中如何注入一个java集合?

19. 什么是Spring MVC框架的控制器?

20. Spring DAO 有什么用?

......

58. Spring中Bean的作用域有哪些?

MyBatis面试题

1. 什么是Mybatis?

2. Mybaits的优点:

3. MyBatis框架的缺点:

4、MyBatis框架适用场合:

5、MyBatis与Hibernate有哪些不同?

6. Mybatis 比 IBatis 比较大的几个改进是什么?

7. ORM是什么

8. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

9. 传统JDBC开发存在什么问题?

10. JDBC编程有哪些不足之处,MyBatis是如何解决的?

11. MyBatis编程步骤是什么样的?

12. 请说说MyBatis的工作原理

13. MyBatis的功能架构是怎样的

14. MyBatis的框架架构设计是怎么样的

15. 什么是DBMS

16. 为什么需要预编译

17. #{}和${}的区别是什么?

18. 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

19. 模糊查询like语句该怎么写?

20. Mybatis都有哪些Executor执行器?它们之间的区别是什么?

......

47. 简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?

SpringBoot面试题

1. 什么是springboot ?

2. Springboot 有哪些优点?

3. Spring Boot 的目录结构是怎样的?

4. 怎么理解 Spring Boot 中 “约定优于配置“

5. 如何在自定义端口上运行 Spring Boot应用程序?

6. Spring Boot初始化环境变量流程?

7. Spring Boot扫描流程?

8. Spring Boot 配置加载顺序详解

9. Spring Boot 如何定义多套不同环境配置?

10. Spring Boot 有哪几种读取配置的方式?

11. SpringBoot 实现热部署有哪几种方式?

12. Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个

13. 如何重新加载Spring Boot上的更改,而无需重新启动服务器?

14. 你如何理解 Spring Boot 中的 Starters?

15.
spring-boot-starter-parent 有什么用 ?

16. 什么是 Spring Boot Stater ?

17. SpringBoot常用的starter有哪些?

18. Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

19. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

20. 创建一个 Spring Boot Project 的最简单的方法是什么?

......

43. 为什么我们不建议在实际的应用程序中使用 Spring Data Rest?

Spring & SpringBoot常用注解

1. @SpringBootApplication

2. Spring Bean 相关

3. 处理常见的 HTTP 请求类型

4. 前后端传值

5. 读取配置信息

6. 参数校验

7. 全局处理 Controller 层异常

8. JPA 相关

9. 事务 @Transactional

10. json 数据处理

11. 测试相关

微服务

SpringCloud面试题

1. 什么是微服务?

2. 什么是微服务架构?

3. 微服务的优缺点是什么?说下你在项目中碰到的坑。

4. 你所知道微服务的技术栈有哪些?列举一二。

5. 微服务之间如何独立通讯的?

6. Spring Cloud的版本关系

7. Spring Cloud的子项目(主要项目)

8. spring cloud 的核心组件有哪些?

9. springcloud如何实现服务的注册?

10. 什么是Eureka

11. Eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别?

12. 你所知道的微服务技术栈?

13. 使用Spring Cloud有什么优势?

14. SpringBoot 和 SpringCloud 之间关系?

15. SpringCloud 和 Dubbo 有哪些区别?

16. 什么是Spring Cloud Config?

17. 什么是Ribbon?

18. 什么是feigin?它的优点是什么?

19. Ribbon和Feign的区别?

20. 什么是Spring Cloud Gateway?

......

30. 微服务是如何对外提供统一接口的(zuul具体使用)

31. Zuul 的过滤功能

中间件相关

Dubbo面试题

1. Dubbo是什么?

2. 为什么要用Dubbo?

3. Dubbo 和 Spring Cloud 有什么区别?

4. Dubbo都支持什么协议,推荐用哪种?

5. Dubbo需要 Web 容器吗?

6. Dubbo内置了哪几种服务容器?

7. Dubbo里面有哪几种节点角色?

8. 画一画服务注册与发现的流程图

9. Dubbo默认使用什么注册中心,还有别的选择吗?

10. Dubbo有哪几种配置方式?

11. Dubbo 核心的配置有哪些?

12. 在 Provider 上可以配置的 Consumer 端的属性有哪些?

13. Dubbo启动时如果依赖的服务不可用会怎样?

14. Dubbo推荐使用什么序列化框架,你知道的还有哪些?

15. Dubbo默认使用的是什么通信框架,还有别的选择吗?

16. Dubbo有哪几种集群容错方案,默认是哪种?

17. Dubbo有哪几种负载均衡策略,默认是哪种?

18. 注册了多个同一样的服务,如果测试指定的某一个服务呢?

19. Dubbo支持服务多协议吗?

20. Dubbo 支持哪些协议,每种协议的应用场景,优缺点?

......

38. 在使用过程中都遇到了些什么问题?如何解决的?

Nginx面试题

1. 请解释一下什么是Nginx?

2. 什么是正向代理和反向代理?

3. 使用“反向代理服务器的优点是什么?

4. 请列举Nginx的一些特性。

5. Nginx的优缺点?

6. 为什么Nginx性能这么高?

7. Nginx应用场景?

8. 请解释Nginx服务器上的Master和Worker进程分别是什么?

9. 请解释你如何通过不同于80的端口开启Nginx?

10. Nginx负载均衡的算法怎么实现的?策略有哪些?

11. Nginx配置高可用性怎么配置?

12. Nginx怎么判断IP不可访问?

13. 怎么限制浏览器访问?

14. Nginx目录结构有哪些?

15. Nginx配置文件nginx.conf有哪些属性模块?

16. 为什么Nginx性能这么高?

17. Nginx静态资源?

18. 如何用Nginx解决前端跨域问题?

19. Nginx怎么处理请求的?

20. Nginx虚拟主机怎么配置?

......

28. Nginx条件判断

Zookeeper面试题

1. ZooKeeper 是什么?

2. ZooKeeper 提供了什么?

3. Zookeeper 都有哪些功能?

4. Zookeeper 文件系统

5. 有哪些著名的开源项目用到了 ZooKeeper?

6. 说一下 Zookeeper 的通知机制?

7. Zookeeper 机制的特点

8. Zookeeper 和 Dubbo 的关系?

9. Zookeeper的java客户端都有哪些?

10. Zookeeper 的典型应用场景

11. Zookeeper 怎么保证主从节点的状态同步?

12. 集群中有 3 台服务器,其中一个节点宕机,这个时候 Zookeeper 还可以使用吗?

13. ZAB 协议

14. 四种类型的数据节点 Znode

15. 说几个 zookeeper 常用的命令。

16. Zookeeper Watcher 机制 -- 数据变更通知

17. zookeeper 是如何保证事务的顺序一致性的?

18. 分布式集群中为什么会有 Master?

19. 集群支持动态添加机器吗?

20. zk 节点宕机如何处理?

......

30. ZAB 和 Paxos 算法的联系与区别?

MQ面试题

1. RabbitMQ是什么?

2. 为什么要用RocketMq?

3. 使用 MQ 的缺陷有哪些?

4. 你了解哪些常用的 MQ?

5. MQ 有哪些使用场景?

6. RabbitMQ特点?

7. AMQP是什么?

8. AMQP协议3层?

9. Rocketmq的工作流程是怎样的?

10. Rocketmq如何保证高可用性?

11. RocketMq如何负载均衡?

12. RocketMq的存储机制了解吗?

13. RocketMq的存储结构是怎样的?

14. RocketMq性能比较高的原因?

15. AMQP模型的几大组件?

16. 生产者Producer?

17. 消费者Consumer?

18. Broker服务节点?

19. Queue队列?

20. Exchange交换器?

......

45. 它有哪几种部署类型?分别有什么特点?

KafKa面试题

1. 什么是kafka

2. 为什么要使用 kafka,为什么要使用消息队列

3. Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么

4. Kafka中的broker 是干什么的

5. 什么是消费者组?

6. Kafka中的 zookeeper 起到什么作用,可以不用zookeeper么**

7. Kafka 为什么那么快

8. 如何设置Kafka能接收的最大消息的大小?

9. 监控Kafka的框架都有哪些?

10. 如何估算Kafka集群的机器数量?

11. Kafka能手动删除消息吗?

12. __consumer_offsets是做什么用的?

ElasticSearch面试题

1. 简要介绍一下Elasticsearch?

2. 安装 Elasticsearch 需要依赖什么组件吗?

3. 如何启动 Elasticsearch 服务器?

4. ElasticSearch中的集群、节点、索引、文档、类型是什么?

5. Elasticsearch 支持哪些类型的查询?

6. 精准匹配检索和全文检索匹配检索的不同?

7. ElasticSearch中的分片是什么?

8. 请解释一下 Elasticsearch 中聚合?

9. 解释一下Elasticsearch Cluster?

10. 解释一下 Elasticsearch Node?

11. 解释一下 Elasticsearch 集群中的 Type 的概念 ?

12. 解释一下 Elasticsearch 的 分片?

13. 定义副本、创建副本的好处是什么?

14. Elasticsearch Analyzer 中的字符过滤器如何利用?

15. REST API在 Elasticsearch 方面有哪些优势?

16. Elasticsearch 中常用的 cat命令有哪些?

17. 你能否列出与 Elasticsearch 有关的主要可用字段数据类型?

18. Elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。

19. 解释一下 Elasticsearch集群中的 索引的概念 ?

20. Elasticsearch 索引数据多了怎么办,如何调优,部署

......

47. 在并发情况下,Elasticsearch如果保证读写一致?

Linux

Linux常用命令

启动网络命令

pwd命令

ls命令

cd命令

mkdir命令

rmdir命令

touch命令

rm命令

echo命令

>和>>命令

文件查看命令

文件编辑命令

cp命令

scp命令

mv命令

man命令

free命令

df命令

wc命令

ps命令

kill命令

用户和权限命令

chmod 赋权限命令

查找命令

压缩命令

source命令

export命令

cut命令

printf命令

awk命令

sed命令

service命令

chkconfig命令

sudo命令

ping命令

ifconfig命令

netstat命令

rpm命令

Java相关

基础&进阶篇

1.什么是Java

Java是一门面向对象的高级编程语言,不仅吸收了C++语言的各种优点,比如继承了C++语言面向对象的技术核心。还摒弃了C++里难以理解的多继承、指针等概念,,同时也增加了垃圾回收机制,释放掉不被使用的内存空间,解决了管理内存空间的烦恼。

因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。

2. Java的特点有哪些

Java 语言是一种分布式的面向对象语言,具有面向对象、平台无关性、简单性、解释执行、多线程、安

全性等很多特点,下面针对这些特点进行逐一介绍。

1. 面向对象

Java 是一种面向对象的语言,它对对象中的类、对象、继承、封装、多态、接口、包等均有很好的支持。为了简单起见,Java 只支持类之间的单继承,但是可以使用接口来实现多继承。使用 Java 语言开发程序,需要采用面向对象的思想设计程序和编写代码。

2. 平台无关性

平台无关性的具体表现在于,Java 是“一次编写,到处运行(Write Once,Run any Where)”的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。

Java 语言使用 Java 虚拟机机制屏蔽了具体平台的相关信息,使得 Java 语言编译的程序只需生成虚拟机上的目标代码,就可以在多种平台上不加修改地运行。

3. 简单性

Java 语言的语法与 C 语言和 C++ 语言很相近,使得很多程序员学起来很容易。对 Java 来说,它舍弃了很多 C++ 中难以理解的特性,如操作符的重载和多继承等,而且 Java 语言不使用指针,加入了垃圾回收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。

4. 解释执行

Java 程序在 Java 平台运行时会被编译成字节码文件,然后可以在有 Java 环境的操作系统上运行。在运行文件时,Java 的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运行环境中。

5. 多线程

Java 语言是多线程的,这也是 Java 语言的一大特性,它必须由 Thread 类和它的子类来创建。Java 支持多个线程同时执行,并提供多线程之间的同步机制。任何一个线程都有自己的 run() 方法,要执行的方法就写在 run() 方法体内。

6. 分布式

Java 语言支持 Internet 应用的开发,在 Java 的基本应用编程接口中就有一个网络应用编程接口,它提供了网络应用编程的类库,包括 URL、URLConnection、Socket 等。Java 的 RIM 机制也是开发分布式应用的重要手段。

7. 健壮性

Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的一大进步。另外,Java 的异常机制也是健壮性的一大体现。

8. 高性能

Java 的高性能主要是相对其他高级脚本语言来说的,随着 JIT(Just in Time)的发展,Java 的运行速度也越来越高。

9. 安全性

Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防止恶意代码的攻击。除了 Java 语言具有许多的安全特性以外,Java 还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以防替代本地的同名类,并包含安全管理机制。

Java 语言的众多特性使其在众多的编程语言中占有较大的市场份额,Java 语言对对象的支持和强大的API 使得编程工作变得更加容易和快捷,大大降低了程序的开发成本。Java 的“一次编写,到处执行”正是它吸引众多商家和编程人员的一大优势。

3. JDK和JRE和JVM的区别

1. JDK

JDK(Java SE Development Kit),Java标准的开发包,提供了编译、运行Java程序所需要的各种工具和资源,包括了Java编译器、Java运行时环境、以及常用的Java类库等。

2. JRE

JRE(Java Runtime Environment),Java运行时环境,用于解释执行Java的字节码文件。普通用户只需要安装JRE来运行Java程序即可,而作为一名程序员必须安装JDK,来编译、调试程序。

3. JVM

JVM(Java Virtual Mechinal),Java虚拟机,是JRE的一部分。它是整个Java实现跨平台的核心,负责解释执行字节码文件,是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。也就是说

JVM是运行Java字节码的虚拟机。

不同平台的JVM是不同的,但是他们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相同的虚拟机,编译后的Java字节码就可以在该平台上运行。

为什么要采用字节码:

在 Java 中,JVM 可以理解的代码就叫做 字节码 (即Java源代码经过虚拟机编译器编译后扩展名为.class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式, 在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。 所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无 须重新编译便可在多种不同操作系统的计算机上运行。

什么是跨平台:

所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟 机,该系统就可以运行java程序。

Java 程序从源代码到运行需要三步:

4. 总结

1. JDK 用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK。

2. JDk包含JRE,JDK 和 JRE 中都包含 JVM。

3. JVM 是 Java 编程语言的核心并且具有平台独立性。

4. Oracle JDK和OpenJDK的对比

  • Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
  • OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全 开源的;
  • Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题;
  • 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能;
  • Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来 获取最新版本;
  • Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。

5. Java有哪些数据类型

Java有 8 种基本数据类型,分别为:

  • 6 种数字类型 (四个整数形,两个浮点型):byte、short、int、long、float、double
  • 1 种字符类型:char
  • 1 种布尔型:boolean。

byte:

  • byte 数据类型是8位、有符号的,以二进制补码表示的整数;
  • 最小值是 -128(-2^7)
  • 最大值是 127(2^7-1)
  • 默认值是 0
  • byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四 分之一;
  • 例子:byte a = 100,byte b = -50。

short:

  • short 数据类型是 16 位、有符号的以二进制补码表示的整数
  • 最小值是 -32768(-2^15)
  • 最大值是 32767(2^15 - 1)
  • Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
  • 默认值是 0
  • 例子:short s = 1000,short r = -20000。

int:

  • int 数据类型是32位、有符号的以二进制补码表示的整数;
  • 最小值是 -2,147,483,648(-2^31)
  • 最大值是 2,147,483,647(2^31 - 1)
  • 一般地整型变量默认为 int 类型;
  • 默认值是 0
  • 例子:int a = 100000, int b = -200000。

long:

  • 注意:Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析
  • long 数据类型是 64 位、有符号的以二进制补码表示的整数;
  • 最小值是 -9,223,372,036,854,775,808(-2^63)
  • 最大值是 9,223,372,036,854,775,807(2^63 -1)
  • 这种类型主要使用在需要比较大整数的系统上;
  • 默认值是 0L
  • 例子: long a = 100000L,Long b = -200000L。 "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。

float:

  • float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
  • float 在储存大型浮点数组的时候可节省内存空间;
  • 默认值是 0.0f
  • 浮点数不能用来表示精确的值,如货币;
  • 例子:float f1 = 234.5f。

double:

  • double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;
  • 浮点数的默认类型为double类型;
  • double类型同样不能表示精确的值,如货币;
  • 默认值是 0.0d
  • 例子:double d1 = 123.4。

char:

  • char类型是一个单一的 16 位 Unicode 字符;
  • 最小值是 \u0000(即为 0);
  • 最大值是 \uffff(即为 65535);
  • char 数据类型可以储存任何字符;
  • 例子:char letter = 'A';(单引号

boolean:

  • boolean数据类型表示一位的信息;
  • 只有两个取值:true 和 false;
  • 这种类型只作为一种标志来记录 true/false 情况;
  • 默认值是 false
  • 例子:boolean one = true。

这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、 Character、Boolean

6. Java中引用数据类型有哪些,它们与基本数据类型有什么区别?

引用数据类型分3种:类,接口,数组;

简单来说,只要不是基本数据类型.都是引用数据类型。 那他们有什么不同呢?

1、从概念方面来说

1,基本数据类型:变量名指向具体的数值

2,引用数据类型:变量名不是指向具体的数值,而是指向存数据的内存地址,.也及时hash值

2、从内存的构建方面来说(内存中,有堆内存和栈内存两者)

1,基本数据类型:被创建时,在栈内存中会被划分出一定的内存,并将数值存储在该内存中.

2,引用数据类型:被创建时,首先会在栈内存中分配一块空间,然后在堆内存中也会分配一块具体的空间用来存储数据的具体信息,即hash值,然后由栈中引用指向堆中的对象地址.

举个例子

//基本数据类型作为方法参数被调用
public class Main{
  public static void main(String[] args){
    //基本数据类型
    int i = 1;
    int j = 1;
    double d = 1.2;

    //引用数据类型
    String str = "Hello";
    String str1= "Hello";
  }
}

由上图可知,基本数据类型中会存在两个相同的1,而引用型类型就不会存在相同的数据。

假如"hello"的引用地址是xxxxx1,声明str变量并其赋值"hello"实际上就是让str变量引用了"hello"的内存地址,这个内存地址就存储在堆内存中,是不会改变的,当再次声明变量str1也是赋值为"hello"时,此时就会在堆内存中查询是否有"hello"这个地址,如果堆内存中已经存在这个地址了,就不会再次创建了,而是让str1变量也指向xxxxx1这个地址,如果没有的话,就会重新创建一个地址给str1变量。

7.从使用方面来说

1,基本数据类型:判断数据是否相等,用==和!=判断。

2,引用数据类型:判断数据是否相等,用equals()方法,==和!=是比较数值的。而equals()方法是比较内存地址的。

补充:数据类型选择的原则

  • 如果要表示整数就使用int,表示小数就使用double;
  • 如果要描述日期时间数字或者表示文件(或内存)大小用long;
  • 如果要实现内容传递或者编码转换使用byte;
  • 如果要实现逻辑的控制,可以使用booleam;
  • 如果要使用中文,使用char避免中文乱码;
  • 如果按照保存范围:byte < int < long < double

8. Java中的自动装箱与拆箱

什么是自动装箱拆箱?

从下面的代码中就可以看到装箱和拆箱的过程

//自动装箱
Integer total = 99;

//自定拆箱
int totalprim = total;

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

在Java SE5之前,自动装箱要这样写:Integer i = new` `Integer( 10``);

对于Java的自动装箱和拆箱,我们看看源码编译后的class文件,其实装箱调用包装类的valueOf方法,拆箱调用的是Integer.Value方法,下面就是变编译后的代码:

......

Java并发编程

1.多线程有什么用?

一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法:

(1)、发挥多核CPU的优势

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

(2)、防止阻塞

从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。

(3)、便于建模

这是另外一个没有这么明显的优点了。假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务A分解成几个小任务,任务B、任务C、任务D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了。

2.多线程和单线程的区别和联系?

1、在单核 CPU 中,将 CPU 分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用 CPU 的机制。

2、多线程会存在线程上下文切换,会导致程序执行速度变慢,即采用一个拥有两个线程的进程执行所需要的时间比一个线程的进程执行两次所需要的时间要多一些。

结论:即采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。

3.简述线程、程序、进程的基本概念。以及他们之间关系是什么?

线程

与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

程序

是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

进程

是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

4.线程的创建方式

方法一:继承Thread类,作为线程对象存在(继承Thread对象)

public class CreatThreadDemo1 extends Thread{
  /**
  * 构造方法: 继承父类方法的Thread(String name);方法
  * @param name
  */
  public CreatThreadDemo1(String name){
    super(name);
  }
  @Override
  public void run() {
    while (!interrupted()){
      System.out.println(getName()+"线程执行了...");
      try {
        Thread.sleep(200);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args) {
    CreatThreadDemo1 d1 = new CreatThreadDemo1("first");
    CreatThreadDemo1 d2 = new CreatThreadDemo1("second");
    d1.start();
    d2.start();
    d1.interrupt(); //中断第一个线程
  }
}

常规方法,不多做介绍了,interrupted方法,是来判断该线程是否被中断。(终止线程不允许用stop方法,该方法不会施放占用的资源。所以我们在设计程序的时候,要按照中断线程的思维去设计,就像上面的代码一样)。

让线程等待的方法

  • Thread.sleep(200); //线程休息2ms
  • Object.wait(); //让线程进入等待,直到调用Object的notify或者notifyAll时,线程停止休眠

方法二:实现runnable接口,作为线程任务存在

public class CreatThreadDemo2 implements Runnable {
  @Override
  public void run() {
    while (true){
      System.out.println("线程执行了...");
    }
  }
  public static void main(String[] args) {
    //将线程任务传给线程对象
    Thread thread = new Thread(new CreatThreadDemo2());
    //启动线程
    thread.start();
  }
}

Runnable 只是来修饰线程所执行的任务,它不是一个线程对象。想要启动Runnable对象,必须将它放到一个线程对象里。

方法三:匿名内部类创建线程对象

public class CreatThreadDemo3 extends Thread{
  public static void main(String[] args) {
    //创建无参线程对象
    new Thread(){
      @Override
      public void run() {
        System.out.println("线程执行了...");
      }
    }.start();
    //创建带线程任务的线程对象
    new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("线程执行了...");
      }
    }).start();
    //创建带线程任务并且重写run方法的线程对象
    new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("runnable run 线程执行了...");
      }
    }){
      @Override
      public void run() {
        System.out.println("override run 线程执行了...");
      }
    }.start();
  }
}

创建带线程任务并且重写run方法的线程对象中,为什么只运行了Thread的run方法。我们看看Thread类的源码,

我们可以看到Thread实现了Runnable接口,而Runnable接口里有一个run方法。

所以,我们最终调用的重写的方法应该是Thread类的run方法。而不是Runnable接口的run方法。

方法四:创建带返回值的线程

public class CreatThreadDemo4 implements Callable {
  public static void main(String[] args) throws ExecutionException,InterruptedException {
    CreatThreadDemo4 demo4 = new CreatThreadDemo4();
    FutureTask task = new FutureTask(demo4); //FutureTask最终实现的是runnable接口
    Thread thread = new Thread(task);
    thread.start();
    System.out.println("我可以在这里做点别的业务逻辑...因为FutureTask是提前完成任务");
    //拿出线程执行的返回值
    Integer result = task.get();
    System.out.println("线程中运算的结果为:"+result);
  }
  //重写Callable接口的call方法
  @Override
  public Object call() throws Exception {
    int result = 1;
    System.out.println("业务逻辑计算中...");
    Thread.sleep(3000);
    return result;
  }
}

Callable接口介绍:

public interface Callable {
  /**
  * Computes a result, or throws an exception if unable to do so.
  *
  * @return computed result
  * @throws Exception if unable to compute a result
  */
  V call() throws Exception;
}

返回指定泛型的call方法。然后调用FutureTask对象的get方法得道call方法的返回值。

方法五:定时器Timer

public class CreatThreadDemo5 {
  public static void main(String[] args) {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        System.out.println("定时器线程执行了...");
      }
    },0,1000); //延迟0,周期1s
  }
}

方法六:线程池创建线程

public class CreatThreadDemo6 {
  public static void main(String[] args) {
    //创建一个具有10个线程的线程池
    ExecutorService threadPool = Executors.newFixedThreadPool(10);
    long threadpoolUseTime = System.currentTimeMillis();
    for (int i = 0;i<10;i++){
      threadPool.execute(new Runnable() {
        @Override
        public void run() {
          System.out.println(Thread.currentThread().getName()+"线程执行了...");
        }
      });
    }
    long threadpoolUseTime1 = System.currentTimeMillis();
    System.out.println("多线程用时"+(threadpoolUseTime1-threadpoolUseTime));
    //销毁线程池
    threadPool.shutdown();
    threadpoolUseTime = System.currentTimeMillis();
  }
}

方法七:利用java8新特性 stream 实现并发

因内容较多只展示部分内容,完整面试题以备好:

另还有:

因篇幅有限,只给大家展示部分大纲目录内容!有需要的小伙伴,可以转发+关注后私信小编【学习】,即可免费领取

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...