# java OOP面试题

# 51、Static关键字有什么用?

  • Static可以修饰内部类、方法、变量、代码块
  • Static修饰的类是静态内部类
  • Static修饰的方法是静态方法,表示该方法属于当前类的,而不属于某个对象的,静态方法不能被重写,可以直接使用类名来调用,在Static方法中不能使用this或者super关键字
  • Static修饰的变量是静态变量或者是类变量,静态变量被所有实例共享,不会依赖于对象,静态变量在内存中只有一份拷贝,在JVM加载类的时候,只为静态变量分配一次内存
  • Static修饰的代码块叫静态代码块,通常用来做程序优化的。静态代码块中的代码在整个类加载的时候,只会执行一次,静态代码块可以有多个,如果有多个,按照先后顺序先后执行

# 52、final在java中有什么作用,有哪些用法?

  • 被final修饰的类不可以被继承
  • 被final修饰的方法不可以被重写
  • 被final修饰的变量不可以被改变,如果修饰引用,那么表示引用不可以变,引用指向的内容可变

# Java的内存模型?

# JVM三大性能调优参数-Xms -Xmx -Xss的含义

在调用java程序去执行程序的时候,我们可以通过

 java -Xms128m -Xmx128m -Xss256k -jar xxx.jar
1

传入以上3个参数,去分别调整java的堆以及线程所占内存的大小

  • -Xss: 规定了每个线程虚拟机栈(堆栈)的大小,一般情况下256k就足够了,此配置将会影响此进程中并发线程数的大小
  • -Xms:堆的初始值
    初始的java堆的大小及该进程刚创建出来的时候它的专属java堆大小,一旦对象容量超过了java堆的初始容量,java堆就会自动扩容,扩容到-Xmx堆能达到的最大值
  • -Xmx: 堆能达到的最大值(堆能扩展到的最大值)
    通常情况下,我们将 -Xms 与 -Xmx设置成一样的,因为当kep不够用,而发生扩容时,会发送内存抖动,影响程序运行时的稳定性

# java内存模型中堆和栈的区别 -- 内存分配策略

# 程序运行时的内存分配策略:静态的、栈式的、堆式的

  • 静态存储: 编译时就可以确定每个数据目标在运行时的存储空间需求,因而在编译时就可以给他们分配固定的内存空间,
  • 这种分配策略要求程序代码中不允许有可变数据结构的存在,也不允许有嵌套或者递归的结构出现,因为他们都会导致编译无法计算
  • 准确的内存空间
  • 栈式存储:数据去需求在编译时未知,运行时模块入口前确定,按照先进后出的原则进行分配
  • 堆式存储: 编译时或运行时模块入口都无法确定,动态分配
    比如:可变长字符串,对象实例

# java内存模型中堆和栈的区别

联系:引用对象、数组时,栈里定义变量保存堆中目标的首地址 堆栈分配图

  • 管理方式:栈自动释放,堆需要GC
  • 空间大小:栈比堆小
  • 碎片相关:栈产生的碎片远小于堆
  • 分配方式:栈支持静态和动态分配,而堆仅支持动态分配
  • 效率:栈的效率比堆高

# Java多线程与并发

# 线程的start和run方法的区别

package io.torey.threadTest;

public class ThreadTest {
    private static void attack(){
        System.out.println("Current Thread is :" + Thread.currentThread().getName());
    }
    public static void main(String[] args){
          Thread t=new Thread(){
              @Override
              public void run() {
                  attack();
              }
          };
        System.out.println("Current main Thread is :" + Thread.currentThread().getName());
//        t.run();
        t.start();
        }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

程序测试结果:调用run的时候,会沿用主线程,而用start的时候,会使用一个非主线程,也就是会用一个新的线程去执行方法

# 数据库

# 什么样的信息能成为索引

  • 主键、唯一键以及普通键等

# 索引的数据结构

  • 生成索引,建立二叉查找树进行二分查找
  • 生成索引,建立B-Tree结构进行查找
  • 生成索引,建立B+-Tree结构进行查找
  • 生成索引,建立Hash结构进行查找

数据库最终是通过B+-Tree结构进行查找的

# 优化你的索引-运用二叉查找数

# RabbitMQ面试题

# 为什么要使用rabbitmq

  1. 在分布式系统下具备异步削峰,负载均衡等一系列高级功能;
  2. 拥有持久化的机制,进程消息,队列中的消息也可以保存下来。
  3. 实现消费者和生产者之间的解耦
  4. 对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。
  5. 可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单

# 使用rabbitmq的场景

  1. 服务间异步通信
  2. 顺序消费
  3. 定时任务
  4. 请求削峰

# 面试题相关导航

java面试题
redis面试题
spring面试题
回到主导航页

# 支持我-微信扫一扫-加入微信公众号

Aseven公众号

# 赞赏作者

赞赏作者