2019年Java常见面试问题

news/2024/7/24 11:48:20

文章目录

  • 一.JAVA
    • Java中8大基本类型占用的字节数?
    • ==和equals的区别是什么?
    • final在java中有什么作用?
    • java容器有哪些?
    • HashMap和Hashtable有什么区别?
    • HashMap的实现原理?
    • ArrayList和LinkedList的区别是什么?
    • sleep()和wait()有什么区别?
    • 在java程序中怎么保证多线程的运行安全?
    • 什么是反射?
    • tcp和udp的区别?
    • 如何实现跨域?
    • 说一下你熟悉的设计模式?
    • mybatis 的 dao 接口跟 xml 文件里面的sql 是如何建立关系的?
  • 二.数据库
    • 事务的四大特性?
    • 四种隔离级别?
    • 不考虑事务的隔离性,会发生什么问题?
    • 数据库的索引有哪些?
    • 什么操作会破坏索引?
      • Mysql 性能优化
    • Sql优化方法
        • 1.索引的优化?
        • 2.sql语句的优化?
        • 3.表的优化?
  • 三.Spring
    • 为什么要使用 spring?
    • 解释一下什么是 aop?
    • 解释一下什么是 ioc?
    • spring 常用的注入方式有哪些?
    • spring 中的 bean 是线程安全的吗?
    • Spring boot优势
    • SpringCloud五大核心组件?
  • 四.JVM
    • JVM模型?
  • 五.Redis
    • redis持久化方式?
    • redis有哪些数据类型?
    • redis常见应用场景?
  • 六.多线程
    • 线程池的几种常见的创建的方式?

一.JAVA

Java中8大基本类型占用的字节数?

  • 1字节: byte , boolean
  • 2字节: short , char
  • 4字节: int , float
  • 8字节: long , double
    注:1字节(byte)=8位(bits)

==和equals的区别是什么?

==对于基本类型来说是值比较,对于引用类型来说是比较的引用;而equals默认情况下是引用比较,只是很多类重写了equals方法,比如String,Integer等把它变成了值比较,所以一般情况下equals比较的是值是否相等

final在java中有什么作用?

final修饰的类叫最终类,该类不能被继承.
final修饰的方法不能被重写
final修饰的变量是常量,常量必须初始化,初始化之后不能被修改

java容器有哪些?

java容器分为Collection和Map两大类.其下又有很多子类.如下所示:

Collection

  • List ---------- ArrayList, LinkedList, Vector, Stack
  • Set ---------- HashSet, LinkedHashSet, TreeSet

Map

  • HashMap LinkedHashMap
  • TreeMap
  • ConcurrentHashMap
  • HashTable

HashMap和Hashtable有什么区别?

  • 存储: HashMap运行key和value为null,而Hashtable不允许.
  • 线程安全: Hashtable是线程安全的,而HashMap是非线程安全的.
  • 推荐使用: 在Hashtable的类注释可以看到,Hashtbale是保留类不建议使用,推荐在单线程环境下使用HashMap替代,如果需要多线程则用ConcurrentHashMap替代

HashMap的实现原理?

HashMap是使用拉链法.HashMap基于Hash算法实现,通过put(key,value)存储,get(key)来获取.当传入key时,HashMap会根据
key.hashCode()计算hash值,根据hash值将value保存在bucket里.当计算出的hash值相同时,我们称之为hash冲突
HashMap的做法是用链表和红黑树存储相同的hash值得value.当hash冲突的个数比较少时,使用链表,当大于8个时使用红黑树.

ArrayList和LinkedList的区别是什么?

  • 数据结构实现: ArrayList是动态数组的数据结构实现,而LinkedList是双向链表的数据结构实现.
  • 随机访问效率: ArrayList在随机访问的时候效率要高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后一次查找.
  • 增加和删除效率: 在非首尾的增加和删除操作,LinkedList要比ArrayList效率要高,因为ArrayList增删操作要影响数组内的其他数据的下标.
    综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作比较多时,更推荐使用LinkedList.

sleep()和wait()有什么区别?

  • 类的不同: sleep()来自Thread,wati()来自object.
  • 释放锁: sleep()不释放锁;wait()释放锁.
  • 用法不同: sleep()时间到会自动恢复;wait()可以使用notify()/notifyAll()直接唤醒.

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

  • 方法一: 使用安全类,比如Java.util.concurrent下的类.
  • 方法二: 使用自动锁synchronized
  • 方法三: 使用手动锁Lock

什么是反射?

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.

tcp和udp的区别?

tcp和udp是OSI模型中的运输层中的协议.tcp提供可靠的通信传输.而udp则常被用于让广播和细节控制交给应用的通信传输.
两者的区别大致如下:

  • tcp面向连接,udp面向非连接即发送数据前不需要建立连接;
  • tcp提供可靠的服务(数据传输),udp无法保证;
  • tcp面向字节流,udp面向报文;
  • tcp数据传输慢,udp数据传输快;

