Java初学者常问的问题(推荐)

发布时间 - 2026-01-11 00:25:08    点击率:

本文介绍一些Java初学者常问的问题,可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区别吗? 声明一个数组为什么需要花费大量时间? 为什么Java库不用随机pivot方式的快速排序?

基本数据类型

Q. 为什么 -0/3 结果是 0,而 -0.0/3.0 结果是 -0.0?(注意后边的结果0带负号)

A. 在Java里,整数是用补码表示的。在补码中0只有一种表示方法。另一方面,浮点数则是用 IEEE 标准表示的, 对于0有两种表示方法, 0 和 -0。

Q. 我可以用 % 除以一个小数吗?

A. 当然可以。比如,如果 angle 是一个非负数,那么 angle % (2 * Math.PI) 就会把 angle 转换到 0 到 2 π 之间。

Q. 当 a b 都是基本类型变量时,a += b 和 a = a + b 的效果有区别吗?

A. 当 a 和 b 的类型不同时,那两条语句的效果就可能有区别。 a += b 等同于 a = (int) (a + b),这种情况下可以是 a是int型,b是float型。但是同等情况下 a = a + b 就会编译报错。 

条件语句和循环语句

Q. 为什么判断字符串相等不能使用 == ?

A. 这反映了基础类型(int, double, boolean)和引用类型(String)的区别。

Q. 有没有在什么情况下,一条语句块的花括号不能省略的?

A. 在下面的例子中,第一段代码是合法的,第二段代码会引发编译错误。从技术角度说,那一条语句是一个变量声明,而不是语句,所以会报错。

// legal 
for (int i = 0; i <= N; i++) { 
 int x = 5; 
} 
// illegal 
for (int i = 0; i <= N; i++) 
 int x = 5; 

Q. 在下面的两段代码里,有没有情况,它们的效果不一样?

for (<init stmnt> <boolean expr>; <incr stmnt>) { 
 <body statements> 
} 
<init stmnt>; 
while (<boolean expr>) { 
 <body statements> 
 <incr stmnt> 
} 

A. 有的。如果在循环块里使用 continue 语句。在for的代码里,计数器会加一;而在while的代码里,因为被continue略过了,计数器不加一。 

 数组

Q. 某些Java开发人员使用 int a[] 而不是 int[] a 去声明一个数组。这两者有什么区别?

A. 在Java中这两种用法都是合法的,他们的作用都是一样的。前者是在C中的定义数组的方法。后者是JAVA推荐的方法,因为它的写法 int[] 更能表明这是一个 int 的数组。

Q. 为什么数组下标从0 开始 而不是从 1 开始?

A. 这种传统起源于机器语言的编程方法。在机器语言中,数组下标被用来计算元素位置与第一个元素之间的偏移量。如果从1开始的话,计算偏移时还需要做一次减法运算,那是种浪费。

Q. 如果我用 负数 作为数组下标会发生什么事?

A. 下标小于0 或者 大于等于数组长度,JAVA运行时会抛出 ArrayIndexOutOfBoundsException 异常,并且中止程序运行。

Q. 使用数组时还有其他需要注意的陷阱吗?

A. 需要记住,JAVA在你创建一个数组时会去初始化它,所以声明一个数组需要 O(N)的时间。 

Q. 既然 a[] 是一个数组,为什么 System.out.println(a) 会打印出一个16进制的数,就像 @f62373 这样,而不是打印出数组的元素?

A. 好问题。这条语句打印出的是 数组在内存中的地址,系统会自动调用数组的toString()方法,这个问题你可以看下toString()方法的源码。

函数调用

Q. 当把数组当作函数调用时的参数时,我常常感到疑惑?

A. 是的。你需要牢记传值参数(参数是基本变量类型)和传引用参数(比如数组)之间的区别。

Q. 那为什么不把所有的参数都使用传值的方式,包括对待数组?

A. 但数组很大时,复制数组需要大量的性能开销。因为这个原因,绝大多数变成语言支持把数组传入函数但不复制一个副本——MATLAB语言除外。

递归调用

Q. 有没有只能用循环而不能用递归的情况?

A. 不可能,所有的循环都可以用递归替代,虽然大多数情况下,递归需要额外的内存。

Q. 有没有只能用递归而不能用循环的情况?

A. 不可能,所有的递归调用都可以用循环来表示。比如你可以用while的方式来实现栈。

Q. 那我应该选择哪个,递归的方式 还是 循环的方式?

A. 根据代码的可读性和效率性之间做权衡。

Q. 我担心使用递归代码时的空间开销和重复计算(例如用递归解Fibonacci)的问题。有没有其他需要担心的?
A. 在递归代码中创建大数据类型(比如数组)时需要额外注意,随着递归的推进,内存使用将会迅速增加,由于内存使用增加,操作系统管理内存的时间开销也会增加。

排序与查找

Q. 为什么我们要花大篇幅来证明一个程序是正确的?

A. 为了防止错误的结果。二分查找就是一个例子。现在,你懂得了二分查找的原理,你就能把递归形式的二分查找改写成循环形式的二分查找。Knuth 教授在 1946年就发表了二分查找的论文,但是第一个正确的二分查找的程序在 1962年在出现。

Q. 在JAVA内建库中有没有排序和查找的函数?

A. 有的。在 java.util.Arrays 中包含了 Arrays.sort() 和 Arrays.binarySearch() 方法。对于Comparable 类型它使用了 归并排序,对于基本数据类型,它使用了快速排序。因为基本类型是值传递,快速排序比归并排序更快而且不需要额外的空间。

Q. 为什么JAVA库不用 随机pivot方式的快速排序?

A. 好问题。 因为某些程序员在调试代码时,可能需要确定性的代码实现。使用随机pivot违背了这个原则。

