UU跑腿

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机。

       解决方案:

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
  3. 设置热点数据永远不过期。

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、消息队列如何防止消息不丢失、如何防止消息重复消费、消息积压如何解决

 

posted @ 2021-08-25 20:00  沉默小和尚  阅读(335)  评论(0编辑  收藏  举报