如何实现跨域?

  • 服务器端运行跨域 甚至CORS等于*;
  • 在单个接口使用注解@CorssOrigin运行跨域;
  • 使用jsonpk跨域;

说一下你熟悉的设计模式?

  • 单例模式: 保证被创建一次,节省系统开销.
  • 工厂模式: 解耦代码.
  • 观察者模式: 定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖都会受到通知并自动更新.
  • 外观模式: 提供一个统一的接口,用来访问子系统的一群接口,外观定义了一个高层的接口,让子系统更容易使用.
  • 模板方法模式: 定义了一个算法的骨架,而将一些不走延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤.
  • 状态模式: 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.

mybatis 的 dao 接口跟 xml 文件里面的sql 是如何建立关系的?

是通过JDK动态代理,返回了一个Dao接口的代理对象,这个代理对象的处理器是MapperProxy对象。所以,我们通过@Autowired注入Dao接口的时候,注入的就是这个代理对象,我们调用到Dao接口的方法时,则会调用到MapperProxy对象的invoke方法。
只要保证namespace+id唯一即可

二.数据库

事务的四大特性?

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

四种隔离级别?

  • ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
  • ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
  • ③ Read committed (读已提交):可避免脏读的发生。
  • ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

不考虑事务的隔离性,会发生什么问题?

  • 脏读
  • 不可重复读
  • 幻读

数据库的索引有哪些?

  • 普通索引(INDEX):最基本的索引,没有任何限制
  • 唯一索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
  • 主键索引(PRIMARY):它 是一种特殊的唯一索引,不允许有空值。
  • 全文索引(FULLTEXT ):仅可用于 MyISAM 表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时好空间。
  • 组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。

什么操作会破坏索引?

  • 1.如果条件中有or,即使其中有条件带索引也不会使用;要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引.
  • 2.like查询是以%开头
  • 3.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
  • 4.对于多列索引,不是使用的第一部分,则不会使用索引
  • 5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

Mysql 性能优化

  • 为搜索字段创建索引。
  • 避免使用 select *,列出需要查询的字段。
  • 垂直分割分表。
  • 选择正确的存储引擎。
  • 使用join时,小表驱大表
  • 避免字段为null

Sql优化方法

1.索引的优化?

  • 只要列中含有NULL值,就最好不要在此例设置索引,复合索引如果有NULL值,此列在使用时也不会使用索引
  • 尽量使用短索引,如果可以,应该制定一个前缀长度
  • 对于经常在where子句使用的列,最好设置索引,这样会加快查找速度
  • 对于有多个列where或者order by子句的,应该建立复合索引
  • 对于like语句,以%或者‘-’开头的不会使用索引,以%结尾会使用索引
  • 尽量不要在列上进行运算(函数操作和表达式操作)
  • 尽量不要使用not in和<>操作

2.sql语句的优化?

  • 查询时,能不要就不用,尽量写全字段名
  • 大部分情况连接效率远大于子查询
  • 多使用explain和profile分析查询语句
  • 查看慢查询日志,找出执行时间长的sql语句优化
  • 多表连接时,尽量小表驱动大表,即小表 join 大表
  • 在千万级分页时使用limit
  • 对于经常使用的查询,可以开启缓存

3.表的优化?

  • 表的字段尽可能用NOT NULL
  • 字段长度固定的表查询会更快
  • 把数据库的大表按时间或一些标志分成小表
  • 将表分区

三.Spring

为什么要使用 spring?

spring 提供 ioc 技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦。
spring 提供了事务支持,使得事务操作变的更加方便。
spring 提供了面向切片编程,这样可以更方便的处理某一类的问题。
更方便的框架集成,spring 可以很方便的集成其他框架,比如 MyBatis、hibernate 等。

解释一下什么是 aop?

aop 是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。

解释一下什么是 ioc?

ioc:Inversionof Control(中文:控制反转)是 spring 的核心,对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和对象间的关系。
简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理。

spring 常用的注入方式有哪些?

setter 属性注入
构造方法注入
注解方式注入

spring 中的 bean 是线程安全的吗?

spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。

实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。

有状态就是有数据存储功能。
无状态就是不会保存数据。

spring 事务实现方式有哪些?
声明式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。
编码方式:提供编码的形式管理和维护事务。

Spring boot优势

(1)独立运行的Spring项目
Spring Boot可以以jar包的形式进行独立的运行,使用:java -jar xx.jar 就可以成功的运行项目,或者在应用项目的主程序中运行main函数即可;
(2)内嵌的Servlet容器
内嵌容器,使得我们可以执行运行项目的主程序main函数,并让项目的快速运行;
(3)提供starter简化Manen配置
Spring Boot提供了一系列的starter pom用来简化我们的Maven依赖
(4)自动配置Spring
Spring Boot会根据我们项目中类路径的jar包/类,为jar包的类进行自动配置Bean,这样一来就大大的简化了我们的配置。当然,这只是Spring考虑到的大多数的使用场景,在一些特殊情况,我们还需要自定义自动配置;
(5)应用监控
Spring Boot提供了基于http、ssh、telnet对运行时的项目进行监控;

