一、Java && JDK
1.ArrayList和LinkedList区别
- Arraylist是基于数组内存连续,随机访问查询快,扩容机制:新建数组,拷贝旧数组,性能较慢,不是尾部插入的话后面需要复制
- Linkedlist是基于双向链表内存分散,增删快,访问查询必须使用Iterator,需要遍历较慢,内部维护Node类,需要大量创建对象,性能慢
2.static和final的区别
关键词 |
修饰物 |
影响 |
final |
变量 |
分配到常量池中,程序不可改变其值 |
final |
方法 |
子类中将不能被重写 |
final |
类 |
不能被继承 |
static |
变量 |
分配在内存堆上,引用都会指向这一个地址而不会重新分配内存 |
static |
方法块 |
虚拟机优先加载 |
static |
类 |
可以直接通过类来调用而不需要new |
3.lamda表达式
函数式接口:接口中只有一个抽象方法
匿名内部类可以用lamda表达式简写,都是在重写方法
interface A{
void run(int a);
}
A a = i -> {System.out.println(i);};
//等价于
A a = new A() {
@Override
public void run(int a) {}
};
4.如何判断对象可以被回收?
- 引用计数法
在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就+1,当引用失效的时
候,计数器的值就-1,当引用计数器被减为零的时候,标志着这个对象已经没有引用了,可以回收了!
有对象相互引用的时候不能被检测到->内存泄漏
- 可达性分析法
通过一系
列的称为 GC Roots 的对象作为起点, 然后向下搜索; 搜索所走过的路径称为引用链/Reference Chain, 当
一个对象到 GC Roots 没有任何引用链相连时, 即该对象不可达, 也就说明此对象是不可用的,但它们到GC Roots是不可达的, 因此也会被判定为可回收的对象。
- 垃圾回收算法:标记(碎片太多),拷贝(费内存),标记压缩(耗时长)
5.Java中的集合 HashMap HashSet TreeMap TreeSet
Hash:无序,Tree:有序需提供比较器
Map:键值对有伴随数据,Set:只有键无伴随数据
HashMap和HashTable区别:HashTable是线程安全的
就是HashMap把所有方法加上synchronized
ConcurrentHashMap和HashMap区别:
Con 提供了分段锁,segments划分为多个HashTable,只有发生Hash冲突
才会线程阻塞,效率又高又安全,两次hash,第一次不加锁
6.http和https区别
Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披
SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的
HTTP。二者之间存在如下不同:
端口不同:Http与Http使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
开销:Https通信需要证书,而证书一般需要向认证机构购买;
Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
7.哈希表
- 哈希表内部数组长度一般为质数,便于均匀散列
- 哈希函数一般为取模运算 key%数组长度,通过关键字计算数组下标 i=f(key) arr[i]=value
- 哈希冲突:
不同的key通过哈希函数计算得到相同的下标值
- 解决办法:
1.链表式解决:当相同的key在一个下表存储的时候,进化成链表结构
(例如,数组长度7,key=22和key=15计算都应存到下表i=1的位置,这时候在1位置 22->15 用链表存储)
2.开放地址-线性探测:新位置=模运算位置+i,一直往后探测
3.开放地址-平方探测:新位置=模运算位置+i^2
4.开放地址-双哈希:新位置=模运算位置+i*hash2(key)
- 哈希表满了:存储了超过70%,再建一个新表,旧的数据按照哈希函数计算搬家
- 优缺点:优点效率高,O(1)。缺点:hash函数设计不好和表太满会影响效率
8.内存泄露和内存溢出
内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
内存溢出:内存不够用
二者关系:
内存泄漏的堆积最终会导致内存溢出
- 内存溢出原因:
内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
代码中存在死循环或循环产生过多重复的对象实体;
使用的第三方软件中的BUG;
启动参数内存值设定的过小
- 内存溢出的解决方案:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
第四步,使用内存查看工具动态查看内存使用情况
- 内存泄漏问题该如何解决
分析器、详细日志、引用对象、泄漏警告、基准测试、代码审查
9.消息队列比对
Kafka |
ActiveMQ |
RabbitMQ |
RocketMQ |
高性能高吞吐,单机容量有限百万 |
JMS规范,事务,数据量小单机万 |
erlang开发开源,学习成本高单机万 |
java实现高可用单机十万 |
10.类加载器
<