23秋招接近尾声了~

目录

  • 9.24 鼎桥技术面
  • 9.30 湖南联通面试(已OC)
  • 10.08 比亚迪面试(已OC)
  • 10.10 康佳一面
  • 10.13 招银网络技术一面
  • 10.13 平安产险一面
  • 10.13 东软一面

9.24 鼎桥技术面

岗位:软件开发工程师(Java)

  1. 数据库第一,二,三范式

第一范式:每一列都是不可分割的原子数据项
第二范式:属性完全依赖于主键(消除部分依赖)
第三范式:任何非主属性不依赖于其他非主属性(消除传递依赖)

  1. wait vs sleep

不同点:
① 方法归属不同 sleep是Thread的静态方法,wait是Object的成员方法
② 醒来时机不同 sleep/wait(long)在等待相应毫秒醒来, wait/wait(long)可以被notify唤醒
③ 锁特性不同 wait方法调用必须获得wait对象的锁,而sleep不用;wait方法执行后会释放锁,而sleep不会释放对象锁
④ wait,notify和notifyAll只能在同步方法或者同步块里面使用,而sleep可以在任何地方使用
⑤ sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
相同点:
①让当前线程暂时放弃CPU的使用权,由运行态进入阻塞态
②都可以通过interrupt方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。

  1. sleep 为什么要捕获异常? 捕获的是什么异常?

需要捕获InterruptedException
Thread.sleep()是让线程休眠。在这种睡眠状态下,可能调用interrupt来终止线程,这样就会抛出InterruptedException,只有捕获异常并处理,才能正确的终止线程

  1. String,StringBuilder,StringBuffer

String对象是不可变的, 线程安全
StringBuffer 是可变的, 对方法加了同步锁, 线程安全
StringBuilder是可变的, 非线程安全

  1. 对HashMap的了解

HashMap 是一个散列表,存储的内容是键值对(key-value)映射。
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步,非线程安全。
HashMap 是无序的,即不会记录插入的顺序。
数据结构:JDK1.7:数组+链表,JDK1.8:数组+链表/红黑树
初始容量大小默认值为16,加载因子默认0.75f,当元素个数超过数组容量*加载因子时数组扩容

  1. 红黑树

HashMap中红黑树用来避免DOS攻击,防止链表超长性能低下
1.根节点为黑色
2.叶子节点是红色
3.一个节点是红色,其两个子节点必须是黑色
4.每个节点到叶子节点的所有路径都包含相同数目的黑色节点

  1. 树化的条件

当链表长度超过阈值8,且数组容量超过64

  1. synchronized

synchronized关键字可以保证在同一时刻, 被修饰的类、代码块或方法只会有一个线程执行,以达到保证并发安全的效果。是Java中解决并发问题的一种最常用的方法。
修饰实例方法:作用于当前实例
修饰静态方法:作用于当前类
修饰代码块:指定加锁对象,对给定对象加锁

  1. equals 和 hashCode方法

hashCode()获取哈希码,用于确定对象在哈希表中的索引位置
equals()用于判断两个对象是否相等
两个方法的关系:
①两个对象equals,则hashCode一定相等
②两个对象不equals,则hashCode有可能相等
③两个对象hashCode相等,不一定equals
④两个对象hashCode不相等,一定不equals
为什么重写equals方法必须重写hashCode方法?
判断时先根据hashCode判断,相等情况下再根据equals方法判断。若重写equals方法而不重写hashCode方法,则hashCode值不同时equals方法的结果为true,即造成相同对象散列到不同位置而导致对象不能覆盖。

  1. java 值传递和引用传递

值传递:方法调用时,传递的参数是按值的拷贝传递,即传递后互不相关了
引用传递:方法调用时,传递的参数是按引用进行传递,传递的是引用的地址
基本类型作为参数是值传递,引用类型作为参数也是值传递,不过值是引用的地址

  1. JAVA的四种引用

