面试录音总结

编程入门 行业动态 更新时间:2024-10-11 21:20:58

面试录音总结

面试录音总结

HashMap和Hashtable的区别

这两个都是是Map接口下的实现类,我们开发的时候经常用的是HashMap虽然HashMap不是线程安全的但是他的存储效率比较高,Hashtable是线程安全的我们看过他底层的put方法前面加的关键字,但是他的效率太低,我们开发很少用

Hashmap的底层实现原理

Hashmap底层是通过数组和链表联合实现的,当我们创建hashmap时会先创建一个数组,当我们用put方法存数据时,先根据key的hashcode值计算出hash值,然后用这个哈希值确定在数组中的位置,再把value值放进去,如果这个位置本来没放东西,就会直接放进去,如果之前就有,就会生成一个链表,把新放入的值放在头部,当用get方法取值时,会先根据key的hashcode值计算出hash值,确定位置,再根据equals方法从该位置上的链表中取出该value值

ArrayList与LinkedList区别

ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢.LinkedList使用双向链接方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可,速度非常快,而通过下标查询元素时需要从头开始索引,所以比较慢,但如果查询前几个元素或后几个元素速度比较快

线程的基本方法有什么?

线程等待(wait )调用该方法的线程进入 等待 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后, 会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。
线程睡眠(sleep )sleep 与 导致当前线程休眠,与 t wait 是 方法不同的是 p sleep 不会释放当前占有的锁 ,sleep(long)入 会导致线程进入 G TIMED-WATING 状态 ,而 而 wait() 方法会导致当前线程进入等待状态
线程让步(yield)yield 会使当前线程出 让出 U CPU 执行时间片,与其他线程一起重新竞争 CPU 时间片。一般情况下,优先级高的线程有更大的可能性成功竞争得到 CPU 时间片,但这又不是绝对的,有的操作系统对 线程优先级并不敏感线程中断(interrupt)中断一个线程,其本意是 给这个线程一个通知信号,会影响这个线程内部的一个中断标识位 。 这个线程本身并不会因此而改变状态( ( 如阻塞,终止等) )
Join 等待其他线程终止:join() 方法 , 等待其他线程终止,在当前线程中调用一个线程的 join() 方法,则当前线程转为阻塞状态,回到另一个线程结束,当前线程再由阻塞状态变为就绪状态,等待 cpu的宠幸.
线程唤醒(notify)Object 类中的 notify() 方法, 唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生,线程通过调用其中一个 wait() 方法,在对象的监视器上等待, 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类似的方法还有 notifyAll() ,唤醒再次监视器上等待的所有线程。

wait 和 sleep 方法的不同?

最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。wait 通常被用于线程间交互,sleep 通常被用于暂停执行。

什么是反射,反射能干嘛?

反射机制是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。反射的作用其实就是:在运行时能够判断任意一个对象所属的类,还有在运行时构造任意一个类的对象。 我们常用的Spring框也架是利用Java反射这一块的架构,在运行时判断任意一个类所具有的成员变量和方法,还能在运行时调用任一对象的方法,创建新类对象

jdk1.8 和1.7区别

JDK1.8的新特性有:接口里也可添加普通的方法,不用非得是抽象方法,但必须用default进行修饰,调用的时候也还是得实现这个接口以后才能调用,还有就是添加了一个Lambda 表达式,让我们遍历集合数据的时候速度更快JDK1.8以后的map存储方式与1.7的也有些区别.如果不相等则形成链表结构,jdk1.7:后加的在前面,先加的移下,这种情况叫碰撞。这种碰撞的情况应尽量避免,否则一个索引中有大量的链表数据时,当该索引再次插入一个对象时equals影响效率。因此jdk1.8改善了这种碰撞情况的出现,jdk1.8中的HashMap存储结构是由数组、链表、红黑树这三种数据结构形成,红黑树查询删除快新增慢.

说一下你对Spring的理解?

Spring里面主要的就三点,IOC,DI,AOP。其实spring这个框架也用到了Java里的反射机制.
DI就是依赖注入,把我们需要的类,接口注入到spring中去。
IOC控制反转,像我们之前开发,如果想创建一个对象,就new一个,如果想这个对象中定义其他的变量或者对象,就在对象内部创建一个成员变量。但是现在的话,如果想用类的这个对象,咱们可以在spring的配置文件中配置一个bean,指定对应的全路径名称。spring通过配置文件用反射的方式,就可以直接帮我们获取到这个类的对象。还有AOP,就是面向切面编程,它的原理实际上就是实现了JDK的动态代理,以前用Aop做事务的控制,现在用注解来控制事务。
AOP执行过程是一个纵向的过程,把每个方法当作一个点.基于这些点可以进行增强处理.形成了横向的切面,包含了原有方法和增强方法.不改变原有代码结构,还添加了额外的功能.AOP的使用场景有事务管理,日志打印,还有就是在老项目中也有可能用它来做权限管理.

