Question About CS
hashMap 在JDK1.8做了哪些改动,为什么要改动?
* 在1.7及之前是通过数组+链表实现,在1.8之后加入了`红黑树`用于处理极端情况(链表长度>8)效率过低O(n)->O(log(n)) * 1.7及之前链表采用头插法,当发生哈希冲突时,新节点插入链表头部,老节点一次后移形成新链表结构,在多线程环境下可能会导致成环,主要原因是扩容会使原链表顺序转置,而其他线程无法感知到从而成环 多线程同时调用resize()扩容可能会导致链表指针混乱/红黑树结构破坏引发环问题,即并没有解决线程安全问题只是避免了头插法导致的环情况mysql为什么不建议使用
select *的写法会使二级索引失效,必须回表访问数据行,增加磁盘I/O操作。 * 通过二级索引查找获得id,再通过主键索引查询的过程叫`回表` 比如存在a,b字段二级索引,当直接查询SELECT a,b 时可以直接通过二级索引获取信息,而当SELECT * 时则必须通过全表扫描数据库有哪些异常读取情况,简单说下
脏读:a事务读取到b事务未提交数据,当b事务异常回滚时,那么a事务读取的数据就是错误的 不可重复读:当a事务读取了之后,b事务修改并提交数据,导致a事务再次读取获得不同值 幻读:a事务两次查询中,b事务修改了记录`数量`,导致a食物前后查询记录数量不一索引失效有哪些情况,索引是不是越多越好
1. 联合索引不符合最左匹配原则,如SELECT * FROM table WHERE age = 1 AND id = 1; 当age不存在索引则id的索引也会失效 2. 索引中使用了运算、函数 3. LIKE、OR 的随意使用 4. 对于小表,可能全表扫描开销会更小 ... 不是越多越好,索引在增删改操作时会增加数据库的I/O负荷;每个索引都占用存储空间;什么是消息队列,常见的中间件有哪些(用过哪些)
消息队列是一种异步通信机制,主要用于分布式系统中传递消息 优势:1.生产者消费者之间解耦 2.异步通信 3.负载均衡 4.消息重试、死信 如果是串行业务,消息队列就没有什么优势了 常见的消息中间件:RabbitMQ、Apache Kafka、RocketMQ、NATS什么是序列化和反序列化
序列化是将对象转换为字节流的过程,反序列化则是将字节流转换为对象的过程 应用场景: 1. 持久化,内存中的对象在程序结束/服务器宕机等情况下会被销毁,序列化可以保存对象状态到文件/数据库中,以便重启恢复对象状态 2. 在跨平台传输和网络传输的IO支持的数据格式是字节数组抽象类和接口的区别
抽象是类的抽象,接口是能力的实现 举个例子,动物应该有一个脑袋,四肢 这就是一个抽象类 人作为动物有头有手脚,鸟作为动物有头有翅膀有脚——这是抽象类的实现 动物有运动接口,在人这边体现为跑步,在鸟那边体现为振翅,跑步和振翅则是接口的不同实现java的参数传递有了解么
基本数据类型是值传递 引用数据类型是引用传递 即基本数据类型不会在方法内部修改源变量,引用数据类型可以改变对象属性,但是不能改变对象本身(new 对象) 原理分析:基本类型存储在栈中,引用类型(对象、数组)存在堆内存中,当传入参数时基本数据类型传递的是值的副本,引用类型传递的是内存地址,所以基本数据类型不会被修改,而引用类型可以修改对象的内容但不能修改对象的内存地址
序列化
序列化和反序列化是对象和二进制数据相互转化的行为。只要涉及数据跨空间、时间转移几乎都离不开序列化技术。
- 要实现序列化功能的类必须实现Serializable接口
- transient关键字修饰可以跳过序列化
- serialVersionUID版本号,文件指纹。可以自行定义,不定义会自动生成。
应用场景
分布式系统RPC、Dubbo,微服务通信、Socket网络编程
gRPC几乎HTTP/2+Protobuf,主打通用、跨语言、云原生友好,是跨语言通信的主流选择
Dubbo是阿里开源的高性能JavaRPC框架,基于TCP/HTTP/2+多种序列化(Hessian/JSON/Protobuf),与java深度适配
数据持久化,对象的持久化、缓存系统(redis缓存java对象)
消息队列:异步通信,生产者需要先序列化消息为特定格式,在队列中传输存储,消费者接手后反序列化解析(Kafka、RabbitMQ、RocketMQ)
跨语言交互:不同编程语言的数据结构存在差异,序列化提供通用数据格式,实现跨语言通信