头像

最全 Java 面试笔试题汇总

在最近的面试准备中,发现网上很多 Java 面试题非常零散,没有归纳总结,所以花了很长时间搜集整理出来了这套 Java 面试题大全,希望对大家有帮助哈~

java 基础

集合

HashMap 和 ConcurrentHashMap 的实现原理是怎样的?ConcurrentHashMap 是如何保证线程安全的?

简述 ArrayList 和 LinkedList 的底层实现以及常见操作的时间复杂度

hashmap 和 hashtable 的区别是什么?

HashMap 实现原理,为什么使用红黑树?

HashMap 中的“死锁”是怎么回事?

HashMap 中能 put 两个相同的 key 吗?为什么?

HashMap 中的键值可以为 Null 吗?原理是什么?

HashMap 扩容机制?

hashmap1.7/1.8 实现区别

集合类中的 List 和 Map 的线程安全版本是什么,如何保证线程安全的?

HashMap 的数据结构是什么?如何实现的。和 HashTable,ConcurrentHashMap 的区别

ArrayList 是如何实现的,ArrayList 和 LinedList 的区别?ArrayList 如何实现扩容

简述 BIO、NIO、AIO 的区别

IO 和 NIO 的区别,NIO 优点

其他

hashcode 和 equals 方法的联系

什么是重写和重载?

简述 java 中 final 关键字的作用

简述 java 的反射机制

java 如何高效进行数组拷贝?

成员变量和方法的区别?

java 中接口和抽象类的区别

简述一致性哈希算法的实现及原理

String 类能不能被继承?为什么?

hashcode 和 equals 方法的联系

==和 equals()的区别?

equals 方法实现

面向对象

java web

Cookie 和 Session 的关系和区别是什么?

HTTP 连接池实现原理

JVM

java 中垃圾回收机制中如何判断对象需要回收?常见的 GC 回收算法有哪些?

java 如何防止内存溢出?

java 类的加载流程是怎样的?什么是双亲委派机制?

简述 JVM 内存模型,JVM 内存是如何对应操作系统内存的?

JVM 内存模型是怎样的,简述新生代和老年代的区别

CAS 实现原理是什么?

JVM 是怎么去调优的?简述过程和调优结果

简述 java 的 happer before 原则

JVM 如何加载字节码文件

类加载器如何卸载字节码

有没有看过 JDK 源码,看过的类实现原理是什么

JVM 如何加载字节码文件

JVM GC,GC 算法。

什么情况会出现 Full GC,什么情况会出现 yong GC。

JVM 内存模型

Java 运行时数据区

并发&多线程

java 中的线程有哪些状态,转换关系是怎样的?

synchroinzed 关键字底层是如何实现的?它与 Lock 相比优缺点分别是什么?

volatile 关键字解决了什么问题,它的实现原理是什么?

什么情况下会发生死锁,如何解决死锁?

ThreadLocal 的实现原理是什么?

并发事务会引发哪些问题?如何解决?

java 线程间有多少种通信方式?

简述 synchroinzed、volatile、可重入锁的不同使用场景及优缺点

java 中常见锁有哪些?ReetrantLock 是怎样实现的?

简述生产者消费者模型

手写生产者消费者模型

java 是如何实现线程安全的

java 中的 sleep()和 wait()的区别

java 线程池里的 arrayblockingqueue 与 linkeblockingqueue 的使用场景和区别

Netty 是如何使用线程池的,为什么这么使用

Java 线程池的实现原理,keepAliveTime 等参数的作用

Java 线程的状态

进程和线程的区别,进程间如何通讯,线程间如何通讯

线程状态,BLOCKED 和 WAITING 有什么区别

设计模式

简述常见的工厂模式以及单例模式的使用场景

简述装饰者模式以及适配器模式

实现单例设计模式(懒汉、饿汉)

介绍设计模式,如模板模式,命令模式,策略模式,适配器模式、桥接模式、装饰模式,观察者模式,状态模式,访问者模式

数据库

简述乐观锁以及悲观锁的区别以及使用场景

简述 mysql 常见索引数据,介绍一下覆盖索引

简述事务的四大特性

