开发者社区> 我巴巴> 正文

收集Java面试题知识点(Java基础部分二)

简介:
+关注继续查看

1、用最有效率的方法算出2乘以8等于几?

2 << 3
因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算CPU直接支持的,效率最高,所以,2乘以8等于几的最效率的方法是2 << 3。
但需要注意的是,如果这个数字本身已经很大,比如本身已经是2的30次方了,此时再用这种位移运算就可能导致“溢出”,这样就得不到正确结果了。

2、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuilder a=new StringBuilder (“immutable”);
执行如下语句将报告编译错误:
a = new StringBuilder (“”);
但如下语句则是完全正确的
a.append(“fkjava.org”);
有人希望在定义方法的形参时,通过final修饰符来阻止方法内部修改传进来的实参:
public void method(final StringBuilder param)
{
}
实际上这没有用,在该方法内部仍然可以增加如下代码来修改实参对象:
param.append(“fkjava.org”);

3、”==”和equals方法究竟有什么区别?

==操作符的功能有两个:
A.如果==的两边都是基本类型变量、包装类对象所组成的表达式,==用于比较两边的表达式的值是否相等——只要两边的表达式的值相等,即使数据类不同,该运算符也会返回true。
B.如果==的两边是引用类型的变量,==用于判断这两个引用类型的变量是否引用同一块内存,只有当它们引用同一块内存时,==才会返回true。
而equals()则是一个Java.lang.Object类的一个方法,因此任何Java对象都可调用该方法与其他对象进行比较。java.lang.Object类的equals方法的实现代码如下:
boolean equals(Object o)
{
return this==o;
}
从上面代码可以看出,如果一个类没有重写java.lang.Object的equals()方法时,此时equals()方法的比较结果与==的比较结果是相同的。
但Java允许任何类重写equals()方法,重写该方法就是让程序员来自己决定两个对象相等的标准。开发者重写equals()方法就可以根据业务要求来决定两个对象是否“相等”。

4、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,所以,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

5、请说出作用域public,private,protected,以及不写时的区别

这四个作用域的可见范围如下表所示。

作用域 当前类 同一package 子类 全局
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×

说明:如果在修饰的元素上面没有写任何访问修饰符,则表示default。
只要记住访问权限由小到大依次是private → default → protected → public,然后再记住Java存在的4个访问范围,就很容易画出上面的表格了。

6、外部类能用private、protected修饰吗?内部类可以用private、protected修饰吗?

外部类不能用private、protected修饰不能。内部类能用private、protected修饰不能。
外部类的上一级程序单位是包,因此它只有两个使用范围:包内和包外,因此它只能用public(表示可以在全局位置使用)和默认修饰符(default,表示只能被同一个包的其他类使用)修饰。

7、GC是什么? 为什么要有GC?   

GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的。
Java的System类和Runtime类都提供了“通知”程序进行垃圾回收的方法,例如如下代码:
Systme.gc();

Runtime.getInstance().gc();
但这两个方法只是“通知”Java进行垃圾回收,但实际上JVM何时进行垃圾回收,还是由JVM自己决定。

8、垃圾回收的优点和原理。并考虑2种回收机制。

传统的C/C++等编程语言,需要程序员负责回收已经分配的内存。显式进行垃圾回收是一件比较困难的事情,因为程序员并不总是知道内存应该何时被释放。如果一些分配出去的内存得不到及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这种现象被称为内存泄漏。总体而言,显式进行垃圾回收主要有如下两个缺点:
A.程序忘记及时回收无用内存,从而导致内存泄漏,降低系统性能。
B.程序错误地回收程序核心类库的内存,从而导致系统崩溃。
与C/C++程序不同,Java语言不需要程序员直接控制内存回收,Java程序的内存分配和回收都是由JRE在后台自动进行的。JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收(Garbage Collection,也被称为GC)。通常JRE会提供一条后台线程来进行检测和控制,一般都是在CPU空闲或内存不足时自动进行垃圾回收,而程序员无法精确控制垃圾回收的时间和顺序等。
实际上,垃圾回收机制不可能实时检测到每个Java对象的状态,当一个对象失去引用后,它也不会被立即回收,只有等接下来垃圾回收器运行时才会被回收。
对于一个垃圾回收器的设计算法来说,大致有如下可供选择的设计:
A.串行回收(Serial)和并行回收(Parallel):串行回收就是不管系统有多少个CPU,始终只用一个CPU来执行垃圾回收操作;而并行回收就是把整个回收工作拆分成多部分,每个部分由一个CPU负责,从而让多个CPU并行回收,并行回收的执行效率很高,但复杂度增加,另外也有其他一些副作用,比如内存碎片会增加。
B.并发执行(Concurrent)和应用程序停止(Stop-the-world):。Stop-the-world的垃圾回收方式在执行垃圾回收的同时会导致应用程序的暂停。并发执行的垃圾回收虽然不会导致应用程序的暂停,但由于并发执行垃圾回收需要解决和应用程序的执行冲突(应用程序可能会在垃圾回收的过称中修改对象),因此并发执行垃圾回收的系统开销比Stop-the-world更好,而且执行时也需要更多的堆内存。
C.压缩(Compacting)和不压缩(Non-compacting)和复制(Copying):为了减少内存碎片,支持压缩的垃圾回收器会把所有的活对象搬迁到一起,然后将之前占用的内存全部回收。不压缩式的垃圾回收器只是回收内存,这样回收回来的内存不可能是连续的,因此将会有较多的内存碎片。较之压缩式的垃圾回收,不压缩式的垃圾回收回收内存快了,而分配内存时就会更慢,而且无法解决内存碎片的问题。复制式的垃圾回收会将所有可达对象复制到另一块相同的内存中,这种方式的优点是垃圾及回收过程不会产生内存碎片,但缺点也很明显,需要拷贝数据和额外的内存。

