Java教程

java基础面试题5

本文主要是介绍java基础面试题5,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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中的代码执行完或没有执行完(这里指异常),该代码块之中的程序必定会进行;

 

这篇关于java基础面试题5的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!