# 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
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
- 在分布式系统下具备异步削峰,负载均衡等一系列高级功能;
- 拥有持久化的机制,进程消息,队列中的消息也可以保存下来。
- 实现消费者和生产者之间的解耦
- 对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。
- 可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单
# 使用rabbitmq的场景
- 服务间异步通信
- 顺序消费
- 定时任务
- 请求削峰
# 面试题相关导航
java面试题
redis面试题
spring面试题
回到主导航页