SpringCloud五大核心组件?

  • 服务发现——Netflix Eureka
  • 客服端负载均衡——Netflix Ribbon
  • 断路器——Netflix Hystrix
  • 服务网关——Netflix Zuul
  • 分布式配置——Spring Cloud Config

四.JVM

JVM模型?

  • 程序计数器
  • JVM栈
  • 本地方法栈
  • 方法区

五.Redis

redis持久化方式?

  • RDB(redis database):在指定的时间间隔能对你的数据进行快照存储。
  • AOF(append only file):记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。

redis有哪些数据类型?

  • String
  • Hash
  • List
  • Set
  • zset
    在这里插入图片描述

redis常见应用场景?

  • 全页面缓存
  • 排行榜
  • Session 存储
  • 队列
  • 发布/订阅

六.多线程

线程池的几种常见的创建的方式?

一:创建大小不固定的线程池
二:创建固定数量线程的线程池
三:创建单线程的线程池
四:创建定时线程

java类库提供一个灵活的线程池以及一些有用的默认配置;我们可以通过Executors的静态方法来创建线程池。
一: newCachedThreadPool()
二: newFixedThreadPool(int nThreads)
三: newSingleThreadExecutor()
四: newScheduledThreadPool(int corePoolSize)


http://www.niftyadmin.cn/n/1707774.html

相关文章

full gc_在运行时打开GC日志记录

full gc总是有下一个JVM表现不佳。 而且&#xff0c;您内心深知&#xff0c;如果您只有少数启动选项可以揭示有关正在发生的事情的更多信息&#xff0c;则您可能有机会真正修复该死的东西。 但是不&#xff0c;您需要的标志( -XX&#xff1a; HeapDumpOnOutOfMemoryError或-XX&…

java基础总结大全

文章目录一、基础知识&#xff1a;1、JVM、JRE和JDK的区别&#xff1a;2、环境变量path和classpath的作用是什么&#xff1f;3、变量有什么用&#xff1f;为什么要定义变量&#xff1f;什么时候用&#xff1f;4、&和&&的区别?5、标示符命名规则6、数据类型&#x…

oauth2_教程:如何实现Java OAuth 2.0以使用GitHub和Google登录

oauth2将Google和GitHub OAuth登录添加到Java应用程序的指南 我们添加到Takipi的最新功能之一是3rd party登录。 如果您像我一样懒惰&#xff0c;那么我想您也希望跳过填写表单和输入新密码的操作。 只要有权限&#xff0c;许多人都希望使用第三方登录&#xff0c;只要他们要求…

EXTJS学习笔记

sencha which set PATH%PATH%;C:\Sencha\Cmd\6.0.0.92 sencha generate app --ext MyApp ./myapp 将会创建名为 MyApp 的 Ext JS 应用&#xff0c;应用所有的文件都放在 当前目录下名为 myapp 的文件夹。 extjs 1.基本结构: Ext.define(‘Car’,{ name:null, constructor:…

输入捕获_企业应用程序中要捕获的5大Java性能指标

输入捕获有兴趣了解如何使用AppDynamics捕获这些Java性能指标吗&#xff1f; 立即开始免费试用&#xff01; 最后几篇文章介绍了应用程序性能管理(APM)&#xff0c;并指出了有效实施APM战略的挑战。 本文通过回顾五个顶级性能指标来构建这些主题&#xff0c;以评估您的企业Java…

lambda表达式_Lambdas中的例外:有点混乱的优雅解决方案

lambda表达式考虑以下用于写入文件的功能&#xff1a; 该方法背后的想法是&#xff0c;以允许用户在不同的实施方式中通过InputStream的方法&#xff0c;以便writeToFile可以被称为例如用GZIPOuputStream &#xff0c; SnappyOuputStream(快速压缩)或简单的FileInputStream 。 …

页面跳转_跳转到企业缓存之前要考虑的事情

页面跳转介绍 关系数据库事务是ACID &#xff0c;强大的一致性模型简化了应用程序开发。 由于启用Hibernate缓存是一项配置&#xff0c;因此&#xff0c;只要数据访问层开始出现性能问题&#xff0c;就转向缓存非常吸引人。 添加缓存层确实可以提高应用程序性能&#xff0c;但是…

dojo目录树_我的Dojo中有一个Mojo(如何编写Maven插件)

dojo目录树我一直忙于在工作中使用Maven的腋窝。 对于很多开发人员&#xff0c;我会听到&#xff1a;“那又怎样。” 所不同的是&#xff0c;我通常在无法直接访问Internet的环境中工作。 因此&#xff0c;当我说我经常使用Maven时&#xff0c;这意味着某些事情。 依赖地狱 公平…