初学者在java学习中常见的30个问题

【Java实战】编程中常见问题及解决方案:开发者必读指南 Java生态博大精深,遇到的问题也千变万化。掌握这些常见问题的解决方案,不仅能提高开发效率,还能培养出良好的编程思维。记住,优秀的Java开发者不是不犯错,而是能快速定位和解决问题。你在Java开发中还遇到过哪些"坑"?欢迎在评论区分享你的经验!如果你觉得这篇文章有帮助,请分享给更多的开发者。 阅读详情

本文回答了30个JAVA入门级初学者的常见问题。如我可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区别吗? 声明一个数组为什么需要花费大量时间? 为什么Java库不用随机pivot方式的快速排序?

1.2 基本数据类型

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 就会编译报错。

1.3 条件语句和循环语句

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

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

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

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

1
2
3
4
5
6
7
// legal
for  ( int  i =  0 ; i <= N; i++) {
int  x =  5 ;
}
// illegal
for  ( int  i =  0 ; i <= N; i++)
int  x =  5 ;

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

1
2
3
4
5
for  (; ) {
}
;
while  () {
}

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

1.4 数组

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. 好问题。这条语句打印出的是 数组在内存中的地址,不幸的是,在绝大多数情况下,这不是你需要的。

1.5 输入输出语句

Q. 我可以从标准input中重新读一次数据吗?

A. 不可以,你只能读一次。

Q. 怎样输入 end-of-file (eof) 符号?

A. 操作系统自动包括它了。

Q. 使用 printf() 时还有哪些用法?

A. 对于整数来说,使用 o 输出八进制,使用 x 输出十六进制。对于浮点数来说,使用 e 或者 g 输出科学计数法形式。

Q. 行结束的符号是什么?

A. 不同的文件系统使用了不同的符号。在 Unix 系统上,新行的符号是 ‘ ‘ ;在 Windows 系统上,每一行都有两个字符组成的字符串终结 ” ” ;在 Macs 系统上,终结符号是 ” ” 。如果要打印行号,可以使用 System.out.println() ,或者使用下面的语句得到当前操作系统下的行结束符:

1 String NEWLINE = System.getProperty("line.separator");

Q. 下面两种写法,哪一种更有效率?

1
2
3
4
5
String s;
while  (!StdIn.isEmpty()) {  while  (!StdIn.isEmpty()) {
s = StdIn.readString(); String s = StdIn.readString();
... ...
} }

A. 从效率角度说,两者没有区别。 但是第二种写法更好,因为它限制了变量的作用域。

2.1 函数调用

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

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

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

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

2.3 递归调用

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

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

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

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

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

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

Q. 我担心使用递归代码时的空间开销和重复计算(例如用递归解Fibonacci)的问题。有没有其他需要担心的?

A. 在递归代码中创建大数据类型(比如数组)时需要额外注意,随着递归的推进,内存使用将会迅速增加,由于内存使用增加,操作系统管理内存的时间开销也会增加。

4.2 排序与查找

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

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

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

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

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

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

4.3 栈和队列

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

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

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

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

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

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

根本的原因是JAVA中的数组是“协变的(covariant)”,但是泛型并不是。比如, String[] 是 Object[]的一种子类型,但是 Stack并不是 Stack的一种子类型。

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

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

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

1
2
3
4
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. 自动装箱机制会怎么处理下面的情况?

1
2
Integer a =  null ;
int  b = a;

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

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

1
2
3
4
5
6
7
8
9
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对象。

转载请注明:Android开发中文站 » 初学者在java学习中常见的30个问题

31个JAVA初学者遇到的灵魂问题,你都入坑了吗?【附答案】 本文回答了30个Java入门级初学者的常见问题。我可以用%除以一个小数吗?a+=b和a= a+b的效果有区别吗?声明一个数组为什么需要花费大量时间?为什么Java库不用随机pivot方式的快速排序?问题有以下几个方面的,你都遇到过吗? 一、基本数据类型 问题1:为什么-0/3结果是0,而-0.0/3.0结果是-0.0?(注意后边的结果0带负号)? 答:在Java里,整数是用补码表示的。在补码中0只有一种表示方法。另一方面,浮点数则是用IEEE标准表示的,对于0有两种表示方法,0和-0... 阅读详情