栈和队列

Q. 在Java库中有对stacks 和 queues 的实现吗?

A. Java库中内建 java.util.Stack,但是你应该避免使用它如果你需要一个真正的栈的话。因为它是实现了额外的功能,比如访问第N个元素。另外,它也支持从栈底部插入元素,所以它看上去更像是一个队列。尽管实现了这些额外的功能对编程人员是一个加分,可是我们使用数据结构并不只是想使用所有功能,而是需要我们正好需要的那种结构。JAVA对于栈的实现就是一个典型的宽接口的例子。

Q. 我想使用数组来表示一个包含泛型的栈,但是以下代码编译报错。为什么?

private Item[] a = new Item[max]; 
oldfirst = first; 

A. 不错的尝试。不幸的是,创建一个泛型数组在 Java 1.5里不支持。你可以使用cast,比如下面的写法:

private Item[] a = (Item[]) new Object[max]; 
oldfirst = first; 

根本的原因是JAVA中的数组是“协变的(covariant)”,但是泛型并不是。比如, String[] 是 Object[]的一种子类型,但是 Stack<String>并不是 Stack<Object> 的一种子类型。 许多程序员认为“协变的”数组是JAVA在数据类型方面的一个缺点。但是,如果我们不考虑泛型,“协变的”数组是有用的,比如实现 Arrays.sort(Comparable[]) 方法,然后当参数是 String[]时它也可以被正常调用。

Q. 可不可以在数组上使用 foreach 方式?

A. 可以的(虽然 数组并没有实现 Iterator 接口)。请参考下面的代码:

public static void main(String[] args) { 
  for (String s : args) 
  StdOut.println(s); 
} 

Q. 在 linked list 上使用 iterator 是不是比循环或者递归更有效率?

A. 编译器在翻译时,可能把那种“尾递归”形式翻译成等价的循环形式。所以可能并没有可以被观测到的性能提升。
尾部递归是一种编程技巧。如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾递归是极其重要的,不用尾递归,函数的堆栈耗用难以估量,需要保存很多中间函数的堆栈。比如f(n, sum) = f(n-1) + value(n) + sum; 会保存n个函数调用堆栈,而使用尾递归f(n, sum) = f(n-1, sum+value(n)); 这样则只保留后一个函数堆栈即可,之前的可优化删去。

Q. 自动装箱机制会怎么处理下面的情况?

Integer a = null; 
int b = a;

A.它将返回一个运行时错误。基础类型不允许它对应的装箱类型里的值是null。 

Q. 为什么第一组打印的是 true,但是后面两组打印的是 false?

Integer a1 = 100; 
Integer a2 = 100; 
System.out.println(a1 == a2);  // true 
Integer b1 = new Integer(100); 
Integer b2 = new Integer(100); 
System.out.println(b1 == b2);  // false 
Integer c1 = 150; 
Integer c2 = 150; 
System.out.println(c1 == c2);  // false

A. 第二组代码打印 false 是因为 b1 和 b2 指向不同的 Integer 对象引用。第一组和第三组依赖于自动装箱机制。 令人意外的第一组打印了 true 是因为在 -128 和 127 之间的值会自动转换成同样的immutable型的Integer 对象。对于超出那个范围的数,Java会对于每一个数创建一个新的Integer对象。

以上所述是小编给大家介绍的Java初学者常问的问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java  # 常见问题  # Java语言的11大特点(Java初学者必知)  # 初学者学习Python好还是Java好  # Java泛型初学者之上、下界通配符的深入理解  # Java初学者了解"=="与equals的区别  # 一个牛人给Java初学者的建议(必看篇)  # Java初学者问题图解(动力节点Java学院整理)  # 适用于Java初学者的学习路线图  # java初学者必须理解这几个问题  # java初学者如何让编程学习起来更简单  # 递归  # 是一个  # 的是  # 可以用  # 而不  # 都是  # 报错  # 情况下  # 创建一个  # 是因为  # 不可能  # 你可以  # 第一个  # 库中  # 而不是  # 第一组  # 用了  # 能把  # 它也  # 内建 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel用户密码怎么加密_Laravel Hash门面使用教程  微信推文制作网站有哪些,怎么做微信推文,急?  javascript中闭包概念与用法深入理解  Laravel如何使用Gate和Policy进行授权?(权限控制)  网页设计与网站制作内容,怎样注册网站?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何用景安虚拟主机手机版绑定域名建站?  Firefox Developer Edition开发者版本入口  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  香港服务器建站指南:免备案优势与SEO优化技巧全解析  原生JS获取元素集合的子元素宽度实例  如何快速生成高效建站系统源代码?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  零服务器AI建站解决方案:快速部署与云端平台低成本实践  魔方云NAT建站如何实现端口转发?  海南网站制作公司有哪些,海口网是哪家的?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  ,南京靠谱的征婚网站?  如何在Windows环境下新建FTP站点并设置权限?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  如何快速生成可下载的建站源码工具?  长沙企业网站制作哪家好,长沙水业集团官方网站?  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  如何快速搭建高效香港服务器网站?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Thinkphp 中 distinct 的用法解析  开心动漫网站制作软件下载,十分开心动画为何停播?  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel如何使用Blade组件和插槽?(Component代码示例)  香港服务器如何优化才能显著提升网站加载速度?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel怎么上传文件_Laravel图片上传及存储配置  Laravel集合Collection怎么用_Laravel集合常用函数详解  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel如何实现用户注册和登录?(Auth脚手架指南)  怎么用AI帮你设计一套个性化的手机App图标?  微信公众帐号开发教程之图文消息全攻略  JS弹性运动实现方法分析  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?