校招面试题个人整理

java基础

1. Object类中有什么方法,讲一讲各个方法的作用?

答:

  • toString()
    • 打印对象实例的信息内容(描述我是谁)
  • getClass()
    • 获取类信息Class对象(骨子里特性)
  • equals()
    • 判断两个对象的地址引用是否相等,如果方法被覆盖的话,比较的是内容(谁会与我共鸣呢)。
  • hashCode()
    • 获取对象的hashCode值,用于区分对象实例的唯一性(每个人都是独一无二的)。
  • wait()
    • 当线程执行wait方法时,会使该对象进入等待池,释放锁资源,让其他线程执行。
  • notify()
    • 当线程执行notify时,会唤醒等待的线程。
  • clone()
    • 对象的浅拷贝(描述我是从哪来)
  • finalize()
    • 垃圾回收不再被引用的对象,释放内存(描述我要到哪去)。

2. sleep()与wait()方法的区别?

答:

  • sleep是Thread的静态方法,使得调用线程进入休眠状态,休眠的时候依然占据对象锁,其他线程拿不到锁会阻塞,但是会让出CPU资源给其他线程,等到休眠时间结束,线程就进入到就绪状态,和其他线程一起竞争CPU。
  • 而wait是Object类中的方法,当一个线程执行到wait方法时,它就进入一个和该对象相关的等待池,同时释放对象的锁,使得其他线程能够访问,可以通过notify,notifyAll()方法来唤醒等待的线程。

3. 说一下“==”与equals()的区别?

答:

  • “==”对于基本类型来说,比较的是内容(比如int类型,比较的是数值大小)。如果是引用类型,则比较的是对象的引用地址。
  • equals是Object基类中的方法,实现是比较引用地址(==),如果被覆盖,则比较的是内容。

4. equals与hashcode的区别?

答:

  • 这两个方法主要用于Set,HashTable中,如果对象要用Set(去重),HashTable存储(散列),则应该考虑重写hashCode方法。
  • 如果两个对象的equals方法相等,则调用hashCOde返回的哈希码值也相等。 但是,hashCode相等,不一定equals方法相等。
  • 注意,通常需要在重写hashCode()方法时重写equals方法,以便维护hashCode方法的 general contract,该方法声明equals相等的对象必须具有相等的散列代码。(看Object对象的源码)

5. 抽象类与接口的区别,本质区别是什么?

答:抽象类是为了实现代码的重用(复用),而接口是为了降低代码的耦合度。

6. java中打印HelloWorld的执行流程?

答:

  1. javac编译HelloWorld.java,得到HelloWorld.class字节码文件。
  2. JVM将字节码文件加载进内存中(即方法区的类代码区中)。
  3. JVM找到HelloWorld的main方法,传递String类型参数的地址到主方法的args中去,并在栈区为args开辟内存空间,返回一个void的返回值。
  4. 创建一个“HelloWorld”对象,对象在方法区的常量数据区开辟空间,其属性值为“HelloWorld”。
  5. 定义一个String类型的变量s(在栈区开辟空间),变量s存放对象“HelloWorld”的地址。
  6. JVM找到标准类库中的System.class类并加载到内存中(即方法区的类代码区中),System初始化时会创建PrintStream标准字节输出流对象,调用println()方法将变量s的值打印到屏幕上。
  • 流程图如下所示
    HelloWorld的执行流程 java版

7. linux熟悉的命令

答:

  1. 如果自己部署过服务器,那这个问题还不是so easy.可以参考这篇 终端命令小入门
  2. pwd 打印当前所在目录
  3. cat 打印文本文件内容
  4. vim 编辑文本
  5. tar 压缩文件
  6. ssh 登录服务器
  7. sudo 以系统管理者的身份执行指令
  8. chmod 修改文件权限
  9. mkdir 创建文件夹
  10. mv 移动
  11. cp 拷贝
  12. rm -rf 强制删除
  13. 查看服务器上跑的服务
    1. ps -ef|grep sssc|grep jar
  14. 模糊搜索日志
    1. cat sssc-soa-app_applicationLog_2019-07-25-3.log | grep “startup”

8. 为什么组合优先于继承?

答:

  1. 继承耦合度高,组合使用java多态的特性降低耦合度。
  2. 比如,采用继承的方式,当父类需要发生变动时,而其所有的子类都会反映出这种变动。而组合却可以抽象出一个共有的接口,然后传入指定的实现类,让其他不相关类避免受影响。

数据结构

1. List元素实现删除有哪些注意的?

答:Collection集合相关类做删除操作时,不能边遍历边删除,因为内部维持了expectedModCount这么一个字段,如果modCount != expectedModCount并不等于,则会抛出ConcurrentModificationException异常。

2. 讲一下HashMap与HashTable的区别?HashMap的扩容方式,get()方法和put()方法,最好能写出代码。ConCurrentHashMap的实现原理?

答:

3. 数组和链表的区别,ArrayList的扩容方式?

答:

4. 队列与栈的区别,介绍常见的使用场景?

答:

5. 手写一个Hashmap的遍历?

答:

6. HashSet是怎么实现的?

答:

7. 手写二叉树的遍历。

答:

算法

1. 快排与冒泡的区别?手写一个试试?

答:

2. 手写一个二分查找和归并排序?

答:

3. 单链表的反转?迭代与递归的实现方式?

答:

JVM

1. 按照你的理解,讲讲JVM内存结构?

答:

2. 讲讲垃圾回收,常见的垃圾回收算法有什么?

答:

3. 什么情况下会触发FULL GC?什么情况下会触发Mini GC?

答:

网络

1. 输入URL到页面加载发生了什么?

答:

2. 讲一讲TCP三次握手,四次挥手,画一下

答:

3. 悲观锁与乐观锁的区别?

答:

4. servlet API中forward()与redirect()的区别?

答:

5. 讲一下get与post的区别?

答:

6. 常见http的协议状态有哪些?

答:

7. TCP与UDP的区别?

答:

8. 讲讲序列化的底层实现原理。

答:

数据库

1. 讲一讲数据库的优化有哪些?

答:

  1. 主从同步,读写分离
  2. 分库分表
    1. 水平分表
    2. 垂直分表
  3. 建立索引,提高查询性能
  4. 缓存,减少对数据库的访问

2. 数据库怎么建立索引,索引有哪几种?

答:参考文章Mysql创建索引

  1. 在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
  2. 主键索引,普通索引,唯一索引
  3. ALTER TABLE(用来创建普通索引、UNIQUE索引或PRIMARY KEY索引)
    1. ALTER TABLE table_name ADD INDEX index_name (column_list)
    2. ALTER TABLE table_name ADD UNIQUE (column_list)
    3. ALTER TABLE table_name ADD PRIMARY KEY (column_list)
  4. CREATE INDEX (对表增加普通索引或UNIQUE索引)
    1. CREATE INDEX index_name ON table_name (column_list)
    2. CREATE UNIQUE INDEX index_name ON table_name (column_list)
    3. 注:不能用CREATE INDEX语句创建PRIMARY KEY索引
    4. 注:PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引
  5. 删除索引
    1. DROP INDEX index_name ON talbe_name
    2. ALTER TABLE table_name DROP INDEX index_name
    3. ALTER TABLE table_name DROP PRIMARY KEY
    4. 注:如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
    5. 注:如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。
  6. 查看索引
    1. show index from tblname
    2. 字段解析在这里插入图片描述
      1. Non_unique
        1. 如果索引不能包括重复词,则为0。如果可以,则为1。
      2. Index_type
        1. 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)
      3. Seq_in_index
        1. 索引中的列序列号,从1开始。
      4. Collation
        1. 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
      5. Cardinality
        1. 索引中唯一值的数目的估计值。
  7. 使用索引注意事项
    1. 查询较多,修改较少适合创建索引,经常插入、删除、修改的表不适合
    2. 建立索引会有相应的存储消耗
    3. 复合索引效率更高

3. 对redis了解吗?Redis有哪些数据结构?用来干什么?使用场景?

答:

  1. Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
  2. String(字符串):set与get在这里插入图片描述
  3. Hash(哈希):hmset与hgetall在这里插入图片描述
  4. list(列表) : lpush与lrange在这里插入图片描述
  5. set(集合):sadd与smembers在这里插入图片描述
  6. zset(sorted set:有序集合):zadd与zrangbyscore在这里插入图片描述

4. 手写创建表,给表添加字段,修改字段的sql语句

答:

  1. 给表添加字段
    1. alter table t_cloud_user add salemoney DECIMAL(12,2) DEFAULT ‘0’ COMMENT ‘销售额’;
  2. 修改字段
    1. alter table t_cloud_user change m1 button VARCHAR(200) DEFAULT NULL COMMENT ‘button按钮’;
  3. 新建索引
    1. alter table t_sssc_salary add index Code_WAGENO(code,WAGENO);
    2. create index Code_WAGENO on t_sssc_salary(code,WAGENO);
  4. 删除索引
    1. DROP INDEX index_name ON talbe_name;
    2. ALTER TABLE table_name DROP INDEX index_name;

5. 主从同步延时的解决方案

  1. 缩小延时时间
    1. 修改主从库的配置参数,提高sql的执行效率
    2. 数据库的版本(5.6.3之后采取多线程同步)
    3. 提高从服务器的硬件性能(CPU,内存,SSD磁盘)
    4. 网络(局域网缩小同步延时时间)
  2. 不选择走从库
    1. 对于不经常更新的表,查询的时候配置直接走从库。
    2. 对于常更新的表(比如薪资表),更新之后放入缓存,查询的时候查缓存

多线程

1. 并发与并行,同步与异步,线程与进程的区别?

答:

2. 谈一谈线程池,常用的线程池有哪几种?线程池有什么作用?

答:

3. 线程池怎么使用?如何设置核心线程数,队列长度,以及最大线程数。

答:

4. 创建线程有哪几种方式?

答:

5. 线程有哪几种状态,如何进行转换的?

答:

6. synchronized的底层是怎么实现的?

答:

7. 手写生产者,消费者代码

答:

8. 如何避免死锁?

答:

框架与模式

1. 讲一下熟悉的设计模式?单例模式有哪几种?手写一个单例模式

答:

2. 单例模式和工厂模式的本质区别在哪里?

答:

3. 简单介绍一下springMVC的执行流程?

答:

4. 简单介绍一下Spring的两大核心?

答:

5. 看过spring的源码吗?说说底层是怎么实现的?

答: