2021-04-17

面试题

HashMap:

底层存储hash继承了map接口,是以hashcode值为键存储数据的,键的值是唯一的,这里说下hash冲突产生的原因是因为,在新增的时候,两个不同的元素经过hash函数运算,产生了相同的地址值,插入数据的时候发现当前位置已经有元素为了解决哈希冲突采用数组和列表结合的链地址法,当发现数据想同时,就以链表的形式存储在当前数据后面主干是entry数组,使用resize扩容为原来的2倍

hashMap(散列表)的Put方法:

首先判断table是否为空,为空resize扩容,然后根据hash函数计得道插入数组的索引,tabel[i]=null,判断是否有位置插入,有插入,无resize扩容插入,不为null,判断key是否存在,存在直接覆盖value,不存在判断是否为数结构是直接插入,不是,判断链表长度大于8变为树结构,容量初始16,链表树化的条件是链表长度>8和node数组长度>64

List和Set的区别:二者都实现了collection接口,set是不允许重复的,list可以,常用的有arrarylist和linkedlist,因为linked是双向链表结构所以当新增删除的操作量较大的时linkedlist性能优于arrarylist,因为arrarylist的结构是数组所以查询和修改的效率要高一些,set有两个重要的实现类,其中hash基于hashset表实现是无序的,treeset基于二叉树实现,是自动排好序的

多线程:

首先说说什么是进程,举个例子widows任务管理器上面那一部分假去登陆了qq会出现一条qq.exe的进程,线程是进程的最小执行单位,说到多线程就会引出串行和并发串行举个例子下载文件它要等一个文件下载好才能下载下一个文件这在时间上是不重叠的,并行举个例子,同时下载多个文件,开启多条线程,这在时间上是重叠的。多线程举个例子电脑管家加速,杀毒,清理在同一时刻处理,没有执行的先后顺序,及一个进程运行时产生了多个线程,这里可以引出线程安全问题,举个例子我定义一个变量count记录方法的访问次数,开启多个线程循环10次,可能就会出现相同的数字,这就出现了线程不安全的问题,原因呢,介绍有两个线程a,ba线程进入方法取出count给没有赋值,b线程进来了两个线程取出的值是一样的,如果是一个无状态的对象,没有共享数据可以说是线程安全的,java常用的两个解决线程安全的两个关键字synchronized和lock ,synchronized在非静态方法中锁住的是对象的本身也就是this,实现过程a线程进入方法时会拿着锁,b的线程是进不来的在外面等着,a执行完后释放锁b拿锁才可以执行。lock需要手动释放锁,一般写在finally中因为finally的代码是肯定会被执行的。

Ioc容器:

依赖注入,控制反转,有一个规范约束接口叫BeanDefinitionReader来解析xml中的和注解中的bean的定义信息,之后会创建BeanDefinition对象,对象里会有bean的定义信息,这个BeanDefinition对象是放在容器的入口Beanfactory里的,Beanfactory接口有众多的实现类,在实现类里可以通过反射来实例化,这里说一个关于定义数据源的东西,像是jdbc.url类似的它是以占位符的形式保存在Beandefintion对象中,因为beandefinnition是保存在beafactory里的,所以要改里面的值需要后置处理器BeanFactoryPostProcessor对象这里的占位符是会在BeanFactoryPostProcessor接口的一个叫PlaceholderConfiguserSupport实现类替换的,spring注解的解析是在BeanFactoryPostProcessor接口的一个子类BeanDefinitionRegistryPostProces的一个实现类ConfigurationClassPostProcessoConfigurationClassParser里解析的,里面有doProseccConfigurtionClass方法会判断当前类是不是用component修饰的类,像是controller和configuration都是用@component所以才能识别注解,这个类还有处理bean注解和component注解方法

Aop:

一种编程思想,先说一个例子,加入现在我有3个方法,我要添加一个日志功能,这里可以改方法就行但是如果有一百个方法呢就不行了,是能在方法前后添加方法是可行的,我们知道java文件会被编译成class文件在jvm运行是,如果动态的在class文件方法前后添加新的功能这个想法是可行的,现在我想给100个方法其中的50个添加log功能,所以我需要匹配方法,通过express(java中的一个类)表达式,来匹配方法,匹配到方法后想想可以在方法前面、后面、异常处理、返回值地方插入代码这就是对应的通知(advice) before、after、afterThrowing、afterReturning、around这些通知放到一个面上就是切面了,通知的执行是有顺序的,通知想要被执行的时候,需要通过methodinterceptor接口进行相关的拦截,举个例子正常方法执行顺序是从上往下,当我在方法一前面加了代码便会拦截下

 

List值排序:

如果里面的类型都实现了compareable接口,可以使用collection.sort方法进行排序这要重写compareto方法,还可以在传入一个compator进行定制排序。

多态:

比如酒是父类,有以下子类剑南春,五粮液,二锅头。Wine win=new Jnc();向上转型可以直接转这个对象可以使用父类的所有,但对子类特有的方法无法访问

反射:

人照x光了解全部人体信息,反射首先要获得字节码文件的对象,三种方式,.clasd  getclass,class.forname(全类名)

复制一张表:

insert into b select *from a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值