自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 29.Java集合框架面试题

(1)HashMap和HashTable的区别1.HashMap不是线程安全的HashMap是map接口的实现类,是将键映射到值得对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。

2021-04-09 20:49:34 132

原创 28.ZooKeeper面试题

(1)ZooKeeper是什么ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。有序性是zookeeper中非常重要的一个特性,所有的更新都是全局有序的,每个更新都有一个唯一的时间戳。(2)ZooKeeper提供什么1.文件系统2.通知机制(3)ZooKeeper文件系统ZooKeeper提供了一个多层级的节点命名空间(节点称为znode),这些节点可以设置关联的数据。ZooKeeper为了保证高吞

2021-04-09 15:52:32 102

原创 27.Dubbo面试题

(1)Dubbo是什么?Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。只有在分布式的环境下才有使用Dubbo分布式服务框架的需求。核心部分:1.远程通讯:提供对多种基于长连接的NIO框架抽象封装(多线程模型、序列化)2.集群容错:提供基于接口方法的透明远程过程调用(多协议支持,软负载均衡)3.自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方。(2)Dubbo能做什么?1.透明化的

2021-04-09 10:50:59 104

原创 26.如何判断一个对象是否存活(GC对象的判定方法)

(1)引用计数算法给对象添加一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1;任何时刻计数器为0的对象是不能被引用的。但是某些代码会出现对象之间互相循环引用的问题。对象循环引用代码实例:public class ReferenceCountingGC { public Object instance = null; public static void testGC() { ReferenceCountingGC objA = new Re

2021-04-09 10:26:39 435

原创 25.MySQL三道常见的面试题

(1)MySQL查询字段区不区分大小写?不区分如何解决需要区分英文大小写的场景例如登录用户为admin,此时填写ADMIN也能登录,如果用户名需要区分大小写,解决方案是什么?解决方案一:MySQL默认的字符检索策略:utf8_general_ci,表示不区分大小写。可以使用utf8_general_cs,表示区分大小写,也可以使用utf8_bin,表示二进制比较,同样也区分大小写。创建表时,直接设置表的collate属性为utf8_general_cs或者utf8_bin;如果已经创建表,则直

2021-04-08 20:20:55 59

原创 24.单例模式的优缺点,注意事项,使用场景

(1)单例模式介绍在应用单例模式时,单例对象的类保证只有一个实例存在,许多时候整个系统只需要拥有一个全局对象,有利于协调系统整体的行为。(2)单例模式实现思路1.一个类能返回对象一个引用和一个返回该实例的方法(必须是静态方法,通常用getInstance名称);2.调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;3.将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类

2021-04-08 15:09:33 594

原创 23.关于IO同步、异步、阻塞、非阻塞的区别

blocking IOnonblocking IOIO multiplexingasynchronous IO对于一个network IO(read),会涉及两个系统对象,一是调用这个IO的线程thread,另一个是系统内核kernel。当一个read操作发生时,会经历两个状态:1.等待数据准备2.将数据从内核拷贝到进程中(1)blocking IO系统内核准备数据时,要等待数据到来,而在用户进程这边,整个进程会被阻塞,当系统内核一直等到数据准备好了,会把数据从内核拷贝到内存,内核返回结果,

2021-04-08 11:06:37 74

原创 22.为什么需要消息队列?使用消息队列有什么好处?

(1)消息队列的特性1.与业务无关:消息队列不需要考虑上层的业务模型,只需要做好消息的分发,上层业务的不同模块反而需要依赖消息队列所定义的规范进行通信。2.FIFO:具有队列先进先出的特性。3.容灾:节点的动态增删和消息的持久化。4.性能:消息队列的吞吐量会提高内部通信效率。(2)为什么需要消息队列当系统中出现“生产”和“消费”的速度或稳定性因素不一致时,就需要消息队列。消息队列是在消息的传输过程中保存消息的容器。举几个例子:1.业务系统触发短信发送申请,但短信发送模块速度跟不上,需要将来不

2021-04-08 09:51:21 542

原创 20.HashMap为什么线程不安全

(1)jdk1.7中的HashMapjdk1.7多线程环境下HashMap容易出现死循环,死循环发生在HashMap的扩容函数transfer函数里,jdk1.7中HashMap的transfer函数如下:void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { whi

2021-04-07 21:06:48 95 2

原创 19.为什么Java线程没有Running状态

(1)一个在JVM中执行的线程处于Runnable这一状态,runnable状态与ready状态的区别为:处于 runnable 状态下的线程正在 Java 虚拟机中执行,但它可能正在等待来自于操作系统的其它资源,比如处理器。显然,runnable状态实质上是包括了ready状态的。(2)对于Java线程状态来说,不存在running状态,runnable状态包含了running状态。现在的时分多任务操作系统架构通常都是“时间分片”方式进行抢占式轮转调度。更复杂的可能还会加入优先级(priority)

2021-04-07 17:21:58 138 2

原创 18.Java序列化与反序列化

(1)Java序列化与反序列化是什么Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程:序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象状态的保存与重建。反序列化:客户端从文件中或网络上获得序列化后的对象字节流,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。(2)为什么需要序列化和反序列化1.对象序列

2021-04-06 10:07:52 52

原创 17.ArrayList和LinkedList的用法分析

ArrayList和LinkedList是Java集合框架里用来存储对象引用列表的两个类。ArrayList和LinkedList都实现了List接口。列表(list)是元素的有序集合,也称为序列。它提供了基于元素位置的操作,有助于快速访问、添加和删除列表中特定索引位置的元素。List 接口实现了 Collection 和 Iterable 作为父接口。它允许存储重复值和空值,支持通过索引访问元素。(1)增加元素到列表尾端在ArrayList中增加元素到队列尾端的代码如下:public boolea

2021-04-06 09:44:25 552

原创 16.HashMap怎样解决hash冲突

HashMap 采用Hash算法来决定每个元素的存储位置,当程序执行map.put(String,Object)方法时,**这里之所以HashMap 常用String对象作为Key是因为String对象的hashcode()值是根据String对象的内容去计算的,而不是根据对象的地址计算。String 对象底层是一个 final 修饰的 char 类型的数组,hashCode() 的计算是根据字符数组的每个元素进行计算的,所以内容相同的 String 对象会产生相同的散列码。**系统调用String的has

2021-04-05 11:35:45 406

原创 15.多线程面试题

(1)有三种方式可以用来创建线程:1.继承Thread类2.实现Runnable接口3.应用程序可以使用Executor框架来创建线程池三种方法相比较而言,实现Runnable接口更受欢迎,因为Java不支持多继承,所以如果类本身以及继承了别的类,只能选择实现Runnable接口来创建线程。(2)线程的几种可用状态新建(new):新创建一个线程对象;可运行(runnable):线程对象创建后,其他线程来调用该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CP

2021-04-04 21:42:29 64

原创 14.进程与线程的区别

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统资源分配调度的一个独立单位。线程是进程的一个实体,是cpu调度和分派的基本单位,是比进程更小的能独立运行的基本单位。只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),可与同属一个进程中的其他线程共享所拥有的全部资源。进程和线程的区别1.进程是资源分配的最小单位,线程是程序执行的最小单位;2.进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间。建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地

2021-04-04 17:51:09 103

原创 13.Redis的过期策略

Redis采用的是定期删除+懒惰删除策略。(1)定期删除策略Redis会将每个设置了过期时间的key放入到一个独立的字典里,默认每100ms进行一次过期扫描:1.随机抽取20个key2.删除这20个key中过期的key3.如果过期的key比例超过1/4,重复步骤1,继续删除。问题1:为什么不扫描所有的key由于redis是单线程,而且为了防止每次扫描过期的 key 比例都超过 1/4,导致不停循环卡死线程,Redis 为每次扫描添加了上限时间,默认是 25ms。问题2:为什么 Redis 每

2021-04-04 17:28:53 81

原创 12.单点登录的实现原理

(1)共享Session将用户认证信息保存在Session中,即以Session内存储的值为用户凭证。解决方案:使用基于Redis的Session共享方案,将Session存储在Redis上,将整个系统的全局Cookie Domain设置于顶级域名上,这样SessionID就能在各个子系统间共享。存在限制:1.Session中所涉及的类型必须是子系统中共同拥有的。2.跨顶级域名的情况完全无法处理。(2)基于OpenId的单点登录将用户的身份标识信息简化为OpenId存放在客户端,当用户登录某个

2021-04-04 16:08:50 78

原创 11.分布式系统接口,如何避免表单的重复提交?

硬件架构改进:主要是使用阿里云多组件的云环境,通过负载均衡SLB,模板克隆的云服务器ECS。云数据库RDS,共享对象存储OSS等不同职责的云产品组合实现。软件架构优化:主要是软件代码开发的规范,业务解耦合,架构微服务,单机无状态化,文件存储共享等。(1)幂等性系统对某接口的多次请求,都应该返回同样的结果。避免因为各种原因,重复请求导致业务重复处理。重复请求场景案例:1.客户端第一次请求后,网络异常导致收到请求执行逻辑但是没有返回给客户端,客户端重新发起请求2.客户端迅速点击按钮提交,导致同一逻辑

2021-04-02 10:48:24 180 1

原创 10.Redis面试常见问答

(1)什么是缓存雪崩?怎么解决?用缓存来缓冲外部请求对数据库的冲击,缓存每秒可抗住1万请求,如果宕机,请求将直接打在数据库上,造成数据库宕机,从而导致整个系统宕机。2种策略(同时使用)1.对缓存做高可用,防止缓存宕机。2.使用断路器,如果缓存宕机,为了防止系统全部宕机,限制部分流量进入 DB,保证部分可用,其余的请求返回断路器的默认值。(2)什么是缓存穿透?怎么解决?(2.1)缓存查询一个没有的Key,同时数据库也没有,如果黑客大量使用这种方式,会导致数据库宕机。解决方案:使用一个默认值来防止

2021-04-01 21:49:24 51

原创 9.hashCode()和equals()之间的关系

equals()作用是用来判断两个对象是否相等。hashCode()的作用是获取哈希码,返回一个int类型的整数,来确定该对象在哈希表中的索引位置。(1)不会创建“类对应的散列表”在这种情况下,该类的“hashCode() 和 equals() ”没有关系。equals() 用来比较该类的两个对象是否相等。而hashCode() 则根本没有任何作用。public class NormalHashCodeTest{ public static void main(String[] args)

2021-04-01 17:27:18 72

原创 8.Object类下面有几种方法?

Java语言是一种单继承结构语言,Java中所有的类都有一个共同的祖先。这个祖先就是Object类。如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类。(1)Object()Object类的构造方法。(2)registerNatives()使JVM发现本机功能,调用使用C/C++编写的本地方法。(3)clone()用来另存一个当前存在的对象,只有实现了Cloneable接口才能调用该方法,否则抛出CloneNotSupportedException异常。(4)ge

2021-04-01 11:20:51 74

原创 7.Redis中是如何实现分布式锁的?

(1)Redis要实现分布式锁,需要满足以下三点:互斥性:在任意时刻,只有一个客户端能够持有锁。不能死锁:客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。容错性:只要大部分Redis节点正常运行,客户端就能加锁和解锁。//获取锁(unique_value可以是UUID等)SET resource_name unique_value NX PX 30000//释放锁(lua脚本中,一定要比较value,防止误解锁)if redis.call("get",KEYS[1])

2021-04-01 10:33:40 49

原创 6.单例模式有几种写法?

(1)饱汉模式1.1基础饱汉模式程序启动时并不着急进行初始化单例,等调用到获取实例的方法时再进行初始化,即为“懒加载”。核心为“懒加载”,优点是启动速度快、节省资源,缺点是写起来麻烦且线程不安全。public class Singleton1 { private static Singleton1 singleton = null; private Singleton1() { } public static Singleton1 getInstance() { if (sin

2021-03-31 15:59:18 40

原创 5.消息队列中,如何保证消息的顺序性?

RabbitMQ一个queue,多个consumer,比如,生产者向RabbitMQ发送三条数据,顺序依次为data1/data2/data3,压入RabbitMQ的内存队列。有三个消费者分别从MQ中消费这三条数据,如果消费者2先执行完操作,把data2存入数据库,会导致数据同步顺序错乱。解决方案:(1)RabbitMQ:拆分为多个queue,每个queue对应一个consumer,consumer内部用内存队列做排队,分发给底层不同的worker来处理。(2)Kafka:写入多个内存queue,将

2021-03-31 15:02:54 309

原创 4.分库分表后,id主键如何处理?

(1)使用数据库的自增id系统里每次得到一个id,往一个库的一个表中插入一条没什么含义的数据,获取到数据库自增的id,将这个id向对应的分库分表中写入。(2)UUID本地生成,但是UUID过于长,占用空间大,作为主键性能太差了。且UUID不具有有序性,会导致B+树索引在写的时候有过多的随机写操作,这种操作在占用空间比较大的情况下,性能下降比较明显。不建议使用UUID作为主键。(3)获取系统当前的时间获取当前时间,缺点是,当并发量很高时,会出现重复的情况。(4)snowflake 算法snowf

2021-03-30 22:41:30 268

原创 3.如何决定使用HashMap和TreeMap?

TreeMap<K,V>的Key值要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树的结构,适用于自然顺序或自定义顺序遍历Key。HashMap<K,V>的Key值实现散列hashcode(),分布是散列的、均匀的,不支持排序;数据结构为数组、链表、红黑树。适用于在Map中插入、删除和定位元素。结论:如果需要得到一个有序的结果应该使用TreeMap,因为Hash Map中元素的排列顺序是不固

2021-03-30 22:28:40 151

原创 2.Spring框架中Bean的生命周期

(1)实例化Bean(2)IoC注入:按照Spring上下文对实例化的Bean进行配置。(3)如果Bean实现了BeanNameAware接口,调用setBeanName(String)方法。(4)如果Bean实现了BeanFactoryAware接口,调用setBeanFactory(setBeanFactory(BeanFactory))方法。(5)如果Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationCon

2021-03-30 22:16:45 62

原创 1.Spring,SpringMVC,SpringBoot,SpringCloud有什么区别和联系?

1.Spring,SpringMVC,SpringBoot,SpringCloud有什么区别和联系?(1)Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的java开发容器框架,针对开发的web层、业务层、持久层等都提供了多种配置方案。(2)SpringMVC是Spring的一个模块,一个web框架。通过Dispatcher Servlet,ModelAndView和View Resolver,开发web应用变得容易。(3)SpringBoot框架相对于SpringMVC框架来说,更专

2021-03-30 21:59:02 235

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除