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的执行流程?
答:
- javac编译HelloWorld.java,得到HelloWorld.class字节码文件。
- JVM将字节码文件加载进内存中(即方法区的类代码区中)。
- JVM找到HelloWorld的main方法,传递String类型参数的地址到主方法的args中去,并在栈区为args开辟内存空间,返回一个void的返回值。
- 创建一个“HelloWorld”对象,对象在方法区的常量数据区开辟空间,其属性值为“HelloWorld”。
- 定义一个String类型的变量s(在栈区开辟空间),变量s存放对象“HelloWorld”的地址。
- JVM找到标准类库中的System.class类并加载到内存中(即方法区的类代码区中),System初始化时会创建PrintStream标准字节输出流对象,调用println()方法将变量s的值打印到屏幕上。
- 流程图如下所示
7. linux熟悉的命令
答:
- 如果自己部署过服务器,那这个问题还不是so easy.可以参考这篇 终端命令小入门
- pwd 打印当前所在目录
- cat 打印文本文件内容
- vim 编辑文本
- tar 压缩文件
- ssh 登录服务器
- sudo 以系统管理者的身份执行指令
- chmod 修改文件权限
- mkdir 创建文件夹
- mv 移动
- cp 拷贝
- rm -rf 强制删除
- 查看服务器上跑的服务
- ps -ef|grep sssc|grep jar
- 模糊搜索日志
- cat sssc-soa-app_applicationLog_2019-07-25-3.log | grep “startup”
8. 为什么组合优先于继承?
答:
- 继承耦合度高,组合使用java多态的特性降低耦合度。
- 比如,采用继承的方式,当父类需要发生变动时,而其所有的子类都会反映出这种变动。而组合却可以抽象出一个共有的接口,然后传入指定的实现类,让其他不相关类避免受影响。
数据结构
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. 讲一讲数据库的优化有哪些?
答:
- 主从同步,读写分离
- 分库分表
- 水平分表
- 垂直分表
- 建立索引,提高查询性能
- 缓存,减少对数据库的访问
2. 数据库怎么建立索引,索引有哪几种?
答:参考文章Mysql创建索引
- 在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
- 主键索引,普通索引,唯一索引
- ALTER TABLE(用来创建普通索引、UNIQUE索引或PRIMARY KEY索引)
- ALTER TABLE table_name ADD INDEX index_name (column_list)
- ALTER TABLE table_name ADD UNIQUE (column_list)
- ALTER TABLE table_name ADD PRIMARY KEY (column_list)
- CREATE INDEX (对表增加普通索引或UNIQUE索引)
- CREATE INDEX index_name ON table_name (column_list)
- CREATE UNIQUE INDEX index_name ON table_name (column_list)
- 注:不能用CREATE INDEX语句创建PRIMARY KEY索引
- 注:PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引
- 删除索引
- DROP INDEX index_name ON talbe_name
- ALTER TABLE table_name DROP INDEX index_name
- ALTER TABLE table_name DROP PRIMARY KEY
- 注:如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
- 注:如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。
- 查看索引
- show index from tblname
- 字段解析
- Non_unique
- 如果索引不能包括重复词,则为0。如果可以,则为1。
- Index_type
- 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)
- Seq_in_index
- 索引中的列序列号,从1开始。
- Collation
- 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
- Cardinality
- 索引中唯一值的数目的估计值。
- 使用索引注意事项
- 查询较多,修改较少适合创建索引,经常插入、删除、修改的表不适合
- 建立索引会有相应的存储消耗
- 复合索引效率更高
3. 对redis了解吗?Redis有哪些数据结构?用来干什么?使用场景?
答:
- Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
- String(字符串):set与get
- Hash(哈希):hmset与hgetall
- list(列表) : lpush与lrange
- set(集合):sadd与smembers
- zset(sorted set:有序集合):zadd与zrangbyscore
4. 手写创建表,给表添加字段,修改字段的sql语句
答:
- 给表添加字段
- alter table t_cloud_user add salemoney DECIMAL(12,2) DEFAULT ‘0’ COMMENT ‘销售额’;
- 修改字段
- alter table t_cloud_user change m1 button VARCHAR(200) DEFAULT NULL COMMENT ‘button按钮’;
- 新建索引
- alter table t_sssc_salary add index Code_WAGENO(code,WAGENO);
- create index Code_WAGENO on t_sssc_salary(code,WAGENO);
- 删除索引
- DROP INDEX index_name ON talbe_name;
- ALTER TABLE table_name DROP INDEX index_name;
5. 主从同步延时的解决方案
- 缩小延时时间
- 修改主从库的配置参数,提高sql的执行效率
- 数据库的版本(5.6.3之后采取多线程同步)
- 提高从服务器的硬件性能(CPU,内存,SSD磁盘)
- 网络(局域网缩小同步延时时间)
- 不选择走从库
- 对于不经常更新的表,查询的时候配置直接走从库。
- 对于常更新的表(比如薪资表),更新之后放入缓存,查询的时候查缓存
多线程
1. 并发与并行,同步与异步,线程与进程的区别?
答:
2. 谈一谈线程池,常用的线程池有哪几种?线程池有什么作用?
答:
3. 线程池怎么使用?如何设置核心线程数,队列长度,以及最大线程数。
答:
4. 创建线程有哪几种方式?
答:
5. 线程有哪几种状态,如何进行转换的?
答:
6. synchronized的底层是怎么实现的?
答:
7. 手写生产者,消费者代码
答:
8. 如何避免死锁?
答:
框架与模式
1. 讲一下熟悉的设计模式?单例模式有哪几种?手写一个单例模式
答:
2. 单例模式和工厂模式的本质区别在哪里?
答:
3. 简单介绍一下springMVC的执行流程?
答:
4. 简单介绍一下Spring的两大核心?
答:
5. 看过spring的源码吗?说说底层是怎么实现的?
答:
–