强引用:如变量赋值,通过GC Root引用,不会被回收;当赋值为null时会被回收
弱引用:只要发生垃圾回收,就会释放对象,如ThreadLocalMap中的Entry对象
软引用:首次垃圾回收不会被回收,再次回收时会释放对象,如反射数据
虚引用:通过虚引用得到哪些对象已被回收

  1. 垃圾回收算法

标记清除算法:标记阶段标记出所有需要被回收的对象,清除阶段回收被标记的对象所占用的空间。// 算法简单,垃圾少时效率高;产生内存碎片
标记整理算法:多了一步整理,将存活的对象移到一端。// 解决内存碎片问题;性能较慢
标记复制算法:将内存一分为二,将存活对象从from复制到to,然后交换from,to的位置。// 垃圾多时效率高,无内存碎片;会占用成倍的空间
分代回收算法:根据对象特性将回收区域分为新生代和老年代,新生代采用标记复制算法,老年代采用标记整理算法。

引用计数法
在某个对象被引用指向时,将其引用数量计数。每多一个引用指向这个对象,计数 + 1,每少一个引用指向这个对象,计数 -1,当计数为 0 时,表示这个对象成为了一个垃圾,将其回收掉。
缺点:无法解决循环引用

  1. 线程有哪些状态

新建
运行
终结
阻塞
等待
有时限等待

  1. 怎么保证线程安全

保证原子性(提供互斥访问,同一时刻只能有一个线程对数据进行操作)、有序性(保证线程内串行语义,避免指令重排序)和可见性(一个线程对主内存的修改可以及时地被其他线程看到)
①使用线程同步,synchronized / lock
②使用Volatile关键字
③使用Atomic变量
④使用final关键字

  1. 线程池

线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销。
好处:降低资源消耗、提高响应速度、提高线程的可管理性

  1. 死锁是什么

死锁(Deadlock)是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。

  1. 怎么选择数据结构

  2. 堆栈和队列

1、堆栈:后进先出,队列:先进先出
2、堆栈:只需要一个引用指针top,队列:需要两个引用指针rear、front
3、检查是否为空:堆栈,top = = -1;队列:front = = -1 或 rear = = -1
4、堆栈:插入删除都发生在top端,队列:插入发生在rear端,删除发生在front端
5、检查是否为满:堆栈,top = = max - 1,队列:front = = -1或 front = = rear + 1
6、栈是先入后出的,一般是由高地址向低地址生长。堆和栈的生长方向恰好相反

  1. ArrayList和HashMap怎么选择

如果需要储存多个单度元素不需要键值对形式,应该使用ArrayList。需要键值对形式的数据时,应该使用HashMap。

  1. 怎么学习

  2. 项目过程中遇到难以解决的问题是什么

  3. 项目数据库的实现

  4. 为什么更喜欢后端开发

小结:知识点都有刷到,但是回答得不清晰,部分记得不牢固,语言表达比较结巴。

9.30 湖南联通面试(已OC)

自我介绍 (有点慌了,感觉没说好)

面试官1

  1. 问 ArrayList 和 LinkedList 的区别

1、数据结构不同;ArrayList基于动态数组,需要连续内存;LinkedList基于双向链表,无需连续内存。
2、随机访问性能;ArrayList根据索引访问,随机访问快;LinkedList随机访问慢
3、插入删除性能;ArrayList尾部插入删除性能好,其他地方性能慢;LinkedList头尾插入删除性能高
4、内存方面;ArrayList可以利用CPU缓存;LinkedList占用内存较多
5、线程安全;ArrayList是线程不安全的,而LinkedList是线程安全的。

  1. Arraylist扩容过程

当元素个数超过数组容量时,进行扩容,新的容量为旧的容量的1.5倍。以新的容量建一个原数组的拷贝,修改原数组,指向这个新数组,原数组被GC回收。

  1. 数据库如何查询最大值

①select column from table order by xxx desc limit 1; O(n*log n)
②select max(column) from table; O(n) 聚集函数 max (面试官提示)

  1. 这两种方式哪个性能比较快

函数
order by 能用索引吗
-可以,order by中使用索引可避免重新排序导致CPU资源浪费

  1. MySQL 的端口号

3306

面试官2
6. 为什么项目用到加密算法 AES

AES是对称加密算法,加密和解密用到的密钥是相同的,加密速度非常快。
AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。

  1. 进一步问对称和非对称加密算法有哪些
    (没专门记,只答了我会的,用过 AES 和MD5)

对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6
非对称加密算法:RSA,DSA/DSS,ECC
// Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1

  1. 进一步问MD5 算法是加密算法吗?
    (不是,是散列算法 )

面试官3
给智商和情商打分,一起100分(智商40情商60)
进一步问原因

还有问到我家里人在湖南 xx ,想回湖南

整体感受:
等了一个半小时,不算太长;
有助理姐姐 cue 流程;
问题比较少,可能十分钟以内就结束面试了;
感觉真的有在看简历,还挺好的;
没啥面经,不好准备,有点措手不及;

10.08 比亚迪面试(已OC)

晚8点14开始,面了快35分钟
问项目 问主修课程学了什么
有cue我英语自我介绍没准备
问会哪些编程语言及掌握程度
问在校期间遇到的最困难的事

10.10 康佳一面

岗位:软件设计师
一面:HR面+专业面,30min
HR面很轻松,面试官太温柔了吧
自我介绍,问校园经历,问个人爱好,问家庭情况,印象最深刻的事,别人怎么评价你,你怎么评价自己……
专业面主要问项目
针对项目问一些问题

10.13 招银网络技术一面

岗位:软件开发工程师
自我介绍,根据技术栈提问

  1. SpringBoot怎么切面编程

AOP,面向切面编程,一句话说明,把一些公共的、和业务无关的功能性代码抽取出来,在运行的时候动态的往业务方法上植入。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
定义切面步骤:
(1) 切面类加@Aspect 、@Service注解,告诉springboot这是一个切面类,帮我管起来;
(2) 定义切点@Pointcut
(3) 定义切入点切入的时机及完成的功能(@Around、@Before、@After、@AfterReturning、@AfterThrowing);

  1. MySQL,SQL优化(根据回答再提问)

1、在表中建立索引,优先考虑where、group by使用到的字段。
2、尽量避免使用select ,返回无用的字段会降低查询效率。优化方式:使用具体的字段代替,只返回使用到的字段。
3、尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。优化方式:如果是连续数值,可以用between代替;如果是子查询,可以用exists代替。
4、尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描。优化方式:可以用union代替or。
(PS:如果or两边的字段是同一个。貌似两种方式效率差不多,即使union扫描的是索引,or扫描的是全表)
5、尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描。
优化方式:尽量在字段后面使用模糊查询。
6、尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。
优化方式:可以给字段添加默认值0,对0值进行判断。
7、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。优化方式:可以将表达式、函数操作移动到等号右侧。
8、当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描。
优化方式:用代码拼装sql时进行判断,没where加where,有where加and。

  1. 联合索引举例问是否走索引

联合索引必须遵循最左前缀法则,即查询从索引的最左列开始,并且不跳过某一列,若跳过某一列,后面是索引字段失效。
在查询时,联合索引的最左边的字段必须存在,与SQL编写的顺序无关

  1. SpringBoot怎么获取bean对象

1、启动类ApplicationContext。在springboot的启动类中,定义static变量ApplicationContext,利用容器的getBean方法获得依赖对象。
2、手动注入ApplicationContext。
3、注解@PostConstruct。用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。
4、依赖注入,通过@Service、@Autowire、@Resource注解

  1. Spring事务实现,会报什么异常

