1.接口有什么特点?
接口中声明的全是public static final修饰的常量
接口中所有的方法都是抽象方法
接口是没有构造方法的
接口也不能直接实例化
接口可以多继承
2.抽象类和接口的区别?
抽象类:
1.抽象方法,只有行为的概念,没有具体的行为实现。使用abstract关键字修饰,没方法体。子类必须重写这些抽象方法。
2.包含抽象方法的类,一定是抽象类。
3.抽象类只能被继承,一个类只能继承一个抽象类。
接口:
1.全部方法都是抽象方法,属性都是常量
2.不类实例化,可以定义变量
3.接口变量可以引用具体实现类的实例
4.接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法。
5.接口之间可以多实现
6.一个具体类可以实现多个接口,实现多继承现象
3.HashCode的作用
java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样的方法就会比较满。
于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行
任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
4.java的四种引用类型,强弱软虚
强引用
强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式:String str=new String("str");
软引用
软引用在程序内存不足时,会被回收,使用方式:
SoftReference<String> wrf=new SoftReference<String>(new String("str"));//注意wrf是强引用,new String("str")才是软引用
可用场景: 创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM就会回收早先创建的对象。
弱引用
弱引用就是只要JVM垃圾回收器发现了它,就会将之回收,使用方式:
可用场景:Java源码中的java.util.WeakHashMap中的key就是使用弱引用,我的理解就是,一旦我不需要某个引用,JVM会自动帮我处理它,这样我就不需要做其它操作。
虚引用
虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入ReferenceQueue中。注意哦,其它引用是被JVM回收后才被传入ReferenceQueue中的。
由于这个机制,所以虚引用大多被用于引用销毁前的处理工作。还有就是,虚引用创建的时候,必须带有ReferenceQueue,使用
可用场景: 对象销毁前的一些操作,比如说资源释放等。** Object.finalize() 虽然也可以做这类动作,但是这个方式即不安全又低效
上诉所说的几类引用,都是指对象本身的引用,而不是指 Reference 的四个子类的引用( SoftReference 等)。
PhantomReference<String>prf=newPhantomReference<String>(new String("str"),newReferenceQueue<>());
5、Java创建对象有几种方式?
java中提供了以下四种创建对象的方式:
1. new创建新对象
2. 通过反射机制
3. 采用clone机制
4. 通过序列化机制
6.有没有可能两个不相等的对象有相同的hashcode
有可能.在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值.当hash冲突产生时,一般有以
1. 拉链法:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表进行存储.
2. 开放定址法:一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入
3. 再哈希:又叫双哈希法,有多个不同的Hash函数.当发生冲突时,使用第二个,第三个….等哈希函数计算地址,直到无冲突.
7、深拷贝和浅拷贝的区别是什么?
浅拷贝:
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.
深拷贝:
被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的对象都复制了一遍.
8、static都有哪些用法?
所有的人都知道static关键字这两个基本的用法:静态变量和静态方法.也就是被static所修饰的变量/方法都属于类的静态资源,类实例所共享.
除了静态变量和静态方法之外,static也用于静态块,多用于初始化操作:
public static PreCache{
static{
//执行相关操作
}
}
此外static也多用于修饰内部类,此时称之为静态内部类.
最后一种用法就是静态导包,即 import static .import static是在JDK 1.5之后引入的新特性,可以用来指定导入某个类中的静态资源,并且不需要使用类名,可以直接使用资源名,比如:
import static java.lang.Math.*;
public class Test{
public static void main(String[] args){
//System.out.println(Math.sin(20));传统做法
System.out.println(sin(20));
}
}
9、a=a+b与a+=b有什么区别吗?
+= 操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型, 而a=a+b则不会自动进行类型转换.
如:
byte a=127;
byte b=127;
b=a+b;//编译报错,没有隐式转换,结果类型不匹配
b+=a;
short s1=1;
s1=s1+1;
有错误.short类型在进行运算时会自动提升为int类型,也就是说 s1+1 的运算结果是int类型,而s1是short
类型,此时编译器会报错.
正确写法:
short s1=1;
s1+=1;
+=操作符会对右边的表达式结果强转匹配左边的数据类型,所以没错.
10、final、finalize()、finally的区别?
性质
1.final为关键字;
2.finlize()为方法;
3.finally为表区块标志,用于try语句中;
作用
1.final为用于标识常量的关键字,final表示的关键字存储在常量池中。
2.finalize()方法在Object中进行了定义,用于在对象“消失”时,由JVM进行调用用于对象进行垃圾回收,类似于C++中的析构函数;用户自定义时,用于释放对象占用的资源(比如进行i/o操作);
3.finally{}用于标识代码块,与try{}进行配合,不论try中的代码执行完或没有执行完(这里指异常),该代码块之中的程序必定会进行;