[ 转载 ] Java基础

1.String a = “123”; String b = “123”; a==b的结果是什么? 这包含了内存,String存储方式等诸多知识点。
ans:
一样序列的字符串直接量为一个实例,因此其实引用变量a和b实际上是指向同一个实例,地址也就相同。引用变量比较的是地址,因此第一个打印出来为true。java

2.HashMap里的hashcode方法和equal方法何时须要重写?若是不重写会有什么后果?对此你们能够进一步了解HashMap(甚至ConcurrentHashMap)的底层实现。
ans:
HashMap是底层实现时数组加链表。
A.当put元素时:
1.首先根据put元素的key获取hashcode,而后根据hashcode算出数组的下标位置,若是下标位置没有元素,直接放入元素便可。
2.若是该下标位置有元素(即根据put元素的key算出的hashcode同样即重复了),则须要已有元素和put元素的key对象比较equals方法,若是equals不同,则说明能够放入进map中。这里因为hashcode同样,因此得出的数组下标位置相同。因此会在该数组位置建立一个链表,后put进入的元素到放链表头,原来的元素向后移动。
B.当get元素时:
根据元素的key获取hashcode,而后根据hashcode获取数组下标位置,若是只有一个元素则直接取出。若是该位置一个链表,则须要调用equals方法遍历链表中的全部元素与当前的元素比较,获得真正想要的对象。
能够看出若是根据hashcdoe算出的数组位置尽可能的均匀分布,则能够避免遍历链表的状况,以提升性能。
因此要求重写hashmap时,也要重写equals方法。以保证他们是相同的比较逻辑。数组

3.ArrayList和LinkedList底层实现有什么差异?它们各自适用于哪些场合?对此你们也能够了解下相关底层代码。
ans:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。数据结构

2.对于随机访问get和set,ArrayList优于LinkedList,由于ArrayList能够随机定位,而LinkedList要移动指针一步一步的移动到节点处。(参考数组与链表来思考)多线程

3.对于新增和删除操做add和remove,LinedList比较占优点,只须要对指针进行修改便可,而ArrayList要移动数据来填补被删除的对象的空间。在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。并发

4.对ArrayList和LinkedList而言,在列表末尾增长一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增长一项,指向所添加的元素,偶尔可能会致使对数组从新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。jvm

5.LinkedList不支持高效的随机元素访问。性能

6.ArrayList的空间浪费主要体如今在list列表的结尾预留必定的容量空间,而LinkedList的空间花费则体如今它的每个元素都须要消耗至关的空间。优化

能够这样说:当操做是在一列数据的后面添加数据而不是在前面或中间,而且须要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操做是在一列数据的前面或中间添加或删除数据,而且按照顺序访问其中的元素时,就应该使用LinkedList了。.net

4.volatile关键字有什么做用?由此展开,你们能够了解下线程内存和堆内存的差异。volatile关键字解析。
ans:
volatile线程

用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新的值。volatile很容易被误用,用来进行原子性操做。

若是要深刻了解volatile关键字的做用,就必须先来了解一下JVM在运行时候的内存分配过程。在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先经过对象的引用找到对应在堆内存的变量的值,而后把堆内存变量的具体值load到线程本地内存中,创建一个变量副本,以后线程就再也不和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完以后的某一个时刻(线程退出以前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。下面一幅图描述这写交互!


/**
* Created by wuyupku on 2019-04-08 11:15
*
* @Beijing CHINA
*/
class VolatileTest extends Thread {

boolean flag = false;
int i = 0;

public void run() {
while (!flag) {
i++;
}
}
}


public class VolatileDemo {
public static void main(String[] args) throws Exception {
VolatileTest vt = new VolatileTest();
vt.start();
Thread.sleep(2000);
vt.flag = true;
System.out.println("stope" + vt.i);
}
}

线程一直进行,未能正常退出程序.

首先建立 VolatileTest vt = new VolatileTest();
而后启动线程 vt.start();
暂停主线程2秒(Main) Thread.sleep(2000);
这时的vt线程已经开始执行,进行i++;
主线程暂停2秒结束之后将 vt.flag = true;
打印语句 System.out.println(“stope” + vt.i); 在此同时因为vt.flag被设置为true,因此vt线程在进行下一次while判断 while (!flag) 返回假 结束循环vt线程方法结束退出!
主线程结束
上面的叙述看似并无什么问题,“彷佛”彻底正确。那就让咱们把程序运行起来看看效果吧,执行mian方法。2秒钟之后控制台打印stope1182150156。

问题出现了,为何我在主线程(main)中设置了vt.flag = true; 而vt线程在进行判断flag的时候拿到的仍然是false?
那么按照咱们上面所讲的 “JVM在运行时候的内存分配过程” 就很好解释上面的问题了。

首先 vt线程在运行的时候会把 变量 flag 与 i (代码3,4行)从“主内存” 拷贝到 线程栈内存(上图的线程工做内存)

而后 vt线程开始执行while循环

7 while (!flag) {
8 i++;
9 }
1
2
3
while (!flag)进行判断的flag 是在线程工做内存当中获取,而不是从 “主内存”中获取。

i++; 将线程内存中的i++; 加完之后将结果写回至 “主内存”,如此重复。

而后再说说主线程的执行过程。

vt.flag = true;

主线程将vt.flag的值一样从主内存中拷贝到本身的线程工做内存 而后修改flag=true. 而后再将新值回到主内存。

这就解释了为何在主线程(main)中设置了vt.flag = true; 而vt线程在进行判断flag的时候拿到的仍然是false。那就是由于vt线程每次判断flag标记的时候是从它本身的“工做内存中”取值,而并不是从主内存中取值!

这也是JVM为了提供性能而作的优化。那咱们如何能让vt线程每次判断flag的时候都强制它去主内存中取值呢。这就是volatile关键字的做用。

/**
* Created by wuyupku on 2019-04-08 11:15
*
* @Beijing CHINA
*/
class VolatileTest extends Thread {

volatile boolean flag = false;
int i = 0;

public void run() {
while (!flag) {
i++;
}
}
}

public class VolatileDemo {
public static void main(String[] args) throws Exception {
VolatileTest vt = new VolatileTest();
vt.start();
Thread.sleep(2000);
vt.flag = true;
System.out.println("stope" + vt.i);
}
}

在flag前面加上volatile关键字,强制线程每次读取该值的时候都去“主内存”中取值。程序已经正常退出了。

5.CompletableFuture,这个是JDK1.8里的新特性,经过它怎么实现多线程并发控制?6.JVM里,new出来的对象是在哪一个区?再深刻一下,问下如何查看和优化JVM虚拟机内存。7.Java的静态代理和动态代理有什么差异?最好结合底层代码来讲。 ———————————————— 版权声明:本文为CSDN博主「葆宁」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/weixin_43258908/article/details/89077988

相关文章
相关标签/搜索