1)JAVA语言是一种强语言
2)JAVA不允许使用指针访问内存,不允许使用指针数组访问内存
3)有自动收集垃圾的作用
4)方法调用时,会创建栈帧在栈中,调用完是程序自动出栈释放,而不是gc释放
5)关键字:true、false、null都不是关键字
6)静态类不能直接访问外部参数,非静态可以
7)标识符是以字母、下划线(…)或美元符($)开头,由字母、数字、下划线(一)或美元符($)组成的字符串。
8)构造方法的优先级一般比代码块低
9)抽象类和接口中都可以包含静态成员常量。
10)int 和 Integer 的区别
2. 序列化、反序列化
1)序列化:把对象转换为字节序列的过程,通常应用于存储或网络传输
2)反序列化:把字节序列恢复为对象的过程
JAVA使用ObjectOutputStream作为对象输出流,ObjectInputStream是对象输入流。
只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口。
对象序列化包括如下步骤:
1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流; 2) 通过对象输出流的writeObject()方法写对象。不适用于静态变量。
只要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。该方法不能修饰方法和类。
对象反序列化的步骤如下: 1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流; 2) 通过对象输入流的readObject()方法读取对象。3. 重构的概念
对软件内部结构的一种调整,在不改变软件的可观察性前提下,提高可理解性,降低修改成本。
4. 进程和线程之间的区别
1)调度:进程:资源的基本单位。线程:CPU调度和分派的单位。同一进程中,切换线程不会引起进程的切换。
2)并发:都可以并发执行。
3)资源:进程:拥有独立单位。线程:访问所属的进程的资源。
4)独立性:进程:独立地址单位和资源。线程:线程间共享。
5)系统开销:进程:涉及CPU环境等设置。线程:仅涉及寄存器的设置、保存,不涉及存储。
6)多处理机:一个进程的多个线程可以分到多个处理机中,加快并行执行。
5. Cookie 于Session区别
存储位置不同,Cookie不安全,不能保存大数据(超过4K),但能减轻服务器压力.
6. FOR和WHILE区别
FOR指令少,简洁
7. Instanceof
指出对象是否是指定类或接口的一个实例,有3种情况会返回true
1)对象是该类的实例
2)对象是该类子类的实例(有继承关系)
3)对象是继承该类的接口类的实例
8.异常
Throwable
| -- Exception
| -- RuntimeException ->空指针,越界等
| -- IO/EOP/FileNotFount/SQL...->必须try catch
| -- Error :内存/栈爆了(程序不能处理的异常)
9. Finally
1、不管是否出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行; 3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的; 4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
10. java中hashmap的实现原理,
HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。
简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
数组长度:roundUpToPowerOf2中的这段处理使得数组长度一定为2的次幂
以上hash函数计算出的值,通过indexFor进一步处理来获取实际的存储位置 key(hashcode)-->hash-->indexFor-->
通过以上代码能够得知,当发生哈希冲突并且size大于阈值的时候,需要进行数组扩容,扩容时,需要新建一个长度为之前数组2倍的新的数组,然后将当前的Entry数组中的元素全部传输过去,扩容后的新数组长度为之前的2倍,所以扩容相对来说是个耗资源的操作。
11. 考察了jvm的自动装箱和拆箱
装箱就是自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。
public static Integer valueOf(int i) { if (i >= -128 && i <= 127) return IntegerCache.cache[i + 127]; //如果i的值大于-128小于127则返回一个缓冲区中的一个Integer对象 return new Integer(i); //否则返回 new 一个Integer 对象 }
12, ASCII