自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 面试文章合集

Java 面试题Java 面试题 001 - 010Java 面试题 011 - 020Java 面试题 021 - 030Java 面试题 031 - 040Java 面试题 041 - 050Java 面试题 051 - 060Java 面试题 061 - 070Java 面试题 071 - 080Java 面试题 081 - 090Java 面试题 091 - 100Java 面试题 101 - 110JVM 面试题JVM 面试题 001 - 010JVM 面试题 011

2021-03-03 20:30:47 219 1

原创 Java 删除 List 集合中的元素

正序删除我相信很多同学都写过这样的代码来删除 List 集合内的元素:for (int i = 0; i < list.size(); i++) { if (list.get(i).equals("del")) { list.remove(i); }}这样的代码有一个弊端,在遍历元素的时候部分元素会遍历不到,例如当 i=3 的时候对应的元素删除了,然后 i++ 继续访问后面的元素,由于前面删除元素的原因,后面所有的元素都会向前移一个位置,所以原来 i=4 对应

2021-08-03 23:33:37 1019

原创 Kafka 面试题 001 - 010

001、kafka 的消息模型是什么?发布订阅模型。Topic 是通信载体,发布者发送消息到 Topic,订阅了 Topic 的消费者可以消费到消息。在 kafka 中一个 Topic 可以有多个分区。002、什么是Producer、Consumer、Broker、Topic、Partition?producer 是产生消息的一方consumer 是消费消息的一方broker 相当于一个 kafka 实例,多个 broker 可以组成集群topic:producer 将消息发送到 topic,

2021-03-15 01:08:11 299

原创 Redis 面试题 021 - 030

021、什么是哨兵模式?哨兵是一个独立的进程,它会监控所有 master 节点和 slave 节点,如果哨兵发现 master 节点宕机了,它会选择一个 slave 将其切换成 master,并通知其他 slave 节点。但是一个哨兵进程进行监控的时候还是可能会出现问题,因此可以设置多个哨兵进程进行监控,不同哨兵之间也能彼此感知到,如果一个哨兵感知到 master 节点宕机了并不会立马做出反应,而是会先询问其他哨兵,这种情况被称为主观下线,如果有超过指定数量的哨兵节点都认为 master 节点宕机了,那

2021-03-13 22:33:59 143

原创 Spring 家族面试题 031 - 040

031、什么是 Hystrix?服务熔断的意思是当某服务出现不可用或响应超时的情况时,为了防止整个服务出现雪崩,会暂停对该服务的调用。服务降级指的是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。Hystrix 提供的功能就是当服务 A 调用服务 B 失败次数达到一定阈值的时候,A 不会再去调用 B,而是会去执行本地的降级方法。032、什么是网关?网关就是一个专门处理外部请求的组件,一般都会提供请求转发、权限认证、流量控制、

2021-03-11 17:33:58 165 1

原创 Redis 面试题 011 - 020

