1:序列化: 将数据结构或对象转换成二进制串的过程
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
2:Eden区位于Java堆的年轻代,是新对象分配内存的地方,由于堆是所有线程共享的,因此在堆上分配内存需要加锁。而Sun JDK为提升效率,会为每个新建的线程在Eden上分配一块独立的空间由该线程独享,这块空间称为TLAB(Thread Local Allocation Buffer)。具体等认真学习后再写博客
3:堆:JDK8中把存放元数据中的永久内存从堆内存中移到了本地内存,这样永久内存就不再占用堆内存,它可以通过自动增长来避免JDK7以及前期版本中的永久内存错误(java.lang.OutOfMemoryError: PermGen)
堆内存是 JVM 所有线程共享的部分,在虚拟机启动的时候就已经创建。所有的对象和数组都在堆上进行分配。这部分空间可通过 GC进行回收。当申请不到空间时会抛出 OutOfMemoryError。
4:连通图:n个结点的连通图,至少有n-1条边!(给出两个关于连通图的详细解释以及试题)
http://blog.csdn.net/stillxjy/article/details/52049394
http://www.cnblogs.com/mfryf/archive/2012/08/23/2652102.html
5.封装问题:(优点)
1.可以彻底隐藏方法的内部实现,仅仅提供一个调用的方法给其他人,让其他使用这个类的人不需要关心是如何实现的,只要知道该如何调用就行。
2.隐藏方法的内部实现的好处,可以让保留调用方法不变的同时,随意修改类的结构,而不影响其他人运行结果。
3.封装还会分开类的属性,将类的属性分成私有属性和公共属性。私有属性仅供类自身调用,和公 共属性也仅提供一个供外部调用的方法。
4.按照软件的术语,良好的封装是能够减少耦合。
6:散列表:散列表 又叫哈希表(hash table)。通过访问key而直接访问存储的value值。它的key - value之间存在一个映射函数,我们可以通过key值和“看不到”的映射函数(散列函数)访问对应的value值。这加快了查找的速度!存放记录的数组称做散列表。散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术 (就是说,它是直接通过key映射[映射函数,实现的方式有多种]到内存地址上去的)。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)(面试的时候犯了这个错误)。!!!
7:装箱问题:装箱问题是NP问题,即在多项式时间内无法精确求解,一般采用近似算法,即启发式算法,这样可以迅速得到满意解,而不一定是最优解。
8:JDK8.0的GC问题
就垃圾回收机制来说,主要是三点.
1. JEP 173: Retire Some Rarely-Used GC Combinations
只要记住流行的组合就这几种情况
Serial
ParNew + CMS
ParallelYoung + ParallelOld
G1GC
2. G1 production ready
有功夫琢磨一下都可以用起来了。有疑惑report到[email protected],或 bug report至 [email protected]
3. JEP 122: Remove the Permanent Generation
省去维护perm gen的overhead,但并不是就一劳永逸了,metaspace要爆还是会爆的!
作者:Ted Mosby
链接:https://www.zhihu.com/question/30538696/answer/64108400
9.知道IP , 计算广播地址
10:二叉树的前中后遍历
11:单链表插入,时间复杂度等问题
12:CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。(以前没听说过,后续仔细看看补一下)
CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await()方法的任务将一直阻塞等待,直到这CountDownLatch对象的计数值减到0为止。
CountDownLatch类有3个基本元素:
初始值决定CountDownLatch类需要等待的事件的数量。
await() 方法, 被等待全部事件终结的线程调用。
countDown() 方法,事件在结束执行后调用。
13:Thread 线程的概述(Introduction)
线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在。 线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。
注意:Java中的多线程是一种抢占机制而不是分时机制。抢占机制指的是有多个线程处于可运行状态,但是只允许一个线程在运行,他们通过竞争的方式抢占CPU。
14:链表的特点:链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储数据元素 的数据域,另一个是存储下一个结点地址的 指针。如果要访问链表中一个元素,需要从第一个元素始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表。(http://blog.csdn.net/mormont/article/details/53439772)
15:java 根据路径读取文件:
16:字符串排序
17:设计数据库及分层架构思想!
分层描述的是这样一种架构设计过程:从最低级别的抽象开始,称为第1层。这是系统的基础。通过将第J层放置在第J-1层的上面逐步向上完成抽象阶梯,直到到达功能的最高级别,称为第N层。
因此分层模式就可以定义为:将解决方案的组件分隔到不同的层中。每一层中的组件应保持内聚性,并且应大致在同一抽象级别。每一层都应与它下面的各层保持松散耦合。分层模式的关键点在于确定依赖:即通过分层,可以限制子系统间的依赖关系,使系统以更松散的方式耦合,从而