常见面试题一

本文详细介绍了Linux常用命令、npm、vim编辑器、Maven打包、Git操作、网站性能问题、软件开发流程、Spring单例设计及BeanFactory和FactoryBean的区别,为技术面试者提供实用参考。
摘要由CSDN通过智能技术生成

常见面试题

1.linux常用命令有哪些?

npm -ivh 压缩包名称.npm
vim常用命令:
	set nu 显示行号
	yy 复制一整行 
	p 粘贴
	dd 删除一整行
	uu 撤销上一步操作
	/关键字 根据关键字搜索
	nohup java -jar xxx.jar &(将日志文件放到指定的文件夹下,在jar文件后加上 >文件夹)
将文件或目录打成tar.gz包  tar -czvf  文件名.tar.gz 要打包的文件或目录
(-c 表示创建新的压缩文件。
-z 表示使用gzip进行压缩。
-v 表示显示详细的操作信息,可以省略。
-f 后面紧跟着要创建的压缩文件的名称。
文件名.tar.gz 是你想要创建的压缩文件的名称。)

maven打包命令:
	package
linux如何查看日志:
	cat xxx.log/out 适合查看小文件 一般不用
	tail -f(实时查看) -n(指定显示几行) (|grep "关键字") 文件名
	tail -n +1000 从1000行开始显示之后的
	sed -n '5,10' 文件名
    head -n 文件名
 创建文件:
 	vim
 	touch
 docker命令:
 	将jar制作成镜像:docker build -t
 	将镜像打包成tar包:docker save -o
 	将tar包还原成镜像:docker load -i
 	查看本地数据卷列表:docker volume ls
 	查看数据卷详情:docker volume inspect 数据卷名

2.git常用的命令

git fetch与git pull的区别

git fetch:
git fetch 仅仅是从远程仓库下载新的提交对象(commits)、分支引用(branch references)、标签(tags)等信息到本地仓库,但它并不会自动合并这些更新到你的当前工作分支。
这个命令对于查看远程仓库的最新状态非常有用,可以了解到其他开发者的工作进展,但不会对你的当前工作分支造成任何改变。
语法:git fetch <remote>,其中 <remote> 是远程仓库的名称,通常是 "origin"。
git pull:
git pull 也会从远程仓库获取更新,但不同于 git fetch,它会自动将远程分支的更新合并到你的当前工作分支。
git pull 实际上是两个命令的组合:git fetch 和 git merge 或 git rebase,具体使用哪个取决于你的配置。
默认情况下,git pull 使用 git merge 来合并远程分支的更新到当前分支,这会创建一个新的合并提交。
如果你更喜欢使用 git rebase,可以配置 git pull 使用 --rebase 选项:git pull --rebase,这会将你的本地提交放在远程分支的提交之后,看起来就像是线性历史。
语法:git pull <remote>,其中 <remote> 是远程仓库的名称。
总之,git fetch 主要用于获取远程仓库的更新信息,而不会改变你的工作分支,而 git pull 不仅获取更新信息还会尝试将远程分支的更新合并到当前分支。选择使用哪个命令取决于你的工作流程和个人偏好。

3.网站卡顿

1.内存不足。
2.SQL慢查询。
3.Kafka消息积压。
4.Redis崩溃
	1.Redis实例宕机。
	2.Redis主从失效

4.软件开发流程

开发日常工作内容
	源码工作--制品管理--配置管理--数据库自动化--测试--持续集成---监控--分析--智能运维--协作
流程:
	需求分析--开发前--开发--开发完成--测试--发布前--已发布

5.循环依赖问题

概念:两个彼此依赖的spring bean对象在创建的时候如果不加控制,会导致异常BeanCurrentlyInCreationException

如何解决:将spring bean的作用域修改为单例即可,通过构造函数注入和Setter方法注入的方式,可以有效地解决这个问题。如果需要,可以使用@Lazy注解进行延迟实例化
原理:
	三个级别缓存
		一级缓存 ConcurrentHashMap singletonObjects =new ConcurrentHashMap(256);
			保存的是实例化好的经历了完整的生命周期的bean对象
		二级缓存 HashMap earlySingletonObjeccts =new HashMap(16)
			保存的是实例化好了的但是没有初始化的对象
		三级缓存 HashMap singletonFactories=new ConcurrentHashMap(16)
			保存的是生成单例对象的工厂
	四个操作缓存的方法:
		getSinglton():从缓存中获取单例对象
		createBean():实例化bean对象
		populateBean():初始化bean对象
		addSinglton():讲实例对象保存到缓存中
	(Setter方法注入)具体步骤:
		1.尝试从一级缓存中获取对象,结果没有获取到 并且当前正处于查找对象的阶段 并不是创建对象的阶段
		2.之后将对象的状态标记为创建状态 又从一级缓存中寻找了一遍 还是找不到 执行了调用三级缓存的方法开始执行对象的创建
		3.通过调用CreateBean将A对象实例化完成 并将A保存到三级缓存中 开始给A对象进行属性赋值
		4.赋值的过程中发现属性b是一个引用类型 就会尝试从缓存中获取(步骤与A完全相同)即从一级缓存找了两遍没有找到 直接调用工厂创建b对象,并将b保存到三级缓存 紧接着开始对B的a属性进行赋值
		5.赋值的过程中发现属性a是一个引用类型 就会尝试从缓存中获取 此时可以获取到 获取过程中将a从三级缓存移动到二级缓存
		6.完成b的初始化并将b直接从三级缓存移动到一级缓存
	spring中关于方法调用规律:
		getBean() --> doGetBean() --> getSingleton()
		createBean() --> doCreateBean() --> createBeanInstance()

