1 什么是死锁
死锁是指多个进程(或者线程)在运行过程中,因为争夺资源而造成的一种僵局,如果没有外力推进,处于僵局中的进程就无法继续执行,最后会卡死。
2 线程和进程的区别
1.一个程序至少有一个进程,一个进程至少有一个线程
2.线程的划分尺度小于进程,使得多线程程序的并发性高
3.进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
4.每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
3 重写和重载的区别
一、定义上的区别:
重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。
覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。
二、规则上的不同:
1、重载的规则:
必须具有不同的参数列表。
可以有不同的访问修饰符。
可以抛出不同的异常。
2、重写方法的规则:
参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
访问修饰符的限制一定要大于被重写方法的访问修饰符。
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
4 数组和集合的区别
(1)数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)
(2)JAVA集合可以存储和操作数目不固定的一组数据。
(3)若程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。
5 抽象类和接口的区别
1.抽象类要被子类继承,接口要被类实现。
2.接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
3.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
4.接口是设计的结果,抽象类是重构的结果。
5.抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。
6.抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。
7.抽象类主要用来抽象类别,接口主要用来抽象功能。
6 hashmap和hashtable的区别
1、继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2、线程安全性不同
Hashtable是线程安全的,HashMap是线程不安全的。
3、是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。
Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
4、key和value是否允许null值
Hashtable中,key和value都不允许出现null值。
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
5、两个遍历方式的内部实现上不同
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
6、hash值不同
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
7、内部实现使用的数组初始化和扩容方式不同
HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
7.String StringBuilder StringBuffer的区别
String:
每次都会新建一个新的对象,并且对象是字符串常量不可变,速度最慢
StringBuilder
新建对象是可变的,速度最快 线程不安全--适合非并发时的大量字符串的操作
StringBuffer
新建对象是可变的,速度第二,线程安全--适合并发时大量字符串的操作
8 Thread和Runable的区别
1、Thread是类、Runable是接口
2、Thread不适合资源共享而Runable适合
3、实现Runable的适合多个相同的程序代码线程处理同一个资源
4、实现Runable可以避免java中单继承的限制
但是底层上线程的启动都是Thread类的start方法
9 设计模式
1.单例模式:获取的对象只有一个实例,实现多个对象共享。举例 Spring bean都是单例的
2.代理模式:静态代理和动态代理(jdk proxy 和 cglib代理) 原理主要是反射
jdk proxy 是通过实现接口的方式来实现的动态代理
Cglib是 通过继承类的方式来实现的动态代理
举例:Spring AOP 运用动态代理 是在运行期间代理
AspectJ 是静态代理 是编译时就进行代理
3.工厂模式:使用一个工厂类传入需要的参数来选择对应的接口的实现类。
例如 DataFactory 数据库工厂 输入mysql 只需要输入mysql和封装好的参数等即可创建对应的连接对象
4.模板方法模式:
例子:jdbcTemplate
10 基本数据类型和引用数据类型的区别
1、存储位置
基本数据类型声明时直接在内存栈区内开辟空间存放,而引用数据类型是将声明的变量放在内存堆区,将所在的地址放在内存的栈区。使用时是根据内存栈区存放的地址来在堆区中寻找。
2、传递方式
基本数据类型是值传递,而引用数据类型是引用传递,即只是在栈区开辟一个空间指向堆区存放的数据。