Java第一次面试复盘2020/5/28

进程线程区别
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程
资源分配给进程,同一进程的所有线程共享该进程的所有资源;
进程是资源分配的最小单位
线程是操作系统调度(CPU调度)执行的最小单位(程序执行的最小单位)


面霸篇:万字 MySQL 面试终结(30 问与答)

正文

1.自我介绍

2.Redis用过哪些功能
缓存,短信验证码过期时间

3.Redis常用的数据结构
string、hash、list、set和sorted set

有序集合是怎么查找的
二分查找

既然是一个集合,怎么做到有序
使用TreeSet,或者TreeMap集合,底层都是红黑树

Redis有一个跳跃表结构
跳表具有如下性质:
(1) 由很多层结构组成
(2) 每一层都是一个有序的链表
(3) 最底层(Level 1)的链表包含所有元素
(4) 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。
(5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。
参考文章:https://www.jianshu.com/p/c2841d65df4c

docker是怎么样的
基于go语言开发的,可以拿来做集群

Docker是什么?
Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。

nginx用来干嘛
反向代理,负载均衡,动静分离

怎么样做到均衡

轮询(默认),除了轮询还有其他吗?
Nginx可使用的负载均衡策略有:轮询(默认)、权重、ip_hash、url_hash(第三方)、fair(第三方)。

微信支付,你怎么知道订单有没有完成?
假如微信支付成功后会返回成功状态码,但是你没有接收到?

怎么保证这个订单是成功的?文档有教你做定时任务,定时任务是基于什么的?

linux有一个定时任务你知道吗?
crontab
常用命令高级版
free
jps
yum install
df
systemctl
chmod
kill -9
netstat
查看8111端口占用的应用
netstat -tunlp|grep 8111
ps -ef | grep nginx
`
linux常用命令?

firewall-cmd --state  #查看防火墙
systemctl status firewalld #查看防火墙
systemctl stop firewalld #临时关闭防火墙
systemctl start firewalld #临时打开防火墙
systemctl disable firewalld #开机禁止启动防火墙
systemctl enable firewalld #开机启动防火墙

文件操作【增,删,改,查】
在当前目录下创建一个名为aaa的目录     mkdir aaa            
在当前目录创建一个名为aa.txt的文件   touch  aa.txt
删除文件命令                      rm -rf 文件名
修改文件                          vi或vim
文件的查看命令:               cat/more/less/tail
设置所有人可以读写及执行            chmod 777
结束进程:kill
命令:kill pid 或者 kill -9 pid(强制杀死进程)           pid:进程号
查看当前目录路径                    pwd
查看所有正在运行的进程              ps -ef
切换用户                         su - 用户名

unzip
打包并压缩/usr/tmp 下的所有文件 压缩后的压缩包指定名称为xxx.tar
tar -zcvf ab.tar aa.txt bb.txt
tar [-zxvf] 压缩文件
压缩解压参考文章:https://www.cnblogs.com/wxlf/p/8117602.html
https://www.jianshu.com/p/0cc030c8b230

查看磁盘容量的命令?
df

mysql有做过一些查询优化吗
怎么判定一条sql要怎么优化

加索引你怎么知道加在哪个字段?哪个字段加索引?
表的主键、外键必须有索引
经常出现在Where子句中的字段,特别是大表的字段,应该建立索引
经常与其他表进行连接的表,在连接字段上应该建立索引

有用过explain关键字吗
用explain这个命令来查看一个这些SQL语句的执行计划

有了解过Redis的缓存雪崩吗?
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案:
1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2.如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3.设置热点数据永远不过期。

Java集合?
1.集合主要分为Collection和Map两个接口。
2.Collection又分别被List和Set继承。
3.List被AbstractList实现,然后分为3个子类,ArrayList,LinkList和Vector。
4.Set被AbstractSet实现,又分为2个子类,HashSet和TreeSet。
5.Map被AbstractMap实现,又分为2个子类,HashMap和TreeMap。
6.Map被Hashtable实现。
HashMap31连环炮

hashSet和hashMap有什么区别?有什么特点
Map怎么存的,底层结构?
Set怎么存的,底层结构?
集合安全性:https://www.cnblogs.com/wuchaodzxx/p/6007970.html
在这里插入图片描述

集合(Collection)框架底层数据结构总结
List:
Vector: Object[] 数组;线程安全
Arraylist: Object[]数组;
LinkedList: 双向链表(JDK1.6 之前为双向循环链表,JDK1.7 取消了循环)
ArrayList集合查询数据很快,但是增删数据很慢;LinkedList集合增删数据很快。但是查询数据很慢。
Set:
**HashSet(无序,唯一): 基于 HashMap 实现的即哈希表,底层采用 HashMap 来保存元素
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树,即平衡二叉树)
Map:
HashMap:元素以键值对方式存储,允许使用 null 值和 null 键,HashMap是线程不安全的jdk1.7是数组+链表,1.8则是数组+链表+红黑树结构(当链表长度大于8,转为红黑树)。1.7中新增节点采用头插法,头插容易导致HashMap链表死循环,1.8中新增节点采用尾插法。这也是为什么1.8不容易出现环型链表的原因。键为null的元素都始终位于哈希表table【0】中。
简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干
HashMap的默认初始长度是16,并且每次自动扩展或是手动初始化时,长度必须是2的幂
接受值为null的Key 或Value
put 插入数据流程?
往map插入元素的时候首先通过对key hash然后与数组长度-1进行与运算((n-1)&hash),都是2的次幂所以等同于取模,但是位运算的效率更高。找到数组中的位置之后,如果数组中没有元素直接存入,反之则判断key是否相同,key相同就覆盖,否则就会插入到链表的尾部,如果链表的长度超过8,则会转换成红黑树,最后判断数组长度是否超过默认的长度*负载因子也就是12,超过则进行扩容。
TreeMap底层数据结构:红黑树
Hashtable底层数据结构:数组+链表,线程安全
不接受值为null的Key 或Value
ConcurrentHashMap:底层采用分段的数组+链表实现,线程安全
如何选用集合?
需要根据键值获取元素值时,就选用 Map 接口下的集合,如排序时选择 TreeMap,不需要排序时就选择 HashMap,需要保证线程安全就选用 ConcurrentHashMap。当我们只需要存放元素值时,就选择实现 Collection接口的集合,若需要保证元素唯一,则选择实现 Set 接口的集合,比如 TreeSet 或 HashSet,不需要就选择实现 List接口的,比如 ArrayList 或 LinkedList,最后再根据实现这些接口的具体集合特点来选用。

有了解过哈希冲突吗?
两个不同的数据计算后的结果一样
(一)线性探测法
(二)二次探测法
(三)链地址法
再哈希
链表法

Java字符串有了解吗?就String有什么特点
String类是final类,并且该类中的成员方法都默认为final方法,被final修饰的类是不允许被继承的
“String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”
参考文章:https://www.cnblogs.com/xiaoxi/p/6036701.html
(a字符串指向b字符串)

Java垃圾回收?
判断哪些对象需要被回收,有以下两种方法:
1.引用计数法
2.可达性分析算法

有没有可能直接进入老年区?
大对象直接进入老年代

多线程有了解吗?怎么创建线程的?
继承Thread,重写run()方法
实现Runnable,重写run()方法
使用Callable和Future创建线程
使用线程池例如用Executor框架

设计模式?举个例子
总体来说设计模式分为三大类:

创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

参考文章1:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
参考文章2:https://blog.csdn.net/A1342772/article/details/91349142
单例模式在哪里用到过?
应用实例:
1、一个班级只有一个班主任。
2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

单例模式怎么实现的?
一个类只有一个实例
步骤 1
创建一个 Singleton 类。

SingleObject.java

public class SingleObject {
 
   //创建 SingleObject 的一个对象
   private static SingleObject instance = new SingleObject();
 
   //让构造函数为 private,这样该类就不会被实例化
   private SingleObject(){}
 
   //获取唯一可用的对象
   public static SingleObject getInstance(){
      return instance;
   }
 
   public void showMessage(){
      System.out.println("Hello World!");
   }
}

步骤 2
从 singleton 类获取唯一的对象。

SingletonPatternDemo.java

public class SingletonPatternDemo {
   public static void main(String[] args) {
 
      //不合法的构造函数
      //编译时错误:构造函数 SingleObject() 是不可见的
      //SingleObject object = new SingleObject();
 
      //获取唯一可用的对象
      SingleObject object = SingleObject.getInstance();
 
      //显示消息
      object.showMessage();
   }
}

步骤 3
执行程序,输出结果:

Hello World!

一些排序算法有了解吗?
冒泡排序,快速排序,堆排序,选择排序,插入排序,希尔排序,归并排序,计数排序,桶排序,基数排序
在这里插入图片描述

参考文章:https://www.runoob.com/w3cnote/ten-sorting-algorithm.html

冒泡排序原理?
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

查找算法有了解吗?
1.顺序查找
2. 二分查找(折半查找)
3. 插值查找
4. 斐波那契查找
5. 树表查找
6. 分块查找
7. 哈希查找
参考文章:https://www.cnblogs.com/maybe2030/p/4715035.html
https://www.cnblogs.com/yw09041432/p/5908444.html
https://cloud.tencent.com/developer/article/1190645
二分查找是怎么样的?
条件:有序数组
原理:查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
如果在某一步骤数组为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值