CS-Notes/interview/answer.md
xiongraorao f2968f6376 8.15
2018-08-15 19:58:57 +08:00

5.5 KiB
Raw Blame History

java基础

java 语言基础

java自动拆装箱

自动装箱是将一个java定义的基本数据类型赋值给相应封装类的变量。 拆箱与装箱是相反的操作,自动拆箱则是将一个封装类的变量赋值给相应基本数据类型的变量。

java 四种引用及其应用场景

1、强引用 最普遍的一种引用方式如String s = "abc"变量s就是字符串“abc”的强引用只要强引用存在则垃圾回收器就不会回收这个对象。

2、软引用SoftReference 用于描述还有用但非必须的对象如果内存足够不回收如果内存不足则回收。一般用于实现内存敏感的高速缓存软引用可以和引用队列ReferenceQueue联合使用如果软引用的对象被垃圾回收JVM就会把这个软引用加入到与之关联的引用队列中。

3、弱引用WeakReference 弱引用和软引用大致相同,弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

4、虚引用PhantomReference 就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 虚引用主要用来跟踪对象被垃圾回收器回收的活动。

虚引用与软引用和弱引用的一个区别在于: 虚引用必须和引用队列 ReferenceQueue联合使用。当垃圾回收器准备回收一个对象时如果发现它还有虚引就会在回收对象的内存之前把这个虚引用加入到与之关联的引用队列中。

foreach与正常for循环效率对比

用for循环arrayList 10万次花费时间5毫秒。 用foreach循环arrayList 10万次花费时间7毫秒。 用for循环linkList 10万次花费时间4481毫秒。 用foreach循环linkList 10万次花费时间5毫秒。 循环ArrayList时普通for循环比foreach循环花费的时间要少一点。 循环LinkList时普通for循环比foreach循环花费的时间要多很多。 当我将循环次数提升到一百万次的时候循环ArrayList普通for循环还是比foreach要快一点但是普通for循环在循环LinkList时程序直接卡死。 ArrayListArrayList是采用数组的形式保存对象的这种方式将对象放在连续的内存块中所以插入和删除时比较麻烦查询比较方便。 LinkListLinkList是将对象放在独立的空间中而且每个空间中还保存下一个空间的索引也就是数据结构中的链表结构插入和删除比较方便但是查找很麻烦要从第一个开始遍历。

结论: 需要循环数组结构的数据时建议使用普通for循环因为for循环采用下标访问对于数组结构的数据来说采用下标访问比较好。 需要循环链表结构的数据时一定不要使用普通for循环这种做法很糟糕数据量大的时候有可能会导致系统崩溃。

链表使用foreach 数组使用for循环

java反射的作用于原理

Java 反射是可以让我们在运行时通过一个类的Class对象来获取它获取类的方法、属性、父类、接口等类的内部信息的机制。

这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。

数据库

truncate与 delete区别

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。 DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。 TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 TRUNCATE,DELETE,DROP 放在一起比较: TRUNCATE TABLE :删除内容、释放空间但不删除定义。 DELETE TABLE: 删除内容不删除定义,不释放空间。 DROP TABLE :删除内容和定义,释放空间

B+树索引和哈希索引的区别

B+树是一个平衡的多叉树从根节点到每个叶子节点的高度差值不超过1而且同层级的节点间有指针相互链接是有序的

哈希索引就是采用一定的哈希算法把键值换算成新的哈希值检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可,是无序的

优势对比: