面试总结之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扩容
- new 一个新的链表数组,容量为原来的两倍
- 取的原链表数组,针对每一个链表中的每一项,求得他们在新数组中的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的区别
- StringBuffer 是线程安全的
- StringBuilder在单线程的情况下更快
- 面试总结之Java基础(未完工)
- Android API翻译之WebChromeClient(未完工)
- java面试基础总结
- Java面试基础总结
- 面试总结------Java基础
- JAVA基础面试总结
- 面试基础之java
- 面试之java基础
- java基础面试总结1
- 面试总结-Java基础篇
- Java面试基础概念总结
- java基础面试常见问题总结
- 面试总结-Java基础(一)
- 面试总结-Java基础(一)
- Java基础方面面试总结
- Java基础之面试整理
- java面试基础之三
- java面试基础之四
- pip2pi和pypiserver及Apache在pip本地源配置中的应用实践
- 如何使用RMI(Remote Method Invocation)
- OutOfMemoryError PermGen space
- 提高代码性能效率总结(二)--Java
- 仰视源码,实现memset
- 面试总结之Java基础(未完工)
- 如何删除Xcode中安装的插件
- Bootstrap组件之按钮组
- 久违的数据库左连接
- OC--block
- Android中客户端请求服务器端的方式讲解(一)附源码
- 黑马程序员——java中String、StringBuffer、StringBuilder简单见解
- 【天池竞赛系列】阿里移动推荐算法思路解析
- mac的shell神插件zsh