1、Spring事务的实现方式
编程式事务:在代码中进行事务控制。优点:精度高。缺点:代码耦合度高
声明式事务:①通过@Transactional注解实现事务控制②在配置文件(XML)中做相关的事务规则声明
2、Spring事务实现原理:
当在某个类或者方法上使用@Transactional注解后,spring会基于该类生成一个代理对象,并将这个代理对象作为bean。当调用这个代理对象的方法时,如果有事务处理,则会先关闭事务的自动功能,然后执行方法的具体业务逻辑,如果业务逻辑没有异常,那么代理逻辑就会直接提交,如果出现任何异常,那么直接进行回滚操作。当然我们也可以控制对哪些异常进行回滚操作。
3、Spring处理异常事务机制
Spring事务异常处理机制只会对RuntimeException 和Error 级别的异常执行回滚操作
@Transactional(rollbackFor = xxxException.class)

  1. Mybatis #{}和${}的区别

#{} 参数占位符,即预编译,可以防止SQL注入
将传入的数据都当成一个字符串,会对传入的变量自动加一个单引号。
${} 字符串替换符,即SQL拼接。将传入的参数直接显示生成在sql中,且不加任何引号。

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#;
${}方式一般用于传入数据库对象,例如传入表名。

10.13 平安产险一面

  1. 静态代码块和构造方法哪个先加载?为什么

静态代码块>构造代码块>构造函数>普通代码块
静态代码块是主动加载的,在类加载时执行;构造方法在创建对象时才会加载(懒加载)

  1. 接口和抽象类的区别

1)接口只有定义,不能有方法的实现,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。
2)实现接口的关键字为 implements,继承抽象类的关键字为 extends。一个类可以实现多个接口,但一个类只能继承一个抽象类,因此,使用接口可以间接地达到多重继承的目的。
3)接口强调特定功能的实现,其设计理念是“like-a”关系,而抽象类强调所属关系,其设计理念为“is-a”关系。
4)接口中定义的成员变量默认为public static final,只能够有静态的不能被修改的数据成员,而且,必须给其赋值,其所有的成员方法都是public,abstract的,而且只能被这两个关键字修饰。而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法,而且,抽象类中的成员变量默认为default,也可以被定义为pirvate,protected和public。
补充接口和抽象类的相同点:
1、都不能被实例化。
2、接口的实现类和抽象类的子类只有全部实现了接口或者抽象类中的方法后才可以被实例化。

  1. 接口的默认修饰符

接口中的成员变量的默认修饰符为public static final,方法的默认修饰符为public abstract

  1. 深拷贝和浅拷贝

浅拷贝 :只复制指向某个对象的指针,而不复制对象本身,相当于是新建了一个对象,该对象复制了原对象的指针,新旧对象还是共用一个内存块。
深拷贝:是新建一个一模一样的对象,该对象与原对象不共享内存,修改新对象也不会影响原对象

  1. String两种创建方式

①双引号方式。在创建的时候,JVM 会检查在字符串池中,是否已经存在该字符串,如果已经存在了,那么会返回这个字符串的引用给变量 s。如果不存在,那么会创建一个 abc 字符串对象,再赋值给 s1。因此,可能只创建 1 个或者 0 个对象。
②new方式。会在内存中创建 1 个或者 2 个对象。把 new String(“abc”) 这句话拆成两个部分来看,一个是”abc”, 另一个是 new String()。如果 abc 字符串已经在字符串池中存在了,那么就不需要在创建 abc 字符串的对象了,但是 new String 这行代码会再构造出一个和 abc 一样的字符串,并且是放在堆上。

  1. StringBuilder和StringBuffer哪个线程安全

StringBuffer通过synchronized实现线程安全,StringBuilder线程不安全

  1. 序列化和反序列化,作用

把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
反序列化用于重建对象。

  1. BIO,AIO,NIO

Java 3种网络编程的I/O模型
BIO:同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。
NIO:同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理。
AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理,一般适用于连接数较多且连接时间较长的应用。

  1. 线程的状态

Java:新建、运行、终结、阻塞、有时限阻塞
操作系统:新建、就绪、等待、运行、终结

  1. 比较sleep和wait