011、Redis 内存淘汰机制有什么?volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰allkeys-lru(least recently used

2021-03-07 21:31:14 178

原创 Redis 面试题 001 - 010

001、什么是 Redis?Redis 是一个使用 C 语言开发的内存数据库,读写速度非常快,它提供了多种数据类型来支持不同的业务场景,可以用作缓存、分布式锁甚至是消息队列。002、缓存数据的处理流程?如果用户请求的数据在缓存中存在的话就直接返回,如果不存在的话就看数据库中是否存在,数据库中有的话就更新缓存并返回对应的数据给用户,如果数据库中不存在的话就返回空数据。003、为什么要使用 Redis / 缓存?主要是为了满足系统高性能、高并发的要求。对于那种用户高频访问且不经常更改的数据,如果每

2021-03-07 21:28:45 116

原创 MyBatis 面试题 011 - 020

011、MyBatis 都有哪些 Executor 执行器?它们之间的区别是什么?MyBatis 内部维护了一个 Executor 接口,我们所进行的一系列增删改查操作实际上都是在调用这个接口,该接口有两个实现类,分别是 BaseExecutor 和 CachingExecutor,其中 BaseExecutor 是一个抽象类,它有三个实现 SimpleExecutor、ReuseExecutor、BatchExecutor,Executor 的继承结构如下图所示。SimpleExecutor:默认执

2021-03-03 17:57:07 119 2

原创 Spring 家族面试题 021 - 030

021、什么是 Spring 框架?有什么缺点?Spring 为企业级 Java 应用的开发提供了一种相对简单的方法,通过依赖注入和面向切面编程大大提高了开发效率,并且提高了系统的可维护性和可扩展性。Spring 的组件代码是轻量级的,但它的配置却是重量级的,为了简化配置,后来有创建了 Spring Boot。022、开发 RESTful 服务常用的注解有哪些?Spring Bean 相关@Autowired : 自动导入对象到类中,被注入进的类同样要被 Spring 容器管理。@RestCo

2021-03-03 17:53:39 238 1

原创 Spring 家族面试题 011 - 020

011、谈谈 Spring 中都用到了哪些设计模式?工厂模式:Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。代理模式:Spring AOP 通过动态代理实现。单例模式:Spring 中的 Bean 默认都是单例的。模板模式:Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类都使用到了模板模式。适配器模式:Spring MVC 中用适配器模式适配 Con

2021-03-03 17:24:22 111 1

原创 Spring 家族面试题 001 - 010

001、@RestController vs @Controller?@Controller 直接返回一个视图,广泛应用于前后端不分离的开发。@RestController 只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,广泛应用于前后端分离的开发模式。@Controller 和 @ResponseBody 配合使用效果和 @RestController 一样。002、谈谈你对 IoC 的理解?IoC(控制反转)是一种设计思想,就是将原本在程序中手

2021-03-03 14:31:05 134 1

原创 Java 面试题 101 - 110

101、什么是乐观锁和悲观锁?乐观锁是一种思想,在进行读写操作的时候都不会加锁,但在进行写操作的时候会判断数据是否被修改过。乐观锁适用于读多写少的场景,可以提高吞吐量。悲观锁是一种思想,每次读或写操作都会加锁,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程,适用于写多读少的场景。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁、读锁、写锁等,都是在做操作之前先上锁。Java 中 synchronized 和 ReentrantLock 等独占锁都是悲观锁思想的实现。

2021-03-02 22:07:49 96

原创 Java 面试题 091 - 100

091、JUC 包中的原子类主要有哪些?基本类型使用原子的方式更新基本类型AtomicInteger:整形原子类AtomicLong:长整型原子类AtomicBoolean:布尔型原子类数组类型使用原子的方式更新数组里的某个元素AtomicIntegerArray:整形数组原子类AtomicLongArray:长整形数组原子类AtomicReferenceArray:引用类型数组原子类引用类型AtomicReference:引用类型原子类AtomicStampedRefe

2021-03-02 20:10:40 130

原创 Java 面试题 081 - 090

081、synchronized 关键字和 volatile 关键字的区别?volatile 是线程同步的轻量级实现,性能比 synchronized 好一些volatile 用于修饰变量,synchronized 用于修饰方法和代码块volatile 能保证可见性和有序性,但不能保证原子性;synchronized 能保证可见性和原子性,但不能保证有序性。082、ThreadLocal 是用来干什么的?通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的

2021-03-02 15:32:57 89

原创 MySQL 面试题 011 - 020

011、什么是快照读和当前读?不加锁的 select 操作就是快照读(即不加锁的非阻塞读),它读取的是事务开始后首次快照读的版本,有可能不是最新版本,基于 MVCC 实现,避免了加锁操作,降低了开销。但快照读有一个前提,隔离级别不能是SERIALIZABLE(可串行化),否则也会成为当前读。像 update,delete,insert,select lock in share mode(共享锁),select for update 这些操作都是当前读,读取的是记录的最新版本,会对读取的记录进行加锁,从而

2021-03-02 13:34:38 167

原创 MySQL 面试题 001 - 010

001、MyISAM 和 InnoDB 区别?是否支持行级锁 : MyISAM 只有表级锁(table-level locking),而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。是否支持事务和外键:MyISAM 不支持事务和外键,而 InnoDB 支持事务和外键。是否支持 MVCC(多版本并发控制):仅 InnoDB 支持。应对高并发事务,MVCC 比单纯的加锁更高效;MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔

2021-03-01 14:23:39 192

原创 JVM 面试题 021 - 030

021、堆空间的划分?Java 堆被分为新生代和老年代,新生代又可进一步分为 Eden 区和 Survivor 区。当 Eden 区没有足够空间进行分配或者已经满了的时候,会触发一次 Minor GC,经过这次 GC 后,Eden 区和 From Survivor 区中还存活的对象会进入到 To Survivor 区,然后 Eden 区和 From Survivor 区将会被清空,并且 From Survivor 区和 To Survivor 区将会交换角色,每经过一次 GC,对象的年龄都会加一,当对

2021-02-18 21:31:36 219 2

原创 JVM 面试题 011 - 020

011、不可达对象非死不可吗?在可达性分析算法中被判定不可达的对象不一定非死不可,要宣告这个对象死亡,至少需要经历两次标记过程:在进行可达性分析时发现对象不可达,该对象将会被第一次标记;随后会再进行一次筛选,筛选的条件是此对象是否有必要执行 finalize() 方法,假如对象没有覆盖 finalize() 方法,或者 finalize() 方法已经被虚拟机调用过了,那么虚拟机就认为没有必要执行该对象的 finalize() 方法,如果对象被判定有必要执行 finalize() 方法,那么该对象将会被放在

2021-02-18 17:45:03 169 1

原创 JVM 面试题 001 - 010

001、介绍下 Java 运行时数据区域?Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分成若干个不同的数据区域。根据 Java 虚拟机规范,JVM 所管理的内存分为:虚拟机栈、本地方法栈、程序计数器、堆和方法区,其中虚拟机栈、本地方法栈和程序计数器是线程私有的,而堆和方法区是线程共享的。程序计数器主要有两个方面的作用:其一,字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如顺序执行、选择、循环、异常处理等;其二,在多线程情况下,程序计数器用于记录当前线程执行

2021-02-17 21:08:37 169

原创 Java 面试题 071 - 080

071、synchronized 常见的使用方法?public class MyService { public synchronized static void method1() { } public void method2() { synchronized (MyService.class) { } } public synchronized void method3() { }

2021-02-12 14:08:09 114 2

原创 Java 面试题 061 - 070

061、为什么要使用多线程?从计算机层面考虑,线程可以看做是轻量级进程,线程间切换和线程调度的成本远小于进程,此外,现在是多核 CPU 的时代,多个线程可以并发执行,极大降低了线程上下文切换的开销。从互联网的发展趋势来看,现在很多系统都要求百万级甚至千万级并发量,而多线程正式开发高并发系统的基础,利用好多线程机制可以极大地提高系统的并发能力和整体性能。062、使用多线程可能会带来什么问题?并发编程的目的是提高程序的执行效率,但如果使用不当的话是会带来很多问题的,如内存泄漏、内存溢出、死锁、线程不

2021-02-06 19:06:00 82 1

原创 Java 面试题 051 - 060

051、HashMap 常见的遍历方式?HashMap 遍历方式主要分为以下四大类,每一大类又分为很多小类:迭代器(Iterator)方式遍历EntrySetKeySetFor Each 方式遍历EntrySetKeySetLambda 表达式遍历Streams API 遍历单线程多线程public class Test { public static void main(String[] args) { Map<String, S

2021-02-01 21:38:05 137 1

原创 Java 面试题 041 - 050

041、ArrayList VS VectorArrayList 底层是数组,线程不安全,适合多读的场景使用Vector 底层是数组,线程安全,效率比较低042、ArrayList VS LinkedListArrayList 底层是数组,查询效率高,插入效率低LinkedList 底层是双向链表,查询效率低,插入效率高从内存空间占用的角度来看,ArrayList 主要使用空间浪费表现在列表结尾为预留一定的内存空间,LinkedList 空间花费主要表现在它的每一个元素都比 ArrayLi

2021-01-28 19:57:20 97

原创 Java 面试题 031 - 040

031、Exception 和 Error 的区别?在 Java 中,所有异常都有一个共同的祖先 Throwable 类,Throwable 有两个重要的子类 Exception 和 Error,Exception 和 Error 各自包含大量子类。Exception 是程序本身可以处理的异常,可以通过 catch 来进行捕获,Exception 可以分为可检查异常和运行时异常,可检查异常是可预知的,如果不进行处理程序是无法编译通过的,常见的有 IOException、SQLException 和 C

2021-01-27 16:11:58 88

原创 Java 面试题 021 - 030

021、成员变量和局部变量的区别?成员变量可以被访问控制修饰符及 static 修饰,但局部变量不可以。成员变量是对象的一部分,随着对象的创建而存在,局部变量随着方法的调用而存在,方法调用结束也就随之销毁了。成员变量一般跟随对象存储在堆中,局部变量存储在栈内存中。022、一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?构造方法的主要作用是完成实例对象的初始化工作。一个类即使没有声明任何构造方法,该程序也可以正确执行,因为在没有显示声明任何构造方法的情况

2021-01-18 13:35:02 378 1

原创 Java 面试题 011 - 020

011、Java 语言有哪些特点?面向对象编程,具有封装、继承、多态的特性。平台无关性,因为 JVM 的存在,Java 语言可以一次编译、到处运行。支持多线程和网络编程。简单易学。012、continue、break、和 return 的区别是什么?continue:跳出这一次循环,继续执行下一次循环。break:跳出整个循环体,继续执行循环体后面的代码。return:跳出所在方法,结束该方法的运行,常见用法如下。return;:不返回任何结果,直接结束方法的执行,用于没有返回值的

2021-01-17 18:13:33 116 1

原创 Java 面试题 001 - 010

001、基本数据类型有几种?byte:长 1 字节,8 比特,表示范围 -2^7 ~ 2^7-1char:长 2 字节,16 比特short:长 2 字节,16 比特,表示范围 -2^15 ~ 2^15-1int:长 4 字节,32 比特,表示范围 -2^31 ~ 2^31-1float:长 4 字节,32 比特long:长 8 字节,64 比特,表示范围 -2^63 ~ 2^63-1double:长 8 字节,64 比特boolean:boolean 只有两个值 true 和 false

2021-01-11 11:38:20 185 1

原创 ThreadLocal 详解

1. ThreadLocal 是用来干什么的ThreadLocal 是一个以 ThreadLocal 对象为键、任意对象为值的存储结构,这个结构被附带在线程上,也就是说一个线程可以根据一个 ThreadLocal 对象查询到一个绑定在这个线程上的值。2. ThreadLocal 示例代码如下:public class TestThreadLocal { private static final ThreadLocal<String> STRING_THREAD_LOCAL = n

2021-01-02 21:19:48 7559 3

原创 生产者和消费者

wait / notifywait 会释放锁,但 notify 不会释放锁。public class MyContainer1<T> { private final LinkedList<T> list = new LinkedList<>(); // 最多存 10 个元素 private final int MAX = 10; private int count = 0; public synchronized void p

2021-01-01 17:56:39 194 2

原创 并发工具类之 LockSupport

当需要阻塞或唤醒一个线程的时候,我们可以使用 LockSupport 工具类来完成,它提供的部分方法如下图:测试代码如下:public class TestLockSupport { public static void main(String[] args) { Thread thread = new Thread(() -> { for (int i = 0; i < 10; i++) { System.o

2020-12-30 13:50:24 115

原创 并发工具类之 Exchanger

Exchanger (交换者) 是一个用于线程间协作的工具类。Exchanger 用于进行线程间的数据交换。两个线程通过 exchange() 方法交换数据,第一个线程执行到 exchange() 方法后会一直等待第二个线程也执行 exchange() 方法,当两个线程都到达同步点后,这两个线程就可以交换数据。测试代码如下:public class TestExchanger { private static final Exchanger<String> exchanger =

2020-12-29 21:57:38 175 1

原创 并发工具类之 Semaphore

Semaphore (信号量) 是用来控制同时访问特定资源的线程数量,它可以协调各个线程,以保证公共资源被合理使用。Semaphore 可以用于流量控制,特别是公共资源有限的场景,比如数据库连接。假如同时有 10 个线程需要连接数据库,但数据库的连接数只有 2 个,我们必须控制只有 2 个线程能同时获取数据库连接,否则会报错无法获取数据库连接,这时就可以使用 Semaphore 来做流量控制,代码如下:public class TestSemaphore { private static fin

2020-12-29 21:38:28 144

原创 06. Spring Security 记住我功能

1. 核心流程@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } @Override protected void configure(Authentic

2020-12-27 11:11:00 152

原创 05. Spring Security + Spring Data JPA

1. 项目创建数据库创建一个叫 withjpa 的数据库。2. application.propertiesspring.datasource.username=rootspring.datasource.password=rootspring.datasource.url=jdbc:mysql:///withjpa?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaispring.jpa.d

2020-12-27 11:10:08 168

原创 04. Spring Security 之授权

1. 何谓授权?所谓的授权,就是用户如果要访问某一个资源,我们要去检查用户是否具备这样的权限,如果具备就允许访问,如果不具备,则不允许访问。2. 准备测试用户@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("itming").password("123").roles("

2020-12-27 11:09:26 131

原创 03. Spring Security 之前后端分离

1. 登录交互1.1 登录成功回调代码如下:.and().formLogin().loginPage("/login.html").loginProcessingUrl("/login").usernameParameter("name").passwordParameter("pwd").successHandler((request, response, authentication) -> { Object principal = authentication.getPrin

2020-12-27 11:08:34 379

原创 02. 自定义表单登录页面

Spring Security 默认的表单登录页面很丑,其实我们是可以自定义表单登录页面的。1. 登录接口1.1 服务端定义我们继续上篇文章 SecurityConfig 类的定义,重写它的 configure(WebSecurity web) 和 configure(HttpSecurity http) 方法,代码如下:@Overridepublic void configure(WebSecurity web) throws Exception { web.ignoring().ant

2020-12-27 11:07:06 379

原创 01. 在内存中配置密码的三种方式

创建项目1. 默认用户名和密码首先添加一个 HelloController 类:@RestControllerpublic class HelloController { @GetMapping("/hello") public String hello() { return "Hello World!"; }}然后启动项目,控制台会输出如下内容:Using generated security password: a720ee49-2c4f-406

2020-12-26 21:18:31 365

原创 ReadWriteLock

写锁是一个支持重进入的排它锁,如果当前线程在获取写锁时,读锁已经被获取或者当前线程不是已经获取写锁的线程,则当前线程进入等待状态。读锁是一个支持重进入的共享锁,它可以被多个线程同时获取,在写锁未被任何线程获取的时候,读锁总会被成功的获取,如果写锁已被其他线程获取,则当前线程获取读锁失败,进入等待状态,如果写锁已被当前线程获取,则当前线程可以成功获取读锁。利用读写锁的特性我们可以写一个缓存类,代码如下:public class Cache { static Map<String, Ob.

2020-12-26 21:03:41 104

原创 并发工具类之 CyclicBarrier

public class T07_CyclicBarrier { public static void main(String[] args) { CyclicBarrier barrier = new CyclicBarrier(20, new Runnable() { @Override public void run() { System.out.println("满 20 人,发车!");

2020-12-26 20:05:47 132

空空如也

空空如也

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

TA关注的人

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