1、关于以下程序代码说明正确的是
package com.test; public class HasStatic { private static int x=100; public static void main(String[] agrs){ HasStatic hs1=new HasStatic(); hs1.x++; HasStatic hs2=new HasStatic(); hs2.x++; hs1=new HasStatic(); hs1.x++; HasStatic.x--; System.out.println("x=" +x); } }
A、5行不能通过编译,因为引用了私有静态变量
B、10行不能通过编译,因为x是私有静态变量
C、程序通过编译,输出结果为:x=103
D、程序通过编译,输出结果为:x=102
2、下列关于for循环和while循环的说法中哪个是正确的?
A、while循环能实现的操作,for循环也都能实现
B、while循环判断条件一般是程序的结果,for循环判断条件一般是非程序结果
C、两种循环任何时候都可以替换
D、两种循环结构体中都必须有循环体,循环体不能为空
3、以下选项中循环结构合法的是
A、
while (int i<7){ i++; System.out.println("i is"+i); }
B、
int j=3; while (j){ System.out.println("j is"+j); }
C、
int j=0; for(int k=0;j+k!=10;j++,k++){ System.out.println("j is"+j+",k is"+ k); }
D、
4、给出下面代码,哪行将引起一个编译是错误?
public class Test { int n = 0; int m=0; public Test(int a){ m=a; } public static void main(String[] agrs){ Test t1,t2; int j,k; j=3;k=5; t1=new Test(); t2=new Test(k); } }
A、行1
B、行4
C、行6
D、行9
5、下面的方法,当输入为2时返回值是多少?
package com.test; public class Tt { public static int getValue(int i){ int result =0; switch (i){ case 1:result =result+i; case 2:result =result+i*2; case 3:result =result+i*3; } return result; } public static void main(String[] agrs){ System.out.println(getValue(2)); } }
6、已知一颗二叉树前序遍历和中序遍历分别是ABDEGCFH和DBGEACHF
7、描述一下JVM加载class文件的原理机制【问答】
JVM加载class步骤:装载、验证、准备、解析、初始化
1)装载:查找并加载类的二进制数据
2)验证:确保被加载类的正确性,类文件中字节流包含的信息要符合当前虚拟机的要求;
3)准备:为类的静态变量分配内存,并将其初始化为默认值;
4)解析:把类中的符号引用转换为直接引用;
5)初始化:为类的静态变量付俞正确的初始值;
8、heap和stack有什么区别【问答】
heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。
stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。
9、GC是什么?为什么要有GC?JVM一次完整的GC流程是怎样的?
GC:垃圾回收;
java依靠垃圾回收机制完成对分配内存空间的回收,可以有效地防止内存泄漏,有效地使用可以使用的内存。
10、列举一些常用的类、包、接口,请各举5个
类:1.java.lang.Object
2.java.lang.String
3.java.lang.System
4.java.io.file
5.java.io.FileInputStream
6.java.io.FileOutputStream
包:1.java.lang包
2.java.io包
3.java.swt包
4.java.util包
5.java.sql包
接口:1.java.util.List<E>
2.java.util.Map<E>
3.java.util.Iterator<E>
4.java.sql.CallableStatement
5.java.lang.Comparable<T>
6.java.lang.Cloneable
7.java.io.serializable
11、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。
12、多线程有几种实现方法?同步有几种实现方法?
多线程有3种实现方法:
1)实现Runnable接口;
2)继承Thread类;
3)实现Callable接口;
同步有几种实现方法
1)synchronized,
2)wait与notify
13、AutomicInteger原理,他真的是线程安全吗?
14、写出线程池的参数,简述器运行原理
15、Redis缓存穿透、缓存击穿、缓存雪崩解决方案
Redis缓存穿透
解释:大量请求查询一个缓存中不存在数据,导致所有请求每次都需要查询数据库
解决方案:1)采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力
2)如果一个查询返回的数据为空,我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存击穿
解释:一个key可能会在某些时间点被超高并发地访问,,这个key失效时导致所有查询压力落到底层数据库
解决方案:1)设置热点数据永远不过期。
2)加互斥锁
缓存雪崩解
解释:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
解决方案:
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
- 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
- 设置热点数据永远不过期。
16、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户;
select count(*) as num,tb.id
from
tb,
(select role from tb where id=xxx) as t1
where
tb.role = t1.role and tb.id != t1.id
group by tb.id
having
num = select count(role) from tb where id=xxx;
17、一个用户表中有一个积分字段,假如数据库中有100多万用户,若要在每年第一天凌晨积分清零,你将考虑什么,你将想什么办法解决?
alter table drop column score;
alter table add colunm score int;
可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,
这样的操作时无法回滚的,在我的印象中,只有inert update delete等DML语句才能回滚,
对于create table,drop table ,alter table等DDL语句是不能回滚。
解决方案一,update user set score=0;
解决方案二,假设上面的代码要执行好长时间,超出我们的容忍范围,那我就alter table user drop column
score;alter table user add column score int。
下面代码实现每年的那个凌晨时刻进行清零。
Runnable runnable =
new Runnable(){
public void run(){
clearDb();
schedule(this,new Date(new Date().getYear()+1,0,0));
}
};
schedule(runnable,
new Date(new Date().getYear()+1,0,1));
18、你对Spring的理解,什么是Spring的ioc AOP
19、简述Springcloud各个组件作用,简要描述其中某个组件的实现原理或者源码实现
Config:配置管理工具,支持 git 存储配置实现应用外部配置化,支持远程客户端读取配置并根据初始化参数启动项目
Netflix:核心组件
Eureka:服务治理组件,可以注册服务接口中心
Hystrix:容错管理组件,实现断路器模式,服务依赖中出现的延迟和故障提供容错性
Ribbon:客户端负载均衡服务调用组件
Feign:基于 Hystrix 和 Ribbon 声明式服务调用组件
Zuul:提供路由,访问过滤
Archaius:外部化配置参数组件
Bus:事件消息总线,用于将服务和服务实例与分布式消息传递连接在一起的事件总线。触发后续作业的业务联动性
Cluster:针对 Zookeeper、Redis、Hazelcast、Consul 的选举算法和通用状态模式的实现
CloudFoundry:与 pivotalCloudFoundry 的整合支持
Consul:服务发现与配置管理工具
Stream:通过 Redis、RabbitMQ、Kafka 实现消息微服务,通过消息队列的形式生产和消费消息
Security:安全管理组件
Sleuth:SpringCloud 分布式跟踪,兼容Zipkin、HTrace和基于日志的跟踪(如ELK)。
Zookeeper:基于 Zookeeper 的服务发现和配置管理组件
Starts:基础组件,基于 SpringBoot 风格的基础依赖模块
20、消息队列如何防止消息不丢失、如何防止消息重复消费、消息积压如何解决