不同点:
① 方法归属不同 sleep是Thread的静态方法,wait是Object的成员方法
② 醒来时机不同 sleep/wait(long)在等待相应毫秒醒来, wait/wait(long)可以被notify唤醒
③ 锁特性不同 wait方法调用必须获得wait对象的锁,而sleep不用;wait方法执行后会释放锁,而sleep不会释放对象锁
④ wait,notify和notifyAll只能在同步方法或者同步块里面使用,而sleep可以在任何地方使用
⑤ sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
相同点:
①让当前线程暂时放弃CPU的使用权,由运行态进入阻塞态
②都可以通过interrupt方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。

  1. 比较synchronized和lock

1:Synchronized 是Java的一个关键字,而Lock是java.util.concurrent.Locks 包下的一个接口;
2:Synchronized 使用过后,会自动释放锁,而Lock需要手动上锁、手动释放锁。(在 finally 块中)
3:Lock提供了更多的实现方法,而且 可响应中断、可定时, 而synchronized 关键字不能响应中断;
4:synchronized关键字是非公平锁,即,不能保证等待锁的那些线程们的顺序,而Lock的子类ReentrantLock默认是非公平锁,但是可通过一个布尔参数的构造方法实例化出一个公平锁;
5:synchronized无法判断,是否已经获取到锁,而Lock通过tryLock()方法可以判断,是否已获取到锁;
6:二者的底层实现不一样:synchronized是同步阻塞,采用的是悲观并发策略;Lock是同步非阻塞,采用的是乐观并发策略(底层基于volatile关键字和CAS算法实现)

  1. start和run

1、start方法用来启动相应的线程;
2、run方法只是thread的一个普通方法,在主线程里执行;
3、需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法;
4、run方法必须是public的访问权限,返回类型为void。

  1. volatile

volatile是Java虚拟机提供的轻量级同步机制。
保证可见性、不保证原子性、禁止指令重排(保证有序性)

  1. 什么是可重入锁

一个线程不用释放,可以重复的获取一个锁n次,只是在释放的时候,也需要相应的释放n次。eg. synchronized、ReentrantLock,可重入锁相对来说简化了并发编程的开发。

  1. ACID

Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

  1. SQL执行计划

SQL执行计划是指SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。
在MySQL使用 explain 关键字来查看SQL的执行计划。

  1. SpringMVC和Springboot

联系
Spring最初利用工厂模式(DI)和代理模式解耦应用组件,为了解耦开发了springmvc;而实际开发过程中,经常会使用到注解,程序的样板很多,于是开发了starter,这套就是springboot。
区别
1.springboot是约定大于配置,可以简化spring的配置流程;springmvc是基于servlet的mvc框架,个人感觉少了model中的映射。
2.以前web应用要使用到tomat服务器启动,而springboot内置服务器容器,通过@SpringBootApplication中注解类中main函数启动即可。

  1. @Autowired和@Resource区别

1、@Autowired是Spring中的注解,@Resource是java提供的注解
2、@Autowired会先按byType去找,如果没找到,则会按照byName去找
@Resource会先按byName去找,如果没找到则会byType去找。如果设置了name属性,则只会按byName去找,找不到就报错。
3、@Resource效率更高

  1. AOP和IOC
  1. 垃圾回收算法
  1. CPU过高的排查方法

1、TOP命令,Linux命令,可以查看实时的CPU使用情况
2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
显示线程列表:ps -mp pid -o THREAD,tid,time 找到耗时最高的线程
3、jstack:Java命令,查看某个进程的当前线程栈运行情况,可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等
4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。

10.13 东软一面

一开始就问能不能实习
好吧我就嫖个面试
类加载
虚拟机栈
单例模式
Spring中的设计模式
垃圾回收机制
HashMap的数据结构,树化条件
SpringMVC的流程
Mybatis和Mybatis Plus的区别

你可能感兴趣的:(笔记,面试,java)