相关推荐

Java初学者该如何学习?

推荐一个资料群java《学习》+交流 523401738java初学者最好是能有一套比较好的,完整的教程来指引。下面是最近整理了一套java学习教程,适合新手入门,也适合有一些基础的提升自己。此套视频分六大阶段,每一阶段都逐渐加深,此套教程已经整理的非常完善,各位学习者基本上按照此套流程,一阶段,一阶段学习来,肯定会入门,逆袭成为大牛。第一阶段:Java基础视频教程 :http://pan.bai...

软件大咖 1万+

Java常见问题总结五

1、垃圾回收方式 SerialGC(串行垃圾回收):为单线程环境设计且使用一个线程进行垃圾回收,会暂停所有的用户线程。 ParalleGC(并行垃圾回收):对过GC线程并行工作,此时用户线程是停止的。 ConcMarkSweep(CMS):用户线程和GC线程同时执行,不需要停顿用户线程。 G1垃圾回收器:将内存分割成不同的区域然后并发的进行垃圾回收。 2、查看当前默认的垃圾回收器 java -XX:+PrintCommandLineFlags -version 3、7大垃圾回收器 在新生代主

一个有深度的博客 613

Java初学者常见五大问题 ,解决你的心结!

—————— 建议收藏观看 —————— 作为最热门的编程语言,Java几乎无处不在,全球有数十亿设备运行着Java,服务器程序大多都会使用Java编写,用来处理每天数以千万计的数据 Java火热,想学Java开发的人也越来越多。Java初学者学习Java,首先要入门,要喜欢Java才能学好Java。但是Java学习初期通常会遇到很多问题 一、能看懂,操作难 这或许是很多Java初学者会遇到的问题。就是看视频、看书时,都能懂,但操作时总是各种不会。这时便需要换一个更加适合自己的学习方法了 二、记忆差 克

编程领域的博客 1492

Java初学者的30个常见问题

本文回答了30个Java入门级初学者的常见问题。 我可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区别吗? 声明一个数组为什么需要花费大量时间? 为什么Java库不用随机pivot方式的快速排序? AD:2013大数据全球技术峰会低价抢票中 本文回答了30个Java入门级初学者的常见问题。 我可以用%除以一个小数吗? a += b 和

简陋的小草屋 1110

petalinux i2c的配置

1.硬件平台配置 1.内核配置 cd petalinux-config -c kernel -> Device Drivers -> I2C support -> i2C Hardware Bus support -> Xilinx I2C Controller Pressing 启用CONFIG_I2C_XILINX=y 2.修改用户设备树 cd cd project-spec/meta-user/recipes-bsp/device-tree/files/ i2c2:

u013403954的博客 4313

