Q&A

1. 问:jvm内存模型

答:https://www.cnblogs.com/SaraMoring/p/5713732.html

2. 问:Integer.class,int.class,Integer.TYPE区别;int.class,int[].class;

答:

System.out.println(int.class.isPrimitive()); // 判断是不是原始类型
System.out.println(int.class == Integer.class);//int类型和Integer类型是不一样的,一个是基本类型,一个是对象类型
System.out.println(int.class == Integer.TYPE);//8中数据基本类型都对应与其对象类型中的TYPE字段 
System.out.println(int[].class.isPrimitive());//数组类型不是原始类型,数组是一个对象类型即int[]是一个Object
--输出--
true
false
true
false

3. 问:tar 与 gzip

答:

  • tar 只是打包动作,相当于归档处理,不做压缩;解压也一样,只是把归档文件释放出来。
  • tar.gz tgz (tar.gz和tgz只是两种不同的书写方式,后者是一种简化书写,等同处理)这种格式是Linux下使用非常普遍的一种压缩方式,兼顾了压缩时间(耗费CPU)和压缩空间(压缩比率),其实这是对tar包进行gzip算法的压缩
  • gzip还用作http传输,用来压缩文本,减少传输量,压缩比3-10倍

4. 问:自定义注解

答:

  1. 注解的用处:
    1)生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
    2)跟踪代码依赖性,实现替代配置文件功能。比如Dagger 2依赖注入,未来java开发,将大量注解配置,具有很大用处;
    3)在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
  2. 注解的原理:
    注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池
  3. 元注解:
    java.lang.annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):
    @Documented –注解是否将包含在JavaDoc中
    @Retention –什么时候使用该注解
    @Target –注解用于什么地方
    @Inherited – 是否允许子类继承该注解
    1.)@Retention– 定义该注解的生命周期
    ● RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
    ● RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
    ● RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
    2.)Target – 表示该注解用于什么地方。默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
    ● ElementType.CONSTRUCTOR:用于描述构造器
    ● ElementType.FIELD:成员变量、对象、属性(包括enum实例)
    ● ElementType.LOCAL_VARIABLE:用于描述局部变量
    ● ElementType.METHOD:用于描述方法
    ● ElementType.PACKAGE:用于描述包
    ● ElementType.PARAMETER:用于描述参数
    ● ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
    3.)@Documented–一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。
    4.)@Inherited – 定义该注释和子类的关系
    @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
  4. 自定义注解:
    自定义注解类编写的一些规则:
    1)Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.
    2)参数成员只能用public或默认(default)这两个访问权修饰
    3)数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.
    4)要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法
    5)注解也可以没有定义成员, 不过这样注解就没啥用了
    PS:自定义注解需要使用到元注解

5. 问:限流策略

答:令牌桶算法、漏桶算法、计数器

6. 问:锁粗化、锁消除

答:
锁粗化:如,StringBuffer 连着的append操作,会被粗化成,第一次加锁最后一次后解锁;
锁消除:如,基于逃逸分析技术,如方法内定义变更StringBuffer会认为在堆上的所有数据都不会逃逸出去被其他线程访问到而不加锁;

7. 问:Mysql InnoDb行级锁

答:
共享锁:简称S锁,多个事物对于同一行可以加多把共享锁,但不可加其它类锁,只能读不能修改。
排他锁:简称X锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型。
显示加锁方式:
共享锁 select ... lock in share mode
排他锁 select ...for update

8. synchronized底层实现

答:
语法上有三种用法:
1-静态代码块
2-静态方法
3-普通方法
每个对象有一个监视器锁(monitor)。
静态代码块:
通过增加monitorenter\monitorexit
方法的同步:
并没有通过指令monitorenter和monitorexit来完成(理论上其实也可以通过这两条指令来实现),不过相对于普通方法,其常量池中多了ACC_SYNCHRONIZED标示符。当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置。
https://blog.csdn.net/wsyw126/article/details/70807304

8. mysql innodb row 结构及MVCC实现原理

答:
https://www.cnblogs.com/chenpingzhao/p/5065316.html

9.mysql事物隔离级别、传播行为

答:
https://segmentfault.com/a/1190000014811125

10.mysql索引失效

答:
https://blog.csdn.net/zhou2s_101216/article/details/79484519
单例非唯一索引 a:

  • like '%a' 百分号在前不走;
  • B-tree索引 is null不会走,is not null会走

11.G1回收器

答:
http://www.php.cn/java-article-357970.html

12. MySQL索引原理及慢查询优化

答:
https://tech.meituan.com/mysql_index.html

13. Innodb中的事务隔离级别和锁的关系

答:
https://tech.meituan.com/innodb_lock.html

14. ConcurrentHashMap 1.7与1.8

答:
https://www.cnblogs.com/study-everyday/p/6430462.html

15. JAVA 并发包基石AQS

答:
https://www.cnblogs.com/chengxiao/archive/2017/07/24/7141160.html

你可能感兴趣的:(Q&A)