面试问题准备(一),单例模式实例,类初始化和实例初始化,方法的参数传递,bean的作用域

本文详细介绍了Java面试中的常见知识点,包括单例模式的实现方式(饿汉式、懒汉式、静态内部类),类初始化和实例初始化的规则,方法参数传递的原理,以及Bean的作用域。此外,还涉及了Linux基本命令、Git常用操作、Redis持久化策略、Mysql索引创建时机及JVM垃圾回收机制。
摘要由CSDN通过智能技术生成

写一个单例模式实例

定义

某个类只能在jvm存在一个实例并给别人使用

  1. 只能存在一个实例 -->构造器私有化
  2. 它必须自行创建这个实例 -》静态变量保存
  3. 向整个系统提供这个实例 -》方法暴露出实例接口

分类

  1. 饿汉式
    • 直接实例化
    • 枚举式
    • 静态代码块饿汉式
  2. 懒汉式
    • 线程不安全
    • 线程安全
    • 静态内部类

饿汉式

  1. 直接实例化
public class Single {
    //1.构造器私有化
    private Single(){
    }
    //2.静态变量存储实例
    private static final Single INSTANCE = new Single();
    //3.暴露方法
    public Single getInstance(){
        return INSTANCE;
    }
}
  1. 枚举式

    枚举类一个对象即可

  2. 静态代码块饿汉式,适合复杂的对象实例化

    public class Single {
    
        //1.构造器私有化
        private Single(){
    
        }
        //2.静态变量存储实例
        private static final Single INSTANCE;
    
        static {
            INSTANCE = new Single();
        }
        
        //3.暴露方法
        public Single getInstance(){
            return INSTANCE;
        }
    }
    

懒汉式

延迟创建对象

public class Single2 {
    
    //静态共享对象
    private static  Single2 INSTANCE;
    private Single2(){
        
    }
    
    public static  Single2 getInstance(){
        if (INSTANCE == null) {
            INSTANCE = new Single2();
        }
        return INSTANCE;
    }
}

调用静态方法时,才创建实例对象

但线程不安全,可能会创建多个实例

适用于单线程

  1. 线程安全性

    public class Single2 {
    
        private static  Single2 INSTANCE;
        private Single2(){
    
        }
    
        public static  Single2 getInstance() {
            //为了提升性能
            if(INSTANCE == null){
            synchronized (Single2.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Single2();
                }
            }
                return INSTANCE;
            }
        }
    }
    
  2. 内部类

静态内部类不会随着外部类加载加载

使用方法的时候才会加载

内部类初始化的时候才会加载,保证了线程安全

public class Single2 {

    private Single2() {

    }
    private static class Inner{
        private static final Single2 INSTANCE = new Single2();
        
    }
    public Single2 getInstance(){
        return Inner.INSTANCE;
    }
}

类初始化和实例初始化

规则

  1. 一个类要创建实例必须要先加载并初始化该i类
    • main方法所在的类需要先加载和初始化
  2. 一个子类初始化需要先初始化父类
  3. 一个类初始化执行《clint》方法
    • 由静态类变量显式赋值代码和静态代码块组成
    • 静态代码块从上到下顺序执行
    • 只执行一次
  4. 实例执行《init》方法
    • 有几个构造器就有几个init方法
    • 非静态实例变量显式赋值代码和非静态代码块、对应构造器代码组成
    • 《init方法》首行是super 会调用父类对应的init方法

类的实例化

  1. super() 调用父类的init方法
  2. 成员变量
  3. 子类的非静态代码块
  4. 子类的无参构造

方法的重写

  1. 非静态方法前面有一个默认的对象this
  2. this表示正在创建的对象

方法的参数传递

值传参

基本数据它变我不变

引用类型它变我变

常量池指针不变

基本数据类型:数据值

引用数据类型:地址值

字符串对象不可变,Integer常量池不可变

bean的作用域

可以在 元素的scope属性设置bean的作用域

分类

  1. singleton: 单实例 默认
  2. prototype  : 每次调用getBean都会返回一个新的实例
  3. request :每次请求一个bean
  4. session: session共享一个bean

Linux基本命令

进程类

service: 注册在系统中的标准化程序

  • service 服务名 start
  • service 服务名 stop
  • service 服务名 restart
  • service 服务名 reload
  • service 服务名 status

查看服务的方法 /etc/init.d/服务名

通过chkconfig 命令设置自启动

systemctl 操作 +服务名

git常用命令

创建分支

  • git branch
  • git branch -v 查看分支

切换分支

git checkout 分支名

合并分支

  • git checkout master
  • git merge 分支名

删除分支

git branch -D 分支名

Redis持久化

RDB

用一个子进程,快照直接回复内存

效率非常高

影响性能,备份隔一段时间,可能会丢失最后一次快照的数据

AOF

日志记录下写操作指令,只追加操作

恢复速度慢

可读的日志样本

Mysql什么时候适合建索引

索引文件存储在磁盘中

频繁作为查询条件的字段应该创建索引

排序,统计,分组字段

什么时候不要创建索引

表记录少

经常增删改

不在where条件里的字段

过滤性不好

JVM垃圾回收机制

gc放在堆丽

分代收集算法{minor gc full gc}

  1. 引用计数法:一般不使用
  2. 复制算法 年轻代中minorgc 需要双倍空间
  3. 标记清除 老年代 清除没有标记的对象
  4. 标记压缩 先标记 后压缩
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值