SQL是如何优化的?

基本的不要用*查询所有字段,还有就是经常用表别名,经常commit提交事务尽量及时释放回滚点,如果使用函数的话尽量使用内部的函数,对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。应尽量避免在 where 子句中对字段进行 null 值判断,应尽量避免在 where 子句中使用!=或<>操作符,.应尽量避免在 where 子句中使用 or 来连接条件,in 和 not in 也要慎用,否则会导致全表扫描,应尽量避免在 where 子句中对字段进行表达式操作,应尽量避免在where子句中对字段进行函数操作

索引是什么,有什么作用以及优缺点

1、索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL 高效获取数据的数据结构
2、索引就是加快检索表中数据的方法,在数据库中,索引允许数据库程序迅速地找到表中的 数据,而不必扫描整个数据库。MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引
1、索引加快数据库的检索速度
2、索引降低了插入、删除、修改等维护任务的速度
3、唯一索引可以确保每一行数据的唯一性
4、通过使用索引,可以在查询时使用优化隐藏器,提高系统的性能5、索引需要占物理和数据空间

说一下什么事务?

事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);事务的四大特性:
1 、原子性 事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性 事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性 一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性 也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
我们在开发的时候如果不注意事务的话就会出现,脏读,不可重复读,幻读这些情况
脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
幻读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行

事务的隔离级别

1.读未提交该隔离级别允许脏读,其隔离级别是最低的。也就是说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能访问该数据。
读已提交是不同的时间执行时只能获取到已经提交的数据。
可重复读:保证在事务处理过程中,多次读取同一个数据时,该数据的值和事务开始时刻 是一致的。因此该事务级别禁止了不可重复读取和脏读,但是有可能出现幻读的数据。
串行化,顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发。

多线程怎么解决高并发?

synchronized关键字主要解决多线程共享数据同步问题。
ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。
ThreadLocal是为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。
Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。

什么是多线程?在哪里应用过?

线程就是可执行的代码段,线程要服务于进程,一个进程有好多个线程,main方法就是主线程,多个线程同时执行就是多线程,线程池就是把准备好的线程放到线程池里,如果处理请求需要调用线程的时候,就从线程池里去调用,用完以后再放回到线程池里,这样就防止高并发节省资源,我们目前开发中没有涉及到过多线程,其实我个人理解用多线程无非是为了提高代码的执行效率提高客户的体验,解决高并发,但是项目里如果多线程使用的多的话,后期的代码维护这一块也不怎么好维护,我们现在在解决这些高并发都是建议使用中间件来解决,redis啦,activeMQ啦,还有solr等等

说一下GC垃圾回收过程

我们Java中的垃圾回收都是自动的,我们很少几乎不去手动的干预,我们的JVM垃圾回收算法我记得差不多有4种,标记清除法,复制算法,标记整理算法,分代收集算法,第一种就是标记-清除法分为:
标记,请除标记阶段:直接在内存里标记无用的对象,然后清除阶段直接回收被标记的对象;缺点:形成内存碎片,一些大的对象无法找到足够的空间而触发新的垃圾收集动作。
第二种:复制算法:将内存划分为大小相等的两块,当一块的内存用完了,就把还存活的对象复制到另外一块上面,然后将之前的那块清理掉缺点:浪费内存太多(对老年代的使用,效率低)
第三种:标记-整理算法将存活的对象都向一端移动,然后直接清理掉这端边界以外的内存
第四种:分代收集算法:(当前商业虚拟机都采用这个)根据对象的存活中期的不同将内存划分为几块,一般Java堆分为新生代和老年代新生代:用复制算法 老年代用标记整理算法进行回收

解释下堆和栈?

JVM内存结构主要有三大块:堆内存、方法区和栈。
堆内存是JVM中最大的一块内存地址,它主要由年轻代和老年代还有持久代组成,所有new出来的对象都存储在该区域.
栈就是暂存数据的地方,每个线程包含一个栈区,栈存放在一级缓存中,存取速度较快,栈中只保存基础数据类型的对象和自定义对象的引用.每个栈中的数据都是私有的,其他栈不能访问。
方法区存放了要加载的类的信息(如类名、修饰符等)、静态变量、构造函数、final定义的常量、类中的字段和方法等信息。声明并创 建对象

redis持久化方式有几种?

