ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java基础面试题5

2022-07-01 01:01:20  阅读:204  来源: 互联网

标签:面试题 java 对象 基础 接口 static 引用 哈希 方法


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,对象,基础,接口,static,引用,哈希,方法
来源: https://www.cnblogs.com/15078480385zyc/p/16433163.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有