6.spring中的bean对象的作用域默认是什么?

    在Spring框架中,Bean对象的默认作用域是"singleton"(单例)。
    这意味着当Spring容器启动时,它会创建并管理一个单一的实例,然后在整个应用程序中共享这个实例。无论有多少次请求获取该Bean,Spring容器都会返回同一个实例。
    在XML配置中,可以使用<bean>元素的scope属性来指定作用域。如果未指定scope属性,默认值就是"singleton"。
    在注解配置中,可以使用@Scope注解来指定作用域。如果未指定,也会默认为"singleton"。
    

7.spring中bean的作用域有哪些?

    总的来说,Spring的"singleton"作用域是最常用的作用域,适用于大多数情况。然而,Spring还提供了其他作用域,如"prototype"(原型)、"request"(请求)、"session"(会话)等,以满足不同的需求。可以根据应用程序的特定需求选择适当的作用域。

8.spring创建bean的步骤。

    先进行对象实例化:指的是通过调用无参构造在堆内存中分配内存
    再进行对象初始化:指的是对对象的属性进行赋值

9.spring中的deepCopy(深拷贝)指的是什么?深浅拷贝有什么区别?

    Deep Copy(深拷贝): 深拷贝是一种创建一个新对象,同时递归地复制原对象及其所有内部对象的内容。深拷贝会创建一个完全独立的副本,新对象与原对象之间不共享内部对象。因此,对其中一个对象的修改不会影响另一个对象。
    List<PropertyValue> deepCopy = new ArrayList<>(original.size());
		deepCopy.add(pv);
		
    Shallow Copy(浅拷贝): 浅拷贝是一种只复制对象的引用,而不复制对象本身的内容。这意味着新对象和原对象共享相同的内部对象。如果内部对象是可变的,对其中一个对象的修改会影响到另一个对象。
    在编程中,深拷贝通常用于确保在处理复杂数据结构时不会因共享内部对象而导致意外的副作用。许多编程语言和框架提供了深拷贝的实现或工具函数,以简化复制对象的过程,确保安全地处理对象的副本而不影响原始数据。

10.BeanFactory与FactoryBean的特点。

    BeanFactory 和 FactoryBean 是 Spring 框架中两个不同的概念,它们在实现上有一些区别和联系
    
    BeanFactory:
    定义: BeanFactory 是 Spring 框架的核心接口之一,负责管理和维护应用程序中的对象(Bean)。
    作用: 它是一个工厂模式的实现,负责创建、配置和管理对象。BeanFactory 的实现类通常是应用程序上下文,如 XmlBeanFactory 或 AnnotationConfigApplicationContext。
    特点: BeanFactory 提供了对对象的延迟加载和分布式加载的支持,它使用惰性加载策略,即在真正需要使用 Bean 时才进行初始化和实例化。
    
    FactoryBean:
    定义: FactoryBean 是一个特殊的接口,允许用户自定义对象的创建过程。
    作用: 实现了 FactoryBean 接口的类可以被 Spring 容器视为一个工厂,用于生产和配置特定类型的对象。这样的对象在容器中不再是简单的 Bean,而是一个工厂,它的 getObject() 方法返回的是工厂创建的对象。
    特点: FactoryBean 提供了更灵活的方式,允许在对象创建时进行一些定制化的操作。Spring 中的许多内置功能,比如 JndiObjectFactoryBean、JdbcTemplate 等都实现了 FactoryBean 接口。
    
    联系和区别:
    联系: BeanFactory 是 Spring 容器的核心接口,而 FactoryBean 是一个用于创建对象的特殊类型的工厂接口。在某种程度上,FactoryBean 可以看作是 BeanFactory 的实现之一。
    区别: BeanFactory 是 Spring 容器的核心接口,负责管理对象的生命周期和依赖关系。而 FactoryBean 是一个用于创建对象的工厂接口,它允许用户自定义对象的创建过程,并返回一个特殊类型的对象。使用 FactoryBean 实现的工厂类,其实例在容器中不是直接的 Bean,而是通过 FactoryBean 接口的 getObject() 方法返回的对象。
    总的来说,BeanFactory 是 Spring 容器的核心,负责对象的管理,而 FactoryBean 是一种更灵活的机制,允许用户在创建对象时进行更多的自定义操作。

11.spring单例设计模式之懒汉双检机制

在Spring中,默认情况下,单例Bean的实例化是采用懒汉双检锁机制的。这意味着在第一次请求获取Bean时才会进行实例化,同时通过双检锁来确保在多线程环境下的线程安全性。下面是一个简单的示例:

public class LazySingletonBean {

    private static volatile LazySingletonBean instance;

    private LazySingletonBean() {
        // 私有构造函数,防止外部直接实例化
    }

    public static LazySingletonBean getInstance() {
        // 第一次检查,如果实例不存在才进入同步块
        if (instance == null) {
            synchronized (LazySingletonBean.class) {
                // 第二次检查,确保在进入同步块后仍然是唯一的实例
                if (instance == null) {
                    instance = new LazySingletonBean();
                }
            }
        }
        return instance;
    }
}

这里的关键点是:
    使用 volatile 关键字修饰 instance,以确保多线程环境下的可见性和正确性。
    在 getInstance 方法中,首先进行第一次检查,如果实例已经存在,直接返回。如果实例不存在,则进入同步块。
    在同步块内,再次检查实例是否存在,以防止多个线程同时通过第一次检查,避免重复创建实例。
    如果实例不存在,则在同步块内创建实例。
    这种方式在绝大多数情况下能够满足需求,但需要注意的是,在某些情况下,由于Java的指令重排序,可能导致初始化尚未完成时就返回了实例。使用 volatile 关键字可以解决这个问题。在Java 5及以上版本,可以考虑使用 enum 类型实现更简单的线程安全单例模式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值