有RDB和AOF这两种,RDB是一种快照的方式来存储的,这也是redis的默认的持久化方式,每隔一段对数据进行一次存储,默认是15S,这个也可以通过配置文件里修改,这种存储方式性能比较高AOF是即时性的持久化方式,只要数据发生改变都会保存到硬盘一份,这种方式对数据的保存完整性比较高,但是性能比较差。而RDB存在的问题主要是服务器宕机或者断电,会造成数据丢失

什么是读写分离?

这个我们项目中使用MyCat来做的,在mycat里配置好主库和从库,做增删改的时候是对主库进行操作,查询的时候是对从库进行操作,其实mysql本身从5.6以后的版本就带主从复制的功能了,他们是利用mysql里的log文件进行的数据同步

Linux 常用命令

清屏 ctrl + l
列表 ll lsmkdir
创建一个文件夹touch
创建一个文件
cp 复制 不能复制文件夹,只能复制文件
mv 移动 给文件重命名 如果文件夹是空的,那么文件夹将丢失
rm 删除
rm -rf (强制递归删除)
解压缩tar -xzvf 压缩包名
free 查看内存

介绍一下redis

redis 是一个 C 语言开发的,基于内存的,高性能 key-value 形式的,单线程的 NoSQL数据库。
使用redis的好处是?
(1) 速度快,因为数据存在内存中,类似于 HashMap,
(2) 支持丰富数据类型,支持 string,list,set,Zset,hash 等
(3) 支持事务,操作是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行丰富的特性:可用于缓存,消息,按 key 设置过期时间,过期后将会自动删除

spring的 IOC 原理?

IOC 就是控制反转,原来我们需要创建对象的,必须自己 new,但是现在有了 spring 容器,我们不需要再自己 new了,有两个好处,解耦,因为对象自己new 完之后,无法更改,如果依赖对象发生异常,则会对我们自己的类造成影响。springIOC,用户只需要进行配置,就会在容器中自动实例化依赖对象,并且是单例模式,直接通过@autowired直接注入即可。IOC 主要是通过反射实现,
底层原理大概是这样的:
1、项目启动,加载web.xml;
2、在根据 web.xml 加载 spring 配置文件;
3、获取 bean 标签,读取 class 属性;
5、通过反射,获取该类的class 字节码对象;
6、调用实例化对象;
7、说 IOC 就离不开 DI,所谓 DI 是依赖注入,spring 的依赖注入有两种方式:构造注入和 setter 注入; spring 的 IOC 和 DI 的理解,大概就是通过反射和 dom4j 完成控制反转和依赖注入。Spring 的 IOC 有三种注入方式 :构造器注入、setter 方法注入、根据注解注入。

spring的 AOP 原理?

AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect), 减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。AOP 代理主要是通过反射动态代理实现。
(2)Aop所谓的动态代理就是说 AOP 框架不会去修改字节码, 而是每次运行时在内存中临时为方法生成一个 AOP 对象,这个 AOP 对象包含了目标对象的全部方法,并在特定的切点做了增强处理,并回调原对象的方发

JDK 动态代理和 CGLIB 动态代理的区别

一、概括来说JDK动态代理只能对实现了接口的类生成代理,而不能针对类CGLIB 是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)
(1)当 Bean 实现接口时,Spring 就会用 JDK 的动态代理
(2)当 Bean 没有实现接口时,Spring 使用 CGlib 来实现
(3) 可 以 强 制 使 用CGlib (1) CGLib 底层采用 ASM 字节码生成框架,使用字节码技术生成代理类,比使用 Java反射效率要高。​
唯一需要注意的是,CGLib 不能对声明为 final 的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
(2) 在对 JDK 动态代理与 CGlib 动态代理的代码实验中看,1W 次执行下,JDK7 及8 的动态代理性能比 CGlib 要好 20%左右。

数据库的乐观锁和悲观锁是什么

悲观锁,也就是在修改数据的时候,采用锁定状态,排斥外部请求的修改。遇到加锁的状态,就必须等待。我们的场景是“高并发”。会有很多这样的修改请求,每个请求都需要等待“锁”,某些线程可能永远都没有机会抢到这个“锁”,就会死在那里。同时,这种请求会很多,瞬间增大系统的平均响应时间,结果是可用连接数被耗尽,系统陷入异常。
乐观锁思路乐观锁,是相对于“悲观锁”采用更为宽松的加锁机制,大都是采用带版本号(Version)更新,实现就是,这个数据所有请求都有资格去修改,但会获得一个该数据的版本号,只有版本号符合的才能更新成功,其他的返回抢购失败。这样的话,我们就不需要考虑队列的问题,不过,它会增大CPU的计算开销。

更多推荐

面试录音总结

本文发布于:2024-03-07 18:56:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1718641.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!