1 java中的值传递和引用传递
一个方法不能修改一个基本数据类型的参数(数值型和布尔型)。
一个方法可以修改一个引用所指向的对象状态,但这仍然是按值调用而非引用调用。
上面两种传递都进行了值拷贝的过程
2 对象的序列化
对象序列化机制(object serialization)是Java语言内建的一种对象持久化方式,
通过对象序列化,可以把对象的状态保存为字节数组,
并且可以在有需要的时候将这个字节数组通过反序列化的方式再转换成对象。
对象序列化可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换
Transient 关键字:变量声明前加上该关键字,可以阻止该变量被序列化到文件中
,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,
对象型的是 null。
序列化ID: 虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,
一个非常重要的一点是两个类的序列化 ID 是否一致
(就是 private static final long serialVersionUID)
3 深拷贝和浅拷贝
分为基本类型和引用数据类型
浅拷贝:基本数据类型因为是值传递,所以不会影响原来的值,但是引用类型由于
只是拷贝了引用,拷贝前后的对象仍然指向的是同一个空间,所以改变现有的值会影响原来的值
深拷贝:基本数据类型同样不会受影响,引用类型同样也是拷贝了
引用地址和开辟了新空间,所以也不会有所影响
深浅拷贝的方法:实现cloneable接口并且重写clone方法。
浅拷贝只需要调用一次父类的clone方法,深拷贝需要拷贝自己后产生的新的对象,
然后对新的对象的引用类型再调用拷贝操作,
实现对引用类型成员变量的深拷贝。
4 数据库的隔离级别
假设有事物1和事物2同时在操作数据库:
脏读:事物2读取到事物1未提交的数据
丢失修改:事物2修改的数据,被事物1修改,造成事物2的修改丢失
不可重复读:事物2在读取数据时,期间数据被事物1修改,造成事物2再次读取数据时造成前后不一致的情况
幻读:事物2在读取数据的时候,期间事物1又增加了一些数据,造成事物2再次读取数据的时候出现了多余的数据,就像发生了幻觉一样
针对以上的事物操作出现的问题。我们需要设置数据库的隔离级别
读取未提交:事物2可以读取到事物1未提交的数据。最低的隔离级别,不可以阻止以上的各种问题。脏读,幻读,不可重复读等等
读取提交:事物2只能读取到事物1已经提交的数据 可以阻止脏读,不能阻止不可重复读和幻读
可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读,不可重复读,但会发生幻读
串行化: 最高的隔离级别
5 原子性和可重入
原子性的保证: 尽量使用局部变量解决问题,使用ThreadLocal类解决问题
锁的重入是指只要一个线程持有了某个锁,那么它就可以进入任何被这个锁保护的代码块
6 jc的过程
判断对象已死 : 可达性分析法:GC Roots(操作数栈上引用的对象,方法区常量,静态属性引用的对象,本地方法栈)
JVM采用分代收集的思想管理内存,所以JC在进行垃圾回收的时候也需要参考这个标识
会先判断老年代最大连续可用空间是否大于新生代的所有对象总空间,如果大于,则Minor GC是安全的,先进行Minor GC在新生代将对象 年 龄+1,
如果小于,那这时也要进行一次Full GC,让老年代腾出更多的空间
7 大文件的传输有什么方法
8 阻塞队列
ArrayBlockQueue(基于数组实现的阻塞队列)和LinkeBlockQueue(基于链表实现的阻塞队列)
ArrayBlockQueue: 读写操作数据是会上锁的,因此适合生产者消费者模式
LinkeBlockQueue:生产者写入数据是也会上锁putLock,消费者读取数据也会单独上锁takeLock,上锁的区间是分段的,提高了队列的并发性
当队列的缓存不够时,会阻塞生产者。同理,当队列中的数据为空时。会阻塞消费者
9 redis的使用
10 数据库的索引(什么情况下会不走索引)
11 hash的原理和数学的关系