Java小白在初学Java时都会遇到各种各样的问题,小编来总结一下一些常见的问题。比如,可以用%除以一个小数吗?a+=b和a=a+b的效果有区别吗?声明一个数组为什么需要花费大量时间?为什么Java库不用随机pivot方式的快速排序?

如果有想学习java的同学,可来我们的java技术学习QQ群的哦:745446493里面免费送整套系统的java教程!

基本数据类型

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

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

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

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

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

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

条件语句和循环语句

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

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

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

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

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

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

数组

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

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

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

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

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

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

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

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

排序与查找

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

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

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

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

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

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

栈和队列   

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

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

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

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

函数调用

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

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

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

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

递归调用

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

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

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

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

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

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

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

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

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

1. private Item[] a = new Item[max];

2. oldfirst = first;

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

1. private Item[] a = (Item[]) new Object[max];

2. oldfirst = first;

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

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

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

1. publicstaticvoid main(String[] args) {

2. for (String s : args)

3. StdOut.println(s);

4. }

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

编译器在翻译时,可能把那种“尾递归”形式翻译成等价的循环形式。所以可能并没有可以被观测到的性能提升。

尾部递归是一种编程技巧。如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾递归是极其重要的,不用尾递归,函数的堆栈耗用难以估量,需要保存很多中间函数的堆栈。比如f(n, sum) = f(n-1) + value(n) + sum; 会保存n个函数调用堆栈,而使用尾递归f(n, sum) = f(n-1, sum+value(n)); 这样则只保留后一个函数堆栈即可,之前的可优化删去。

欢迎关注胖胖程序员,可视化学习java,每天更新文章,让Java学习更加简单。

声明:本文内容来源于网络,如有侵权请联系删除

Java小白常问的问题大全相关推荐

  1. Java面试常问计算机网络问题

    转载自   Java面试常问计算机网络问题 一.GET 和 POST 的区别 GET请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:/test/demo_form.asp?na ...

  2. 指南Java面试常问问题及答案

    Java 面试常问问题及答案(非常详细) 一:java 基础 1.简述 string 对象,StringBuffer.StringBuilder 区分 string 是 final 的,内部用一个 f ...

  3. 2022最新Spring相关大厂常问技术面试题大全 —— 金三银四好时机

    Spring相关大厂常问面试题 1. 什么是 Spring 框架? 2. 列举一些重要的Spring模块? 3. @RestController 与 @Controller 的区别 4. 谈谈自己对于 ...

  4. java面试常问知识点,快醒醒吧

    前言 今天这篇文章是比较偏"教程"一点的文章.但也由浅入深,认真地分析了源码,并且介绍了一些在使用Spring Cache中常见的问题和解决方案,肯定是比简单的入门文档更有深度一些 ...

  5. 三年Java开发,java基础常问面试题

    一.首先本职工作一定要做好做精 本人之前在干兼职的时候,也忽视过本职工作,从而导致自己落后平均技术水平,虽然之后迎头赶上,但这不能不算是个遗憾.前在接一些活的时候就感觉技术的重要性了,如果当年我技术再 ...

  6. java基础常问面试题,面试必问

    一.首先本职工作一定要做好做精 本人之前在干兼职的时候,也忽视过本职工作,从而导致自己落后平均技术水平,虽然之后迎头赶上,但这不能不算是个遗憾.前在接一些活的时候就感觉技术的重要性了,如果当年我技术再 ...

  7. Java面试常问基础知识(持续更新)

    欢迎关注我的知乎专栏[数据池塘],专注于分享机器学习,数据挖掘相关内容:HTTPS://zhuanlan.zhihu.com/datapool 本文中的知识都是我自己或同学在面试过程中常被问到的,在此 ...

  8. java面试常问问题及答案,附源代码

    找大厂面试题,看套路!Java面试题及答案及面试解析请阅读严宏博士的Java模式或设计模式解释中的桥梁模式). 封装:一般认为封装是将数据和操作数据的方法绑定起来,数据的访问只能通过定义的界面进行.面 ...

  9. 120道java最常问面试题!

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 不积跬步无以至千里,下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出 ...

最新文章

  1. Python机器学习Numpy, Scipy, Pandas, Scikit-learn, Matplotlib, Keras, NN速查手册
  2. 解决git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Pleas
  3. jest忽略如何添加忽略_大多数人忽略的基本家庭维护任务
  4. 电脑文件夹加密软件_上海靠谱电脑资料加密软件解决方案
  5. 3.3.1网络原理数据链路层之差错控制(检错编码和纠错编码)->(奇偶校验码、CRC循环冗余码、海明码)(转载)
  6. 电子商务网站优化之策略篇
  7. 砍价小程序有人做过吗?调用多多砍价记录,可以转口令或者链接的那种
  8. 三维叉乘怎么算_奇技淫巧系列:向量叉乘
  9. access里面的表达式运用_Access 如何使用表达式生成器
  10. Centos7 Snapper快照备份
  11. 华为海思芯片 网口烧录详解(翻遍全网资料 结合实际成功操作)
  12. 前端工程师简历怎么写才更容易进入面试呢?
  13. ADB命令行卸载或删除你的Android设备中的应用
  14. Ubuntu系统安装搜狗输入法
  15. STM32单片机初学6-SPI通信驱动IPS彩屏
  16. ei检索计算机科学与应用,国内EI检索的期刊有哪些?(计算机、信息方向) - 论文投稿 - 小木虫 - 学术 科研 互动社区...
  17. 两年数据对比柱形图_增强PPT数据对比视觉效果的几种方法——布衣公子
  18. TF报错及解决方法 Error: TF_DENORMALIZED_QUATERNION
  19. 【光链路分析三】otdr数据结构参考
  20. Linux集群管理软件clustershell

热门文章

  1. python计算复数的辐角_python做傅里叶变换
  2. POJ3322(bfs+状态限制)
  3. 网易教育线终于『并轨』
  4. 基于C#的ArcEngine二次开发教程(03):ArcEngine的接口查询技术底层分析
  5. 梦幻模拟战 服务器维护,《梦幻模拟战》问题修复公告暨致歉信
  6. 摆脱“概念化”,自动售货机玩儿“物联网”是否靠谱?
  7. Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展示值钱技能
  8. SOT-23三极管、MOS管、LDO封装对应图汇总
  9. RSF 异步访问性能分析报告 - 百兆网卡下的彪悍性能
  10. coap python_Python coap