https://blog.csdn.net/weixin_45927841/article/details/123217462?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-123217462-blog-124825404.pc_relevant_antiscanv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-123217462-blog-124825404.pc_relevant_antiscanv3&utm_relevant_index=2
作者:晗江雪 链接:https://www.nowcoder.com/discuss/836019 来源:牛客网
JAVA基础
JAVA集合
list :LinkedList,ArrayList 和vector
LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全 ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全 Vector 接口实现类 数组, 同步, 线程安全
set:HashSet和TreeSet
HashSet 使用哈希表存储元素,元素可以是null LinkedHashSet 链表维护元素的插入次序 TreeSet 底层实现为红黑树,元素排好序,元素不可以是null
map:HashMap、TreeMap和HashTable
线程安全
HshaMap线程不安全 TreeMap线程不安全 HashTable线程安全
空值
HashMap一个null key,多个null value TreeMap不能null key,多个null value HashTable都不能有null
继承和接口
HashMap继承AbstractMap,实现接口Map TreeMap继承AbstractMap,实现接口NavigableMap(SortMap的一种) HashTable继承Dictionary,实现接口Map
顺序
HashMap中key是无序的 TreeMap是有序的 HashTable是无序的
构造函数
HashMap有调优初始容量和负载因子 TreeMap没有 HashTable有
数据结构
HashMap是链表+数组+红黑树 TreeMap是红黑树 HashTable是链表+数组
list、set和map的区别
list:元素按进入先后有序保存,可重复 set:不可重复,并做内部排序 map:代表具有映射关系的集合,其所有的key是一个Set集合,即key无序且不能重复。
java面向对象
即封装继承多态 概论:面向对象是把一组数据结构和处理他们的方法组成对象; 把具有相同行为的对象归纳成类;通过封装隐藏类的内部细节;通过继承使类得到泛化; 通过多态实现基于对象类型的动态分派
吃饭: 面向过程:买菜,洗菜,做饭,洗手吃饭,洗碗 面向对象:点外卖,吃饭,扔外卖盒
封装:内部细节对外部调用透明 体现:1.JavaBean的属性私有,提供get set 对外访问,因为属性的赋值或者获取
Java的基础数据类型有哪些?(5分)
有布尔型 true false ,整数型long int byte short,字符类型char,浮点型float double
int 和 Integer 有什么区别?(5分)
Int 是基本数据类型,Integer是引用数据类型,Interger更多用于面向对象过程,即更多用于创建类过程中。
ArrayList和LinkedList有什么区别
ArrayList和LinkedList都实现了List接口,他们有以下的不通电 ArrayList是基于索引的数据接口,底层是数组,它可以以O(1)时间复杂度对元素进行随机访问。 对应的是LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,
总结: ArrayList基于数组,LinkedList基于链表
JAVA中的集合类
第一代线程安全集合类
Vector,Hashtable 是怎么保证线程安排的;使用synchronized修饰方法 缺点:效率低下
第二代线程非安全集合类
ArrayList ,HashMap 线程不安全,但是性能好,用来代替vector和Hashtable 使用ArrayList ,HashMap,需要线程安全怎么办呢? 使用Collections.synchronizedList(list);Collections.synchronizedMap(m); 底层使用synchronized代码块锁,虽然也是锁住了所有代码,
第三代线程安全集合类
在大量并发情况下如何提高集合的效率和安全呢
jdk1.8的新特性有哪些
接口的默认方法
java8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法, 示例如下: 代码如下: interface Formula{ double calculate(int a) default double sqrt(int a) { return Math.sqrt(a); } }
JAVA中抽象类和接口有什么区别
不同 抽象类: 1.抽象类中可以定义构造器 2.可以有抽象方法和具体方法 3.接口中的成员全都是public的 4.抽象类中可以定义成员变量 5.有抽象方法的类必须声明为抽象类,而抽象类未必要有抽象方法 6.抽象类中可以包含静态方法 7.一个类只能继承一个抽象类
接口: 1.接口中不能定义构造器 2.方法全都是抽象方法 3.抽象类中的成员可以是private,默认,protected,public 4.接口中定义的成员变量实际上是常量 5.接口中不能有静态方法 6.一个类可以实现多个接口
Java中==和equals有哪些区别
equals和==最大的区别是一个是方法一个是运算符
==:如果比较的对象时基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等 equals(): 用来比较两个方法的内容是否相等。 注意:equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向二代对象的地址。
Java中重写和重载有哪些区别
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性,重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同,参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法生命更多的
String ,StringBuffer,StringBuilder区别及使用场景
Java平台提供了两种类型的字符串:String和StringBuilder,它们都可以存储和操作字符串,区别如下。
1.String是只读字符串,也就意味着String引用的字符串内容是不能被改变的,初学者可能会有这样的误解:
String str ="abc";
str = "bad"
如上,字符串str命名是可以改变的吖!其实不然,str仅仅是一个是一个引用对象,它指向一个字符串对象“abc”, 第二行代码的含义是让str重新指向一个新的字符串"bcd"对象,而“abc”对象并没有任何改变,只不过该对象已经成为了一个不可及对象罢了
2.StringBuffer/StringBuffer表示的字符串对象可以直接修改 3.StringBuffer是java5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被synchronized修饰,因此它的效率理论上也比StringBuffer要高。
Redis
Redis线程模型有哪些,单线程为什么快
HashMap和LinkedHashMap的区别?
HashMap和HashTable有什么区别?
final关键字在Java中有什么作用?
String的底层存储是什么?
sleep()与wait()区别?(5分)
MySQL索引有哪几种类型?
MySQL之事务的四大特性?
原子性,一致性,隔离性,持久性
怎么避免并发?
MySQL中count(id)、count(1)、count(字段)的区别?
你知道哪些数据库优化事项?
抽象类和普通类有哪些区别?(5分)
抽象类只能用public 和protected来修饰, 抽象类不可以用来创建对象
java反射获取类的三种方式
1.调用对象的.getClass()方法 2.调用某个类的.class属性 3.使用Class.forName+类的全路径
HashSet 判断两个元素相等性的方法
HashSet首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法,如果equls结果为true,HashSet就是为一个元素,如果equals为false,就不是一个元素
Java多线程
为什么要使用java线程池
1.降低资源消耗。通过重复利用已创建的线程降低线程创建,销毁线程造成的消耗。 2.提高响应速度。当任务到达时,任务可以不需要等到线程创建就立即执行。 3.提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控 4.提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。
Redis
Redis可以用来做什么
1.Redis最长用来做缓存,是实现分布式缓存的首先中间件 2.Redis可以作为数据库,实现诸如点赞,关注,排行等对性能要求极高的互联网需求 3.Redis可以作为计算工具,能用很小的代价,统计诸如PV/UV,用户在线天数等数据 4.Redis还有很多其他的使用场景,例如:可以实现分布式锁,可以作为消息队列使用。
Redis和传统的关系型数据库有什么不同?
Redis是一种基于键值对的NoSQL数据库,而键值对的值是由多种数据结构和算法组成的。Redis的数据都存储与内存中,因此它的速度惊人,读写性能可达10万/秒,远超关系型数据库
关系型数据库是基于二维数据表来存储数据的,它的数据格式更为严谨,并支持关系查询。关系型数据库的数据存储于磁盘上,可以存放海量的数据,但性能远不如Redis
区别: NoSQL存放在内存中,关系型数据库存放在磁盘中
Redis有哪些数据类型
1.Redis支持5中核心的数据类型,分别是字符串,哈希,列表,集合,有序集合 2.Redis还提供了Bitmap,HyperLogLog,Geo类型,但是这些都是基于上述的核心数据类型实现的 3.Redis在5.0新增加了Streams数据类型,它是一个功能强大的、支持多播的、可持久化的消息队列。
Redis为什么是单线程的却这么快
1.单线程避免了线程切换和竞争所产生的消耗 2.Redis大部分操作在内存上完成 3.Redis采用了IO多路复用机制,使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。
set和zset有什么区别呢
set:即集合
集合中的元素是无序、不可重复的,一个集合最多能存储232-1个元素;
集合除了支持对元素的增删改查之外,还支持对多个集合取交集、并集、差集。
zset:即有序集合
有序集合保留了集合元素不能重复的特点;
有序集合会给每个元素设置一个分数,并以此作为排序的依据;
有序集合不能包含相同的元素,但是不同元素的分数可以相同。
1.7 说一下Redis中的watch命令
参考答案
很多时候,要确保事务中的数据没有被其他客户端修改才执行该事务。Redis提供了watch命令来解决这类问题,这是一种乐观锁的机制。客户端通过watch命令,要求服务器对一个或多个key进行监视,如果在客户端执行事务之前,这些key发生了变化,则服务器将拒绝执行客户端提交的事务,并向它返回一个空值。
1.8 说说Redis中List结构的相关操作
参考答案
列表是线性有序的数据结构,它内部的元素是可以重复的,并且一个列表最多能存储2^32-1个元素。列表包含如下的常用命令:
lpush/rpush:从列表的左侧/右侧添加数据;
lrange:指定索引范围,并返回这个范围内的数据;
lindex:返回指定索引处的数据;
lpop/rpop:从列表的左侧/右侧弹出一个数据;
blpop/brpop:从列表的左侧/右侧弹出一个数据,若列表为空则进入阻塞状态。
1.9 你要如何设计Redis的过期时间?
参考答案
热点数据不设置过期时间,使其达到“物理”上的永不过期,可以避免缓存击穿问题;
在设置过期时间时,可以附加一个随机数,避免大量的key同时过期,导致缓存雪崩。
MySQL部分
索引
说一说你对Mysql索引的理解
索引是一个单独的,存储在磁盘上的数据库结构,包含着对数据库表里所有记录的引用指针。使用索引可以加快找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询和操作速度的最佳途径
索引是在存储引擎中实现的,因此,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有的索引类型。MySQL中索引的存储类型有两种,即Btree和HASH,具体和表的存储引擎相关
索引的有点主要有以下几条: 1.通过创建唯一索引,可以保证数据库表中每一行数据的唯一性 2.可以大大加快数据的查询速度。 3.有助于实现数据的参考完整性,可以加速表和表之间的链接 4.使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间
增加索引也有许多不利的方面,主要表现在如下几个方面: 1.创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加 2.索引需要占据磁盘空间,除了数据表占数据空间之外,每一个索引还需要占一定的物理空间,如果有大量的索引,索引文件可能比数据文件更大 3.当对表中的数据进行增删改的时候,索引也要动态地维护,这样降低了数据的维护速度
mysql有哪些索引
可以分为以下几类: 1.普通索引和唯一索引 普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。 唯一索引要求索引列的值必须唯一,但允许有空值,如果是组合索引,则组合的值必须唯一。 主键索引是一种特殊的唯一索引,不允许有空值。
2.单列索引和组合索引 单列索引即一个索引只包含单个列,一个表可以有多个单列索引。 组合索引是指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合
3.全文索引 4.空间索引
MySQL怎么判断要不要加索引
建议按照如下的原则来创建索引:
当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列的数据完整性,以提高查询速度。
在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
那些情况不适合创建索引
1.频繁更新的字段 2.where条件中用不到的字段 3.数据比较少的表 4.数据重复且分布比较均匀的字段,比如性别,真价值 5.参与列计算的列不适合建索引
索引的实现原理
在MySQL中,索引是在存储引擎层实现的,不同存储引擎对索引的实现方式是不同的,下面我们探讨一下MyISAM和InnoDB两个存储引擎的索引实现方式。
MyISAM索引实现:
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址,MyISAM索引的原理图如下。这里假设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。 如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示。同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
InnoDB索引实现:
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
下图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。下图为定义在Col3上的一个辅助索引。这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。
聚簇索引有哪些类别
聚簇索引和非聚簇索引有什么区别
在InnoDB存储引擎中,可以将B+树索引分为聚簇索引和辅助索引(非聚簇索引)。无论是何种索引,每个页的大小都为16KB,且不能更改。
聚簇索引是根据主键创建的一棵B+树,聚簇索引的叶子节点存放了表中的所有记录。辅助索引是根据索引键创建的一棵B+树,与聚簇索引不同的是,其叶子节点仅存放索引键值,以及该索引键值指向的主键。也就是说,如果通过辅助索引来查找数据,那么当找到辅助索引的叶子节点后,很有可能还需要根据主键值查找聚簇索引来得到数据,这种查找方式又被称为书签查找。因为辅助索引不包含行记录的所有数据,这就意味着每页可以存放更多的键值,因此其高度一般都要小于聚簇索引。
mysql的存储引擎有哪些
MySQL的存储引擎有MyISAM和InnoDB,MEMORY/HEAP MyISAM和InnoDB存储引擎只支持BTREE索引 MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。
Mysql的隔离级别有哪些?
Mysql定义了四种隔离级别,包括一些具体规则,用于限定事物内外哪些改变是可见的,哪些改变时不可见的。 低级别的隔离一般支持更高的并发处理,并且拥有更低的系统开销
READ UNCOMMITTED 读取未提交内容
在这个隔离级别,所有事物都可以“看到”未提交事物的执行结果。在这种级别上,可能会产生很多问题,除非用户真的知道自己在干什么,并有很好的理由选择这样做。本隔离级别很少用于实际应用,因为它的性能也不比其他性能好多少,而别的级别还有其他更多的优点,读取未提交数据,也被称为“脏读”
READ COMMITTED 读取提交内容 大多数数据库的默认隔离级别(但是不是MySQL的默认隔离级别),满足了隔离的早先简单定义:一个事务开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交钱,所做的任何数据改变都是不可见的,除非已经提交,这种隔离级别也支持所谓的“不可重复读”,这意味着用户运行同一个语句两次,看到的结果是不同的。
repeatble read 可重复读 MySQL 数据库默认的隔离界别。该级别解决了read uncommitted隔离级别导致的问题。它保证同一事务的多个实例在并发读取事务时,会“看到同样的”数据行。
serializable 可串行化 强制给事务排序,使之不可能冲突
1.脏读 脏读是指一个事务读取了未提交事务执行过程中的数据。 当一个事务的操作正在多次修改数据,而在事务还未提交的时候,另外一个并发事务 2.不可重复读 3.虚读(幻读)
手写一个单例模式
饿汉式单例模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstace() {
return instance;
}
}
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstace() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
手写一个线程安全的单例模式
高并发
高并发有哪些实践方案
要实现高并发,一般针对高性能,高可用,高扩展3个方面,总结一下可落地的实践方案。
高性能的时间方案
1.集群部署,通过负载均衡减轻单机压力 2.多级缓存,包括静态数据使用CDN,本地缓存,分布式缓存等,以及处理对缓存场景中的热点key,缓存穿透,缓存并发,数据一致性等问题的处理。 3.分库分表和索引优化,以及借助搜索引擎解决复杂查询问题。 4.考虑NoSQL数据库的使用,比如HBase,TiDB等,但是团队必须熟悉这些组件,且有较强的运维能力 5.异步化,将次要流程通过多线程、MQ、甚至延时任务进行异步处理。 限流,需要先考虑业务是否允许限流(比如秒杀场景是允许的),包括前端限流、Nginx接入层的限流、服务端的限流。
对流量进行削峰填谷,通过MQ承接流量。
并发处理,通过多线程将串行逻辑并行化。
预计算,比如抢红包场景,可以提前计算好红包金额缓存起来,发红包时直接使用即可。
缓存预热,通过异步任务提前预热数据到本地缓存或者分布式缓存中。
减少IO次数,比如数据库和缓存的批量读写、RPC的批量接口支持、或者通过冗余数据的方式干掉RPC调用。
减少IO时的数据包大小,包括采用轻量级的通信协议、合适的数据结构、去掉接口中的多余字段、减少缓存key的大小、压缩缓存value等。
程序逻辑优化,比如将大概率阻断执行流程的判断逻辑前置、For循环的计算逻辑优化,或者采用更高效的算法。
各种池化技术的使用和池大小的设置,包括HTTP请求池、线程池(考虑CPU密集型还是IO密集型设置核心参数)、数据库和Redis连接池等。
JVM优化,包括新生代和老年代的大小、GC算法的选择等,尽可能减少GC频率和耗时。
锁选择,读多写少的场景用乐观锁,或者考虑通过分段锁的方式减少锁冲突。
上述方案无外乎从计算和 IO 两个维度考虑所有可能的优化点,需要有配套的监控系统实时了解当前的性能表现,并支撑你进行性能瓶颈分析,然后再遵循二八原则,抓主要矛盾进行优化。
3.2.2 高可用的实践方案
对等节点的故障转移,Nginx和服务治理框架均支持一个节点失败后访问另一个节点。
非对等节点的故障转移,通过心跳检测并实施主备切换(比如redis的哨兵模式或者集群模式、MySQL的主从切换等)。
接口层面的超时设置、重试策略和幂等设计。
降级处理:保证核心服务,牺牲非核心服务,必要时进行熔断;或者核心链路出问题时,有备选链路。
限流处理:对超过系统处理能力的请求直接拒绝或者返回错误码。
MQ场景的消息可靠性保证,包括producer端的重试机制、broker侧的持久化、consumer端的ack机制等。
灰度发布,能支持按机器维度进行小流量部署,观察系统日志和业务指标,等运行平稳后再推全量。
监控报警:全方位的监控体系,包括最基础的CPU、内存、磁盘、网络的监控,以及Web服务器、JVM、数据库、各类中间件的监控和业务指标的监控。
灾备演练:类似当前的“混沌工程”,对系统进行一些破坏性手段,观察局部故障是否会引起可用性问题。
高可用的方案主要从冗余、取舍、系统运维3个方向考虑,同时需要有配套的值班机制和故障处理流程,当出现线上问题时,可及时跟进处理。
3.2.3 高扩展的实践方案
合理的分层架构:比如上面谈到的互联网最常见的分层架构,另外还能进一步按照数据访问层、业务逻辑层对微服务做更细粒度的分层(但是需要评估性能,会存在网络多一跳的情况)。
存储层的拆分:按照业务维度做垂直拆分、按照数据特征维度进一步做水平拆分(分库分表)。
业务层的拆分:最常见的是按照业务维度拆(比如电商场景的商品服务、订单服务等),也可以按照核心接口和非核心接口拆,还可以按照请求源拆(比如To C和To B,APP和H5)。
get请求与post请求有什么区别?
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
2、八股文题目 Java基础 1)为什么Java代码可以实现一次编写、到处运行? 2)一个Java文件里可以有多个类吗(不含内部类)? 3)说一说你对Java访问权限的了解 4)介绍一下Java的数据类型 5)int类型的数据范围是多少? 6)请介绍全局变量和局部变量的区别 7)请介绍一下实例变量的默认值 8)为啥要有包装类? 9)说一说自动装箱、自动拆箱的应用场景 10)如何对Integer和Double类型判断相等? 11)int和Integer有什么区别,二者在做==运算时会得到什么结果? 12)说一说你对面向对象的理解 13)面向对象的三大特征是什么? 14)封装的目的是什么,为什么要有封装? 15)说一说你对多态的理解 16)Java中的多态是怎么实现的? 17)Java为什么是单继承,为什么不能多继承? 18)说一说重写与重载的区别 19)构造方法能不能重写? 20)介绍一下Object类中的方法 集合类 1)Java中有哪些容器(集合类)? 2)Java中的容器,线程安全和线程不安全的分别有哪些? 3)Map接口有哪些实现类? 4)描述一下Map put的过程 5)如何得到一个线程安全的Map? 6)HashMap有什么特点? 7)JDK7和JDK8中的HashMap有什么区别? 8)介绍一下HashMap底层的实现原理 9)介绍一下HashMap的扩容机制 10)HashMap中的循环 链表是如何产生的? 11)HashMap为什么用 红黑树而不用B树? 12)HashMap为什么线程不安全? 13)HashMap如何实现线程安全? 14)HashMap是如何解决哈希冲突的? 15)说一说HashMap和HashTable的区别 16)HashMap与ConcurrentHashMap有什么区别? 17)介绍一下ConcurrentHashMap是怎么实现的? 18)ConcurrentHashMap是怎么分段分组的? 19)说一说你对LinkedHashMap的理解 20)请介绍LinkedHashMap的底层原理 IO 1)介绍一下Java中的IO流 2)怎么用流打开一个大文件? 3)说说NIO的实现原理 4)介绍一下Java的序列化与反序列化 5)Serializable接口为什么需要定义serialVersionUID变量? 6)除了Java自带的序列化之外,你还了解哪些序列化工具? 7)如果不用JSON工具,该如何实现对实体类的序列化? 多线程 1)说一说线程的生命周期 2)说一说线程同步的方式 3)说一说你对volatile关键字的理解 4)说一说synchronized的实现原理 5)创建线程有哪几种方式 JVM 1)说一说你对双亲委派模型的理解 2)介绍一下分代回收机制 3)内存泄漏问题该如何解决 4)内存溢出问题该如何解决 5)JVM包含哪几部分? 框架 1)请描述Spring Boot自动装配的过程 2)说一说你对Spring IoC的理解 3)说一说你对Spring AOP的理解 4)什么是MVC 5)说说你对Spring Boot的理解 Redis 1)说一说Redis的单线程模型 2)缓存穿透、缓存击穿、缓存雪崩有什么区别,该如何解决? 3)说一说你对布隆过滤器的理解 4)说一说hash类型的底层数据结构 5)说一说zset类型的底层数据结构 6)Redis有哪些数据类型 操作系统 1)静态库和动态库如何制作及使用,区别是什么 2) 简述一下 GDB 常见的调试命令 3)请你说说 Linux 中 fork() 函数的作用 4)说一说进程调度算法有哪些 5)说一说 Linux 如何管理内存 6)简述一下 Linux 中的零拷贝 7)说一说什么是大端、小端,如何判断大端和小端 8)简述一下操作系统中的缺页中断 9)说一说虚拟地址空间有哪些部分 10)什么是孤儿进程,什么是僵尸进程,如何解决僵尸进程 11)说一说进程通信的方式有哪些? 12)说说常见信号有哪些,表示什么含义 13)说一说进程有多少种状态,如何转换 14)介绍一下信号量 15)说一说 select 的原理以及缺点 16)说一说 epoll 的原理 17)介绍一下几种 IO 模型 18)说一说软链接和硬链接的区别 计算机网络 网络模型 OSI七层模型 1)TCP/IP四层模型 2)结合OSI模型和TCP/IP模型的五层协议体系结构 3)IP协议的首部结构 4)DNS(域名系统)是什么? TCP/UDP 1)TCP(传输控制协议)是什么? 2)TCP协议的特点有哪些? 3)TCP协议的首部结构 4)TCP协议三次握手和四次挥手的过程 5)TCP协议是怎么保证有效传输的? 6)TCP协议的流量控制和拥塞控制 7)UDP(用户数据报协议)是什么? 8)UDP协议的特点有哪些? 9)UDP协议的首部结构 10)如何让UDP协议变得可靠? 11)TCP协议和UDP协议的区别是什么? 12)HTTP(超文本传输协议)是什么? 13)HTTP协议1.x版本和HTTP协议2.x版本的区别是什么? 14)常见的HTTP协议状态码有哪些? 15)HTTP协议的请求方式有哪些? 16)GET方法和POST方法的区别是什么? 17)常见的HTTP协议请求头有哪些? 18)常见的HTTP协议响应头有哪些? HTTP/HTTPS 1)HTTP协议的缓存策略有哪些? 2)HTTPS(安全超文本传输协议)是什么? 3)HTTPS协议如何保证整个传输过程安全? 4)HTTPS协议对称加密的过程? 5)HTTPS协议非对称加密的过程? 6)HTTPS协议中间人攻击是什么? 7)哪些问题是HTTPS无法解决的? 数据库 1)介绍一下数据库分页 2)介绍一下SQL中的聚合函数 3)表跟表是怎么关联的 4)说一说你对SQL注入的理解 5)如何判断MySQL中的索引有没有生效 6)说一说InnoDB引擎中索引的实现原理 7)MySQL的ACID特性分别是怎么实现的 8)谈谈MySQL的事务隔离级别 9)谈谈InnoDB引擎中的锁 10)InnoDB中的行级锁是怎么实现的 11)说一说你对MySQL引擎的了解 12)说一说你对redo log、undo log、bin log的了解 13)说一说你对MVCC的了解 14)MySQL主从同步是如何实现的 15)你对MySQL的慢查询优化有了解吗
|