9、什么时候用assert。

assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。
Java的assert是关键字。
public class TestAssert
{
public static void main(String[] args)
{
int a = 5;
//断言a>3
assert a > 3;
//断言a<3,否则显示a不小于3,且a的值为:” + a
assert a < 3 : “a不小于3,且a的值为:” + a;
}
}
从上面代码可以看出,assert的两个基本用法如下:
assert logicExp;
asert logicExp : expr;
A.第一个直接进行断言,
B.第二个也是进行断言,但当断言失败失败时显示特定信息。
最后要指出:
虽然assert是JDK1.4新增的关键字,但有一点非常重要:
java命令默认不启动断言,
为了启动用户断言,应该在运行java命令时增加-ea(Enable Assert)选项。
为了启动系统断言,应该在运行java命令时增加-esa(Enable System Assert)选项。

10、序列化接口的id有什么用?

反序列化Java对象时必须提供该对象的class文件,现在的问题是随着项目的升级,系统的class文件也会升级,Java如何保证两个class文件的兼容性?
Java序列化机制允许为序列化类提供一个private static final的serialVersionUID值,该Field值用于标识该Java类的序列化版本,也就是说如果一个类升级后,只要它的serialVersionUID Field值保持不变,序列化机制也会把它们当成同一个序列化版本。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
BTrace 入门教程
很久没发文了,不知道小伙伴们是不是忘记我们了?主要是最近我和znlover在利用业余时间开发一款小程序,一直没时间写文章,小程序目前在内测阶段,在接下来的时间,我们会持续更新文章。在此,给支持我们的读者说声谢谢,感谢你们一直在默默支持我们。
6 0
通过Hello World来探讨Java技术
如今讨论Java技术似乎无处不在,但它究竟是什么呢?它既是一种编程语言,也是一个平台
5 0
C语言基础知识(三)-程序设计结构、数组、字符串处理函数(上)
程序设计是什么 顺序结构 实例 1.首先生成一个随机的四位数整数。 2.拆分这个四位整数,获得其各位上的数字。 选择结构 最简单的if语句 if实例 语句块 if else语句 if else实例 多个if else语句 if else语句的嵌套 switch case语句 switch 语句的执行流程 循环结构 循环控制语句 while 循环 实例 do while 循环 实例 while语句和do-while语句的互换 while和do-while小结 for循环 实例 for循环语句的嵌套
5 0
JavaScript 各版本介绍和特性
JavaScript 1.1 Netscape Navigator 3.0在1996年8月19发布,是支持JavaScript的浏览器的第二个主要的版本。
6 0
Zuul技术分享
ZUUL是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用,Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能: 动态路由:动态将请求路由到不同后端集群 压力测试:逐渐增加指向集群的流量,以了解性能 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求 静态响应处理:边缘位置进行响应,避免转发到内部集群 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求。Spring Cloud对Zuul进行了整合和增强。 Spring Cloud对Zuul进行了整合和增强
4 0
Hystrix-开源容错系统(上)
开年第一篇文章来自于京东的小伙伴,希望这篇文章能够帮助大家对熔断和降级有所理解。
5 0
Hystrix-开源容错系统(下)
Hystrix-开源容错系统(下)
4 0
HTTP访问控制(CORS)
跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
4 0
一款实用的 GitHub Actions 小工具:Gitee Pages Actions
使用 GitHub Pages 时,每当项目有更新,GitHub 会自动帮我们重新部署 GitHub Pages。对于国内的 Gitee Pages,一般情况下无法自动部署,除非我们开通 Gitee Pages Pro 功能。而 Pro 功能的开通,需要满足以下其中一个条件
6 0
Emoji 表情符号那些坑
Emoji 表情符号那些坑
4 0
+关注
我巴巴
编程语言 架构 相关技术专家
86
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载