常见的java面试题总结
八大基础类型整形: byte short int long
浮点型: float double
布尔型: boolen
字符型: char
访问修饰符区别
类型转换float f=3.4;是否正确?答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。
short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其 ...
java八股文之hashmap
基本认识12345678910111213//默认初始容量 - 必须是2的幂次方static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //hashmap的最大容量 2的30次方static final int MAXIMUM_CAPACITY = 1 << 30;//负载因数static final float DEFAULT_LOAD_FACTOR = 0.75f;//链表数量达到八开始向红黑树转换static final int TREEIFY_THRESHOLD = 8;//当红黑树的节点少于6时,则转换为单链表存储static final int UNTREEIFY_THRESHOLD = 6;//虽然在hash冲突发生的时候,默认使用单链表存储,当单链表节点个数大于8时,会转换为红黑树存储//但是有一个前提(很多文章都没说):要求数组长度大于64,否则不会进行转换,而是进行扩容。static final int MIN_TREEIFY_CAPACITY = 64;
...
主要是来介绍threadlocal的使用和注意点
使用场景在任何一个类里面想用的时候直接拿出来使用
基础认识threadlocal其实主要是使用threadlocalmap来存储数据的,key是线程id,value是对应的值,value值默认为null
主要方法set12345678public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value);}
get12345678910111213public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLoca ...
主要介绍kafka的基本知识
架构
组成
Producer:生产者,也就是发送消息的一方。生产者负责创建消息,然后将其发送到 Kafka。
Consumer:消费者,也就是接受消息的一方。消费者连接到 Kafka 上并接收消息,进而进行相应的业务逻辑处理。
Consumer Group:一个消费者组可以包含一个或多个消费者。使用多分区 + 多消费者方式可以极大提高数据下游的处理速度,同一消费组中的消费者不会重复消费消息,同样的,不同消费组中的消费者消息消息时互不影响。Kafka 就是通过消费组的方式来实现消息 P2P 模式和广播模式。
Broker:服务代理节点。Broker 是 Kafka 的服务节点,即 Kafka 的服务器。
Topic:Kafka 中的消息以 Topic 为单位进行划分,生产者将消息发送到特定的 Topic,而消费者负责订阅 Topic 的消息并进行消费。
Partition:Topic 是一个逻辑的概念,它可以细分为多个分区,每个分区只属于单个主题。同一个主题下不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到 ...
主要是修改init.gradle文件配置
全部内容如下
12345678910111213141516171819allprojects { repositories { maven { url "https://maven.aliyun.com/repository/public" } //有一个依赖,public中没有,所以需要spring maven { url "https://maven.aliyun.com/repository/spring" } maven { name "ALIYUN_CENTRAL_URL" // name 可以不需要 url 'https://maven.aliyun.com/nexus/content/repositories/central' } ma ...
主要是用来介绍各种垃圾回收器的执行过程和优缺点
垃圾回收器的种类Serial收集器最早的垃圾回收器,是个单线程工作的收集器,但是他的单线程并不是真的垃圾会受到时候真的使用的是单线程,而是说进行垃圾回收的时候,会stop the world ,会停止所有的用户线程工作
特点:
垃圾回收的时候,会停止所有的用户线程进行工作
在资源受限的情况下,与其他收集器的单线程相比,效率依然是最高的
ParNew收集器其实这就是Serial收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之外,其余的行为都和Serial收集器一样
特点:
除了Serial收集器外,目前只有它能与CMS收集器配合工作
一般来说是CMS和ParNew来一起使用,CMS 主要用来回收老年代,ParNew主要用来回收新生代
Parallel Scavenge收集器Parallel Scavenge收集器也是一款新生代收集器,它同样是基于标记-复制算法实现的收集器
特点:
它主要关注的点是达到一个可控制的吞吐量
自适应调节策略:自动进行内存的调优
Serial Old收集器Serial Old是Serial ...
常用参数和日志打印
常用设置
参数
解释
-Xms
java堆内存的大小
-Xmx
java堆内存的最大大小
-XX:PeremSize
永久代大小
-XX:MaxpermSize
永久代最大大小
-Xmn
堆内存中的新生代大小
-Xss
每个线程栈内存的大小
-XX:Max Tenuring Threshold
多少岁进入老年代,默认是15
-XX PretenureSize Threshold
对象多大直接进入老年代,不经过新生代
-XX HandlePromotionFailure
是否要进行判断 判断老年代的内存大小是都大于之前每一次minor gc之后的进入老年代的对象的平均大小
-XX:SurvivorRatio=8
表示eden区域占比为80%
-XX: +UseParNewGC
定垃圾回收器为ParNew,一般来说机器是几核,垃圾回收器并发执行的线程就会有几个,四核机器就是4个,8核机器就是8个
-XX:ParallelGCThreads
设置垃圾回收器使用线程数量,一般来说不要动
-XX: New ...
JVM内存模型的初步认识
内存模型
堆
上图其实就是jdk1.8之前和之后的一个堆内容的区别,就是把永久代改名为元空间而已
如上图所示
方法区、堆是所有线程共享的,java栈、本地方法栈、程序计数器都是线程私有的
默认情况下,JVM使用的内存的最大内存为电脑内存的四分之一,初始化的内存为六十四分之一
内存布局
对象头对象头中主要是有两类数据
官方称它为“Mark Word”,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等
类型指针,即对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类的实例
通过类型指针来确定该对象是哪个类的实例。并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身
果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。
实例数据这部分是 ...
了解spring事务机制
what简单来讲,就是操作要么一起成功,要么一起失败;主要的目的是为了保证数据的一致性
事务传播机制
required
如果当前没有事务,就自动创建一个新的事务,如果当前存在事务,就加入该事务
supports
支持当前事务,如果当前存在事务,就加入该事务,如果没有,就以非事务的方式来执行
mandatory
如果当前有事务执行事务,如果没有事务会报异常
request_new
无论当前有没有事务都要创建一个新的事务
not_supported
以非事务的方式执行,如果存在事务,将该事务挂
never
以非事务的方式执行,如果存在事务,就抛出异常
nested
如果当前存在事务,会嵌套在事务内部执行(如果外层事务回滚,会导致内存层事务回滚,如果内层事务回滚,只会回滚自己的事务),相当于加入已经存在的事务当中,如果当前没有事务,则按required属性执行
how日常使用最多的应该就是@transactional 注解
注意有一个使用!@transcational失效的情况
失效情况链接
详细redis的数据类型
Stringwhat12345678910111213141516171819202122232425262728293031set name shy #设置name为shy的键值对get name #获取键为name的值keys * #查看所有键值对exits key名字 #返回1,表示key存在,0表示不存在move key名字 1 #1表示当前数据库,删除keyexpire key名字 10 #设置key名字的过期时间为10秒ttl key名字 #查看key名字的过期时间还剩多少秒type key名字 #key的类型append key名字 值 #向key的值追加数据strlen key名字 #获取key的长度incr key #给key+1decr key #给key-1incrby key 步长 #key每次加多少decrby key 步长# key每次减多少getrange key 0 3 #截取字符串从0到3getrange key 0 -1 #查看所有内容setrange key 1 xx #将第1 ...