面试总结之Java基础(未完工)

来源:互联网 发布:虚拟桌面软件 编辑:程序博客网 时间:2024/04/29 04:54

1. JVM相关

1.1. 内存模型

图片来源 : 深入理解Java内存模型(一)——基础
这里写图片描述

jvm体系结构
这里写图片描述

运行时数据区:
这里写图片描述

1.2. 类加载机制和JVM体系结构

1.3. 垃圾回收机制

Java 内存模型及GC原理
JDK5.0中JVM堆模型、GC垃圾收集详细解析

分代堆模型

这里写图片描述

1) 在Young Generation(年轻代)中,有一个叫Eden Space的空间,主要是用来存放新生的对象,还有两个Survivor Spaces(from、to),它们的大小总是一样,它们用来存放每次垃圾回收后存活下来的对象。

2) 在Old Generation(老年代)中,主要存放应用程序中生命周期长的内存对象。

3)持久代:装载Class信息等基础数据,默认64M,如果是类很多很多的服务程序,需要加大其设置-XX:MaxPermSize=,否则它满了之后会引起fullgc()或Out of Memory

4) 在Young Generation块中,垃圾回收一般用Copying的算法,速度快。每次GC的时候,存活下来的对象首先由Eden拷贝到某个SurvivorSpace,当Survivor Space空间满了后,剩下的live对象就被直接拷贝到OldGeneration中去。因此,每次GC后,Eden内存块会被清空。

5) 在Old Generation块中,垃圾回收一般用mark-compact的算法,速度慢些,但减少内存要求。

6) 垃圾回收分多级,0级为全部(Full)的垃圾回收,会回收OLD段中的垃圾;1级或以上为部分垃圾回收,只会回收Young中的垃圾,内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。

2. 散列表

2.1. HashMap原理

2.2. HashMap扩容

  1. new 一个新的链表数组,容量为原来的两倍
  2. 取的原链表数组,针对每一个链表中的每一项,求得他们在新数组中的index

2.3. HashMap与Hashtable的区别

2.4. ConcurrentHashMap原理

HashMap
hashcode()方法 及 HashMap再分析和HashMap扩容

3. String

理解String 及 String.intern() 在实际中的应用–非常好一篇文章

解决的问题:
1. 为什么new String(“a”)不存在与常量池中?—至于编译期的数据才会放入常量池中,而new String() ,则是需要在运行期加载类,放入堆中的!但是首先会创建“a”在常量池中
2. s.itern() : 它会在常量池中查找equals(s)的字符串,并将它们的引用返回,如果不存在,则将该字符串添加到池中
所以,它的返回:“一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池”

String s3=new String(“foo”);创建了几个对象? ==> 2

Java String对象的经典问题(new String())
String s3=new String(“foo”); “foo” literal will be created in StringPool first then through string arg constructor String Object will be created i.e “foo” in the heap due to object creation through new operator then s3 will refer it.

the newly created string is a copy of the argument string.

3.1. String的不变性

String类不可变性的好处

 private final char value[];

正是这个final关键字的存在,使得一旦创建了字符串对象,那么value指向的字符数组引用就不能再改变了!注意是引用(不能够对final变量再次赋值),数组里面的值还是可以改变的,这也是String replace() !

3.2. StringBuffer原理

//字符串缓冲区char[] value;
// 添加到末尾 public AbstractStringBuilder append(String str) {        if (str == null) str = "null";        int len = str.length();        ensureCapacityInternal(count + len);        // 拷贝str到StringBuffer的字符数组value(缓冲区)        str.getChars(0, len, value, count);        count += len;        return this;    }

3.3. StringBuffer与StringBuilder的区别

  1. StringBuffer 是线程安全的
  2. StringBuilder在单线程的情况下更快
0 0
原创粉丝点击