final和static关键字
final:是一个“终结器”,任何代码被final修饰,都不能更改。Final可以修饰类、字段、方法、方法形参、局部变量。被final修饰的类不能被继承;字段不能重新赋值;方法不能重写、方法形参不能二次赋值、局部变量不能二次修改。
Static:可以修饰变量、方法、代码块,static节省空间,没有必要对每一个对象都存储一份,static修饰的变量一旦被更改,其他属于该类的变量也会同步更改。
Synchronized和lock
1.lock是一个接口,而synchronized是个关键字,synchronized是内置的语言实现;
2.异常是否释放锁:synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。
3.是否响应中断:lock等待锁过程中可以用interrupt来中断等待,而synchronized只能等待锁的释放,不能响应中断;
4.是否知道获取锁:Lock可以通过trylock来知道有没有获取锁,而synchronized不能;
5.synchronized使用Object对象本身的wait 、notify、notifyAll调度机制,而Lock可以使用Condition的await、signal、signalAll来进行线程之间的调度。
6.用法:Synchronized:需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。
lock:一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
7.ReentrantLock可以实现公平锁,也可以实现非公平锁,多个线程在等待同一个锁时,必须按申请锁的顺序排队等待,但是非公平锁不保证这点,在锁释放的时候,任何一个等待锁的线程都可以去枪锁。而sychronized是非公平锁。Lock两者都可以,默认是非公平,可以设置RenntrantLock(true)变为公平锁。
堆和栈的区别
程序内存分区中:
1.栈是由操作系统自动分配释放的,无需我们手动控制,堆的申请和释放是由程序员控制的。
2.空间大小不同,栈比堆小很多。
3.栈是一块连续的内存区域,堆不连续,所以堆会造成大量碎片。
4.生长方向不同,栈的内存地址由高到低,堆的内存地址由低到高。
数据结构中:
- 栈是一种线性表,这个线性表只允许在表的顶端进行插入和删除操作,特点是先进后出。
- 堆是一种树形结构,是一种特殊的完全二叉树。父节点的值大于子节点的值称为大顶堆,反之叫小顶堆。
深拷贝和浅拷贝
深拷贝:既能拷贝基本数据类型的值,又能拷贝实例对象的引用地址所指向的对象
浅拷贝:只能拷贝基本数据类型和实例对象的引用地址,不能复制引用地址所指向的对象。
值传递和引用传递
值传递:基本数据类型的赋值属于值传递,值传递传递的是实实在在的值,是传递原参数的拷贝,值传递后,实参传递给形参的值,形参发生改变而不影响实参。
引用传递:引用类型之间赋值属于引用传递,引用传递传的是对象的引用地址,也就是它本身。也就是将实参的地址传递给形参,形参改变了,实参当然也改变,因为它们指向的是相同的地址。



