1.2乘以8最简方式
2
<<
3
2.int和Integer区别
1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0
https://www.cnblogs.com/guodongdidi/p/6953217.html
3.写出你常用的设计模式
0.设计模式是代码设计经验的总结。
1.工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
2.单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
3.MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
4.代理模式(https://www.runoob.com/design-pattern/proxy-pattern.html)
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
5.单例模式写法
1、饿汉式
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
2、懒汉式
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
5.两个不同的对象hashcode值会一样吗?
hashCode是所有java对象的固有方法,如果不重载的话,返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了。如果重载了的话,由于采用的算法的问题,有可能导致两个不同对象的hashCode相同。 java中的hash函数返回的是int类型的,也就是说,最多允许存在2^32个分组,也是有限的,所以出现相同的哈希码就不稀奇。
6.简述ArrayList和LinkList区别?以及各自的存储机制?
ArrayList 底层实现就是数组,查询速度快,增删元素慢;
LinkedList 底层实现是链表,查询速度慢,增删元素快;
7.简述hashMap的存储机制?jdk8做了哪些改进?
HashMap由数组+链表组成的,JDK1.8在JDK1.7的基础上针对增加了红黑树来进行优化。即当链表超过8时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能。
8.说下对volatile关键字的理解
在并发环境中有三个因素需要慎重考量,原子性、可见性、有序性。
volatile主要用于解决可见性,保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值值,这新对其他线程来说是立即可见的。
volatile最主要的作用是使修改volatile修饰的变量值时会使所有线程中的缓存失效,并强制写入公共主存,保证了各个线程的一致。可以看做是轻量级的Synchronized。
9.为什么使用数据索引能提高查询效率?建立索引一定能提高效率吗?
索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。
索引在查询方面肯定是能提高效率的,不过在对数据库的操作方面就不行!当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
10.了解缓存击穿和缓存雪崩吗?他们的关系以及如何避免?
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。
缓存雪崩是因为大面积的缓存失效,打崩了DB。
一般避免以上情况发生我们从三个时间段去分析下:
事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL 被打死。
事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
11.高并发情况下如何安全修改同一行?
12.dubbo和spring cloud 的区别?
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
SpringCloud是一系列框架的有序集合。它基于SpringBoot的便利性融合了一整套实现微服务的框架并提供了服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等组件。
整体比较:
1、dubbo由于是二进制的传输,占用带宽会更少
2、springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大
3、dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决
4、springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级
5、dubbo的注册中心可以选择zk,redis等,springcloud的注册中心用eureka或者Consul
13. ==和 equals 的区别
== : 它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。
equals() : 与==一样,但它不能用于比较基本数据类型的变量。equals()方法存在于Object类中,而Object类是所有类的直接或间接父类。
14.static方法
static方法内不能调用非static方法,因为非static方法必须创建一个对象后才能被调用,而 static 方法调用时不需要创建对象,可以直接调用。static 方法是静态方法,是属于类的方法,非 static 方法是属于对象的方法,static方法加载类的时候被加载,加载 static 方法的时候非静态方法还没初始化。
15.Java中类的加载顺序(https://blog.csdn.net/weixin_37766296/article/details/80545283)
加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载