微保后端面试问题与解答20200430

基本类型和对象的区别是什么(只说了对象大小,没有提到内存中的引用和数据方面)String是基本类型吗,它和StringBuffer以及StringBuilder的区别是什么

1、StringBuffer与StringBuilder 中的方法和功能完全是等价的,

2、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。

3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全,而StringBuffer则每次都需要判断锁,效率相对更低

实现原理:StringBuffer类继承自AbstractStringBuilder抽象类,实现Serializable序列化接口和CharSequence接口。AbstractStringBuilder抽象类实现Appendabel,CharSequence接口。

vector和ArrayList的区别,跟LinkedList呢(说到了数据结构,线程安全)

数据结构:

Arraylist:底层是基于动态数组,根据下表随机访问数组元素的效率高,向数组尾部添加元素的效率高;但是,删除数组中的数据以及向数组中间添加数据效率低,因为需要移动数组。

Linkedlist基于链表的动态数组,数据添加删除效率高,只需要改变指针指向即可,但是访问数据的平均效率低,需要对链表进行遍历。

线程安全:两者都是线程不安全的。在多链表的在多线程的时候:链表容易产生的闭环的问题

问线程安全是什么,怎么做到线程安全

是指当多个线程访问同一个变量时,该变量不会因为多线程访问度产生线程安全问题。例如死锁问题,导致共享资源出现错乱,或者是,使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题。

第一种方式:同步代码块

第二种 方式:同步方法

第三种 方式:Lock锁机制, 通过创建Lock对象,采用lock()加锁,unlock()解锁,来保护指定的代码块。

由于synchronized是在JVM层面实现的,因此系统可以监控锁的释放与否;而ReentrantLock是使用代码实现的,系统无法自动释放锁,需要在代码中的finally子句中显式释放锁lock.unlock()。

另外,在并发量比较小的情况下,使用synchronized是个不错的选择;但是在并发量比较高的情况下,其性能下降会很严重,此时ReentrantLock是个不错的方案。

启动线程的方法,线程是什么,怎么开启

系统调用线程类的start()方法来启动一个线程,此时该线程处于就绪状态,而非运行状态,也就意味着这个线程可以被JVM来调度执行。在调度过程中,JVM通过调用线程类的run()方法来完成实际的操作,当run()方法结束后,此线程就会终止。

ThreadLocal实现原理讲一下

它是一种为共享变量在每一个线程中创建一个副本,每一个线程都是可以访问自己的副本的变量。通过绑定线程来实现对线程副本的操作。而不影响其他线程。目的就是为了解决在多线程下访问一个变量的下数据的一致性。

微保后端面试问题与解答20200430

微保后端面试问题与解答20200430

 

ConcurrentHashMap是怎么实现的

CAS +Node+链表

数据库左连接,右连接,内连接的区别

左外连接:是A表的所有行匹配上B表得出的结果集

右外连接:是B表的所有行匹配上A表得出的结果集

内连接:A和B表的交集

数据库索引是什么?

数据库索引其实就是为了使查询数据效率快。

Get和Post的区别(说到了一般设计的幂等性,问Post一定不是幂等的吗)

1.Get,它用于获取信息,它只是获取、查询数据,也就是说它不会修改服务器上的数据,从这点来讲,它是数据安全的,而稍后会提到的Post它是可以修改数据的,所以这也是两者差别之一了。

2.Post,它是可以向服务器发送修改请求,从而修改服务器的,比方说,我们要在论坛上回贴、在博客上评论,这就要用到Post了,当然它也是可以仅仅获取数据的。

微保后端面试问题与解答20200430

301和302的区别

301是永久重定向,302是临时重定向

大量数据找前100个(说了快速选择和堆排序)

分而治理,将大量的数据的分成多个小的文件,然后在统一的统计一遍就可以。

Linux用过吗,命令随便列举几个

解压
tar –xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2   //解压 tar.bz2
tar –xZvf file.tar.Z   //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip

使用两种命令创建一个文件?

Mkdir filename

如何查看Java应用的线程信息?

Ps–ef |grep java

Linux用一行命令查看文件的最后五行

tail -n 20 filename

查看进程的运行

ps aux | grep tomcat

查看端口是否运行

netstat -anop | grep 8080

查看日志(查看前3000行)

tail -n 1000/ head -n 1000:显示前面1000行

赋予某文件执行权限

chmod 775  文件名 /bin/*(表示下面所有)

赋予某文件执行权限

chmod +x   文件名

看所有网络接口及其状态

ifconfig -a

开放端口即可

iptables -A INPUT -p tcp --dport 80 -j ACCEP

命令作用为移动文件

mv

显示文件的路径

pwd -P

tar命令,用于压缩解压:

tar –xvf file.tar //解压 tar包、tar -xzvf file.tar.gz //解压tar.gz

tar -xjvf file.tar.bz2   //解压 tar.bz2、tar –xZvf file.tar.Z   //解压tar.Z

unrar e file.rar //解压rar、unzip file.zip //解压zip

rmdir 命令删除目录:

Sudo rmdir –p filename

gzip 命令压缩文件或文件夹为 .gz文件

 

kill 命令用于终止进程,参数:

 

free 命令用于显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer:

 

按ESC键 跳到命令模式,然后输入:

:w - 保存文件,不退出 vim

:w file  -将修改另外保存到 file 中,不退出 vim

:w! -强制保存,不退出 vim

:wq -保存文件,退出 vim

:wq! -强制保存文件,退出 vim

:q   -不保存文件,退出 vim

:q! -不保存文件,强制退出 vim

:e! -放弃所有修改,从上次保存文件开始再编辑

 

Redis是干嘛用的,项目中用来干嘛

Redis的一般用于两个做作用是:缓存系统,和分布式锁。

redis缓存系统的原理和分布式锁的原理实现具体是怎么样的?

反问:

我想问实现主要参与的业务是什么?

部门业务中的大致的流程是什么?

在业务的过程中主要使用到的那些技术栈?

我需要在那些技术加强?