mysql 为什么用 B+ 树来做索引,对比 B 树它的优点和缺点是什么?

简述脏读和幻读的发生场景,innodb 是如何解决幻读的?

数据库的事务的隔离级别有哪些?各有哪些优缺点?

聚簇索引和非聚簇索引有什么区别?什么情况用聚集索引?

什么是数据库事务,MySQL 为什么会使用 innoDB 作为默认选项?

Mysql 有哪些常见的存储引擎?

数据库有哪些常见索引?数据库设计的范式是什么?

简述数据库中的 ACID 分别是什么?

MySQL 中 Join 和 left join 的区别是什么?

简述 MySQL 三种日志的使用场景

模糊匹配查询是如何实现的?

SQL 优化的方案有哪些,如何定位问题并解决问题?

简述数据库什么情况下进行分库,什么情况下进行分表?

数据库索引的实现原理是什么?

简述什么是最左匹配原则?

数据库的读写分离的作用是什么?如何实现?

唯一索引与普通索引的区别是什么?使用索引会有哪些优缺点?

MySQL 的索引什么情况下会失效?

简述 MySQL 的主从同步机制,如果同步失败会怎么样?

假设建立联合索引(a,b,c),如果对字段 a 和 c 查询,会用到这个联合索引吗?

数据库连接池实现原理

数据库的实现原理

事务的实现原理

索引有什么用?如何建索引?

Redis

redis 如何实现分布式锁?

简述 Redis 的线程模型及底层架构设计

简述 Redis 持久化中的 rdb 以及 aof 方案的优缺点

为什么 Redis 在单线程下能如此的快?

简述 Redis 的过期机制和内存淘汰策略

简述 Redis 哨兵机制

简述 Redis 如何处理热点 key 访问

简述 Redis 中常见类型的底层数据结构

Redis 序列化有哪些方式?

简述 Redis 中如何防止缓存雪崩和缓存击穿

Redis 有几种数据结构?Zset 是如何实现的?

Redis 中 key 的过期策略有哪些?

简述 Redis 跳表的应用以及优缺点

Redis 中 sentinel 和 cluster 的区别和适用场景是什么?

Redis 如何实现延时队列,分布式锁的实现原理

假设 Redis 中的 master 节点宕机了,你会怎么进行数据恢复?

为什么要用 Redis,Redis 有哪些优缺点?Redis 如何实现扩容?

Redis 缓存和数据库数据一致性

Mq

kafka 发送消息是如何保证可靠性的?

消息中间件是如何实现的,技术难点有哪些

Spring

简述 Spring 的初始化流程

简述 SpringAOP 原理

SpringMVC 的原理和流程

spring 循环依赖,为什么要用三级缓存,二级缓存行不行

为什么要使用 Spring,Spring 的优缺点有哪些

Spring 的 IOC 容器初始化流程

Spring 的 IOC 容器实现原理,为什么可以通过 byName 和 ByType 找到 Bean

Spring AOP 实现原理

spring 中 bean 的生命周期

spring 创建 bean 的流程

什么是 spring 的循环依赖问题

spring 循环依赖问题如何解决

为什么 spring 使用三级缓存解决循环依赖问题

spring 循环依赖源码解析

修改 spring 源码尝试二级缓存是否解决循环依赖问题

Spring boot

springboot 是如何进行自动配置的

分布式

分布式事务,两阶段提交。

如何实现分布式锁

如何实现分布式 Session

如何保证消息的一致性

负载均衡

正向代理(客户端代理)和反向代理(服务器端代理)

CDN 实现原理

怎么提升系统的 QPS 和吞吐量

系统设计

电商系统中,如何实现秒杀功能?如何解决商品超卖问题?

简述 CAP 理论

什么是最终一致性?

什么是幂等操作?

简述生产者消费者模式的流程

设计一个阻塞队列

简述 MapReduce 的原理

停车场有有限个车位,有多个车来抢车位,设计一个系统需要根据车辆进入和离开停车场的时间进行计费

假如明天是活动高峰?QPS 预计会翻 10 倍,你要怎么做?

如何搭建一个高可用系统

哪些设计模式可以增加系统的可扩展性

抽象能力,怎么提高研发效率。

什么是高内聚低耦合,请举例子如何实现

什么情况用接口,什么情况用消息

如果 AB 两个系统互相依赖,如何解除依赖

如何写一篇设计文档,目录是什么

什么场景应该拆分系统,什么场景应该合并系统

系统和模块的区别,分别在什么场景下使用

实战

有没有处理过线上问题?出现内存泄露,CPU 利用率标高,应用无响应时如何处理的

开发中有没有遇到什么技术问题?如何解决的

如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能。

新浪微博是如何实现把微博推给订阅者

Google 是如何在一秒内把搜索结果返回给用户的。

12306 网站的订票系统如何实现,如何保证不会票不被超卖。

如何实现一个秒杀系统,保证只有几位用户能买到某件商品

看过哪些开源框架的源码

网络

HTTP 协议

TCP 协议

非技术

项目中最难的地方是哪里?你学到了什么?

对加班有什么看法?

你的优势和劣势是什么?

与同事沟通的时候,如果遇到冲突了如何解决?

最近一年内遇到的最有挑战的事情是什么?

如何学习一项新技术,比如如何学习 Java 的,重点学习什么

有关注哪些新的技术

工作任务非常多非常杂时如何处理

项目出现延迟如何处理

和同事的设计思路不一样怎么处理

如何保证开发质量

职业规划是什么?短期,长期目标是什么

团队的规划是什么

能介绍下从工作到现在自己的成长在那里

作者:GilesLv
链接:https://ld246.com/article/1609340934105
来源:链滴
协议:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

头像

java实现替换json字符串参数值

以下是代码:

String str="{\"code\":\"na7ne\",\"identity\":1671760031645,\"password\":\"88888888\",\"username\":\"fuj\"}";
JSONObject jsonObject = JSON.parseObject(str);
System.out.println(str);
for(Map.Entry<String,Object> map: jsonObject.entrySet()){
    if(map.getKey().contains("password"))
        JSONPath.set(jsonObject,"$."+map.getKey(),"***");
}
System.out.println(jsonObject.toJSONString());

以下是输出内容:

{"code":"na7ne","identity":1671760031645,"password":"88888888","username":"fuj"}
{"password":"***","code":"na7ne","identity":1671760031645,"username":"fuj"}
头像

MYBATIS-PLUS 多数据源-读写分离

前言

最近翻了下mybatis-plus官方文档,发现多数据源这一块,提供了读写分离的功能。之前系统使用的sharding sphere插件实现读写分离(没有使用分库分表,业务上不去),总结有以下缺陷:
1、单纯使用读写分离,也受到SQL不支持项的约束
2、项目启动时,加载meta数据时间比较长(200+的表,本地开发加载12000+ms,测试环境4000+ms)
3、打印的sql执行日志,换行比较多,也不像mybatis打印的SQL那么容易还原(或者直接通过插件还原)
既然mybatis-plus提供了读写分离功能,系统中本来也集成了mybatis-plus,于是决定改用mybatis-plus提供读写分离。

PS:自己也找过很多方式尝试,失败了!!!

过程

官网地址

mbatis-plus
mybatis-plus 多数据源

过程

按照官网指引

引入DYNAMIC-DATASOURCE-SPRING-BOOT-STARTER

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>

配置数据源,使用HIKARI连接池

spring:
  datasource:    
    dynamic:
      p6spy: false
      hikari:
        connection-test-query: SELECT 1
        minimum-idle: 60
        idle-timeout: 30000
        maximum-pool-size: 500
        auto-commit: true
        max-lifetime: 120000
        connection-timeout: 30000
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://xxx:3306/xxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
          username: xxx
          password: xxxx
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.zaxxer.hikari.HikariDataSource
          hikari:
            pool-name: masterHikariPool
        slave_1:
          url: jdbc:mysql://xxxx:3308/xxxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
          username: xxx
          password: xxxx
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.zaxxer.hikari.HikariDataSource
          hikari:
            pool-name: slave1HikariPool

注意,在官网的示例里,默认是使用druid连接池,要修改为hikari,必须指定type:com.zaxxer.hikari.HikariDataSource,不然都是使用druid,而且该starter使用的druid版本,还是会有localDateTime转换出错的问题