Latex在VSCODE中编译报错`Recipe terminated with error. Retry building the project.

Latex在VSCODE中编译报错Recipe terminated with error. Retry building the project. 1 报错提示: Recipe terminated with error 2 报错原因 大概率的原因是因为latex没有添加到系统环境变量中,所有设置的编译工具没有办法找到才出现的这种情况 3 解决方案 请按照如下方式进行系统变量的添加 对windows,win+R 然后输入sysdm.cpl 在高级中选择环境变量 找到path环境变量,将txtlive中

呆呆象呆呆的博客 3万+

Java开发中常见错误及解决方案大全

掌握并解决这些常见的Java错误,将极大地提高你的开发效率和代码质量。希望这篇文章能帮助你在实际开发中避免常见陷阱,写出更加稳健和高效的Java代码。如果你喜欢这篇文章,请分享给更多的Java开发者,并关注我们的Java栏目,获取更多精彩内容和最新资讯!你的支持是我们前进的最大动力!

阿里渣渣java研发组-群主 4269

论文理解【LLM-Agent】——【SkillOpt】Executive Strategy for Self-Evolving Agent Skills

SkillOpt 将 agent skill 从人工或一次性 prompt artifact 转化为可验证、可控、可迁移的文本空间“可训练状态”,通过有界编辑、验证门控、拒绝编辑反馈和 slow/meta update,在不更新模型权重的情况下显著提升多类 agent 任务表现

佚失的诗篇 597

Java面试常问问题及答案(非常详细)

一:java基础1.简述string对象,StringBuffer、StringBuilder区分string是final的,内部用一个final类型的char数组存储数据,它的拼接效率比较低,实际上是通过建立一个StringBuffer,让后台调用append(),最后再将StringBuffer toSting(),每次操作Sting 都会重新建立新的对象来保存新的值.这样原来的对象就没用了,...

weixin_30642029的博客 1090

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2152

GOM引擎单机传奇架设全攻略——从DBC2000配置到登录器生成

本文详细解析了使用GOM引擎架设单机传奇的完整流程,从DBC2000的安装配置、服务端部署、引擎控制器设置,到登录器生成与客户端补丁放置。文章重点解决了单机架设中的常见问题,如数据库路径配置、IP地址设置及Key.lic文件处理,旨在帮助玩家快速搭建稳定的个人游戏环境,体验GM乐趣。

weixin_28318011的博客 632

如何快速入门gh_mirrors/java30/java:面向Java新手的完整教程

想要快速掌握Java编程技能?gh_mirrors/java30/java项目为您提供了完美的学习平台!这个基于Exercism平台的Java练习库包含了大量精心设计的编程练习,帮助初学者从零开始系统学习Java编程语言。无论您是编程新手还是想要巩固Java基础知识的开发者,这个项目都能为您提供循序渐进的学习体验。😊 ## 📚 项目概述与核心价值 gh_mirrors/java30/jav

gitblog_00161的博客 1114

IBM Storwize V3700存储维护实战:硬盘更换、电源模块热插拔与带外管理IP配置

在企业IT基础设施中,存储阵列是数据持久化的核心组件,其稳定运行直接关系到业务连续性。存储阵列通常采用RAID技术实现数据冗余,并通过热插拔、冗余电源等设计保障高可用性。带外管理则提供了独立于业务网络的硬件级监控与管理通道,是运维的关键手段。本次实战以一台IBM Storwize V3700存储阵列为例,详细记录了在业务低峰期,依据严谨的操作流程,对出现SMART预警的硬盘进行在线更换,并对有异响的冗余电源模块实施热插拔更换。针对管理界面强制要求设置VIP才能配置带外管理地址的限制,文章提供了通过SSH命令

weixin_29172963的博客 303

Java初学者遇到的问题有哪些?

很多初学者能够看懂理论知识,但实际编写代码时却无从下手。这种现象被称为“能看懂,不会写”。:学习完的内容很容易忘记,导致反复学习和复习,增加了学习负担。:由于缺乏对编程概念和基础的理解,初学者在学习Java时可能会感到非常困难。例如,没有接触过编程或其他编程语言的人,在开始学习Java之前需要先掌握一些基础知识。:Java是一种面向对象的编程语言,初学者需要理解类、对象、继承、多态等概念,这些概念对于新手来说比较抽象且难以理解。

破损的天堂鸟博客 1382

Kolla 容器化 高可用OpenStack 部署与 Ceph 集群集成

本文介绍了 Kolla 项目在容器化 OpenStack 部署和管理方面的应用,以及与 Ceph 集群的集成。Kolla 项目通过容器技术提供了一种简化和自动化的 OpenStack 部署方法,同时实现了易于升级和回滚的特点。本文还探讨了 Kolla 在实现零宕机升级方面的进展,并分析了其对 OpenStack 用户和社区的重要意义。

we22635的博客 2703

Python爬取小红书种草商品评论数据:从入门到实战全攻略(附反爬+情感分析方案)

Python爬取小红书种草商品评论数据,核心是“抓包找到正确的接口+处理登录验证+合理的反爬策略”。新手不用一开始就追求多笔记批量爬取和情感分析,先把单笔记的评论抓取和存储跑通,再逐步扩展功能。我做的这个系统现在每天帮朋友爬取3-5款美妆产品的评论,自动做情感分析和关键词提取,她再也不用手动翻评论了,效率提升了80%。如果你们在开发中遇到具体问题,比如接口找不到、Cookie过期、IP被封,都可以在评论区留言,我会一一解答。后续也可以出一期小红书笔记种草数据爬取的教程,帮助大家更全面地分析竞品数据。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1351

致每一位Java初学者

致Java初学者 前言 ​ 能看到这篇文章的朋友,应该都或多或少的了解Java,也许你现在是个菜鸟还在成长的路上。再此期间你一定遇到了很多困惑疑虑,对未来的学习方向感到很迷惑。作为过来人我非常了解你们现在的处境。我是从2014开始接触Java这门编程语言的,从2017年从事Java相关开发工作,也是一个奋力奔跑的菜鸟,直到今天我还在不断的学习,提升自己的技能,学无止境,学习永远在路上。回...

盲目的拾荒者的博客 8929

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java有很多初学者常见的问题

多态问题:多态是指同一个类的实例,在不同的情况下可能表现出不同的行为。总之,Java的继承和多态是Java编程中非常重要的概念,需要认真学习和实践。如果子类的方法与父类的方法同名且参数列表相同,那么子类的方法将覆盖父类的方法。为避免这种情况,可以在子类中使用不同的名称,或者使用super关键字来引用父类的属性和方法。对于大范围的计算,应该选择较大的整型类型。Java的数据类型是非常重要的概念,因为不同的数据类型有不同的用途和限制。Java的继承和多态是面向对象编程的基础,也是Java编程中的重要概念。

weixin_44798281的博客 713

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

初学者学Java常遇到的问题,我都给你回答了!

前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 春节在家刷知乎,看到了一个知乎的问题:《学习Java可以干什么呢?》 我是一个Java的初学者,大概学了四天,对Java到底能做什么还是一头雾水,每天对着黑屏(DOS系统)除了编译还是编译,那么Java对于一个初学者来说Java可以做些什...

3y 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

31个JAVA初学者遇到的灵魂问题,你都入坑了吗?【附答案】_大学生在学习java的常见问题

❤:热爱Java学习,期待一起交流!🙏🏻作者水平有限,如果发现错误,求告知,多谢!🥰有问题可以私信交流!!!本文回答了30个Java入门级初学者的常见问题。我可以用%除以一个小数吗?a+=b和a= a+b的效果有区别吗?声明一个数组为什么需要花费大量时间?为什么Java库不用随机pivot方式的快速排序?问题有以下几个方面的,你都遇到过吗?

2401_89192314的博客 846

Java初学者一定要注意的问题,这些错误你犯过哪些?永远不要停止学习。

永远不要停止学习:关于学习编程,新手程序员常踩的坑!教你如何学习编程!

陈橘又青的博客 2463

Java初学者如何排查学习中遇到的问题

大多数新手或者刚入门的人在学习的时候,不管是看视频还是看书,都会遇到各种各样的问题,比如JDK配置了,但是javac没有办法执行,Eclipse安装了,但是打不开,快捷键用不了,照着视频敲了但是和视频上结果不一样等等。下面我们就来分析遇到各种问题的排查方法。 JDK配置了但是敲javac或者java命令没有反应,大多数是敲javac命令出不来 其实JDK很好配置,第一个是配置好JAVA_H...

坐看云起时_雨宣 8290

Java第一章常见问题及其初学者常见问题详细总结

第一部分:Java初学者常见的问题 一、总结-1 由于文件类型导致java文件无法运行 工具–>文件夹选项–>查看–>取消隐藏已知文件类型的扩展名选项 1个源文件不能有2个以上puclic类型的类 3.编译运行时的错误 (1)HelloWorld.java:1: class helloworld is public, should be declared in a file named helloworld.java public class helloworld ^ 1 er

m0_46894211的博客 979
上一篇: Android开发实践:使用Service还是Thread
下一篇: Java程序员必须知道的10个调试技巧
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值