使用读写分离模式

    @Bean
    public MasterSlaveAutoRoutingPlugin masterSlaveAutoRoutingPlugin(){
        return new MasterSlaveAutoRoutingPlugin();
    }

开启日志打印

logging:
  level:
  	com.baomidou.dynamic: debug

注意,这个是全局配置,可以不用@DS注解在每个类上,当然也可以注解,注解了@DS,则按照@DS注解进行

 

网址来源:https://www.freesion.com/article/65781031315/

头像

win10修改ip,出现了一个意外的情况。不能完成所有你在设置中所要求的更改。

今天在调试硬件设计,需要修改网段信息。在修改的时候弹出以下窗口,提示修改失败。

微信截图_20220531175114

 

可以通过cmd 方式修改,执行 netsh interface ip set address “以太网” static 192.168.1.194 255.255.255.0

如果要修改为自动获取ip,执行:netsh interface ip set address “以太网” source=dhcp

头像

[postgresql] – 重复数据删除,仅保留其中一条

1.常规删除方法
explain analyse delete from deltest a where a.ctid <> (select min(t.ctid) from deltest t where a.id=t.id);
2.group by删除方法
explain analyse delete from deltest a where a.ctid not in (select min(ctid) from deltest group by id);
3.row_number删除方法
explain analyze delete from deltest a where a.ctid = any(array (select ctid from (select row_number() over (partition by id), ctid from deltest) t where t.row_number > 1));

根据某个字段分组删除重复数据,只保留日期最大的一条,建议使用窗口函数效率更高

头像

.Net 中Json序列化实体时忽略部分属性

接口对接中,返回的实体想要部分字段不被序列化返回。以前的做法是新建一个类做深拷贝,后来发现这方法不是很友好。

找了个不错的方法如下:

using Newtonsoft.Json;
namespace Actuator.Contacts
{
[JsonObject(MemberSerialization.OptIn)]
class ZJ
{
[JsonProperty]
public string seqid; //Varchar(50) 每条记录的时间戳标识,精确到毫秒
[JsonProperty]
public string code; //Varchar(200)设备号(终端 SN 号)
[JsonProperty]
public string pileCode;// Varchar(50) 桩编号由施工现场定义,一般为桩号

[JsonProperty]
public int isResultData = 1; // Int 是否为施工结果数据 1是,0否

[JsonIgnoreAttribute]
public int KeyId { get; set; }

}
}

附带解释
JsonObjectAttribute
这个标签的成员序列化标志指定成员序列化是opt-in(要序列化的成员必须带有JsonProperty或DataMember标签)还是opt-out(默认所有的都会序列化,但通过JsonIgnoreAttribute标签可以忽略序列化。opt-out是json.net默认的)。

JsonPropertyAttribute
允许被序列化的成员自定义名字。这个标签同时标示出:在成员序列化设置为opt-in的时候,成员会被序列化。

JsonIgnoreAttribute
忽略域或属性的序列化

JsonConverterAttribute
用于指派转换对象的JsonSerializer。
这个标签可以修饰类或类成员。用于修饰类时,通过此标签指派的JsonConverter会被设置为序列化类的默认方式。用于修饰属性或域成员时,被指派的JsonConverter会序列化它们的值

[XmlIgnore]
忽略xml 序列化

头像

Postgres数据库忘记密码,只需三个步骤重置

Postgres数据库忘记密码,三个步骤解决
一、修改data目录下的 pg_hba.conf 文件
将以下这行
host    all            all           127.0.0.1/32          md5
改为如下:
host    all            all           127.0.0.1/32          trust
如果开启ipv6的话,以下也要修改
# IPv6 local connections:
host all all ::1/128 trust
二、运行cmd,进入postgres安装路径的bin目录,运行如下命令:
psql -U postgres
postgres=# alter user postgres with password ‘你要设置的密码';
postgres=# \q 
三、修改data目录下的 pg_hba.conf 文件
将以下这行

host  all   all  127.0.0.1/32  trust
改为如下:
host  all   all  127.0.0.1/32  md5
ipv6的密码方式也修改
重新启动postgres