Java常见问题3:周期之谜

谜24

byte是有符号的。范围是-128 - 127。

而0x90是int类型。

比較的时候。不相等。

假设想让其相等,须要进行类型转换:(byte & 0xff) 或者 (byte)0x99。

谜题25

自增运算符对循环的影响。j = j++,先赋值。

谜题26

Integer.MAX_VALUE加一之后会变成Integer.MIN_VALUE。这对循环会有影响。

能够考虑使用long来表示i变量,或者使用效率更高的i != Integer.MAX_VALUE。

谜题27

(-1 << 32)的结果是-1而不是0。

对于int型的数据移位运算总是取右端数转换成2进制的低五位。

对于long型的数据移位运算总是取右端数转换成2进制的低六位。

32取低五位是0。因此结果是-1。

假设右边的数是负数,相同保留低五(六)位,将其转换为正数。

谜题28

while(i == i + 1) {

}

当浮点数i足够大时候, i = i + 1。

相邻浮点数之间的距离被称为ulp(unit int the last place),一旦ulp超过2。加一将不会产生不论什么影响。

二进制浮点数算术仅仅是一种近似。

谜题29

while(i != i) {

}

IEEE 754浮点算术保留了一个特殊的值:NaN(not a number)。

double i = 0.0 / 0.0。double i = Double.NaN,

不论什么浮点数操作,仅仅要一个或多个操作数为NaN,那么结果是NaN。

NaN不等于不论什么浮点数,包含它自身。NaN  != NaN 。

谜题30

while(i != i + 0) {

}

i != i + 0,假设i是String类型。此时的+就不是算术加号了,被重载为字符串的连接。

谜题31

while(i != 0) {

i  >>>= 1;

}

还是在讲类型转换。

当i为short类型的-1的时候,i >>>= 1,仍旧是-1:首先将short转换为int。然后在截取低位16。

short,byte的不论什么负数终于都会转换为-1。而char不会,char是无符号的。

谜题32

Integer i = new Integer(0);

Integer j = new Integer(0);

while(i <= j && i >= j && i != j){

}

包装类,当使用==运算符时候,并非推断值相等,而是引用(兼容性考虑)。

<=或者>= 都是值推断。

谜题33

while(i != 0 && i == -i) {

}

整数的边界问题

0x8000 0000 表示最小的负数(Integer.MIN_VALUE),对其求相反数,仍是其本身。

谜题34

		final int START = 2000000000;
		int count = 0;
		for (float f = START; f < START + 65; f++) {
			count++;
			System.out.println(START + 65);
		}
浮点数精度问题

START+50与START相等,当使用浮点数表示的时候。50比START的ulp距离(128)的一半还小。

当超过ulp的距离的一半的时候,无限循环。

谜题35

取余和乘除具有同样的优一年级。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-12-16 10:38:29

Java常见问题3:周期之谜的相关文章

Java常见问题分析

一.JVM简介1.JVM内存模型实际占用内存大小:-XX:MaxPermSize + -Xmx + -Xss + -XX:MaxDirectMemorySize如图一: 主要分为:非堆内存+堆内存+栈内存+堆外内存JVM主要管理两种类型的内存:堆和非堆.简单来说堆就是Java代码可及的内存,是留给开发人员使用的:非堆就是JVM留给自己用的在JVM中堆之外的内存称为非堆内存(Non-heap memory).Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在J

java类生命周期详细解析

(一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)

Java常见问题之初始化过程

假设有个名为Dog的类 对于静态字段: 1. 当首次创建类型为Dog的对象时,或者Dog类的静态字段/静态方法首次被访问时,Java解释器会查找类路径,以定位Dog.class文件. 2. 载入Dog.class,此时初始化所有静态字段,如果没有对静态字段进行显示初始化,则默认将所有基本类型字段都设置成标准初值,而引用字段被设置成null. 对于非静态字段: 1. 当创建类型为Dog的对象时,首先将在堆上为该对象分配存储空间,且存储空间会被清零,这就将所有基本类型字段都设置成了标准初值,而引用字

hibernate session缓存和java对象生命周期

一.java对象生命周期 1.在java中,使用new关键字,创建一个java对象,jvm就为这个对象分配一块内存空间.只要这个变量被引用,他就一直存在于内存中.如果没有被任何变量引用(包括间接引用),那么这个对象就会被垃圾回收器回收.下面用一段代码来解释: Customer c=new Customer(); Order o1=new Order(); Order 02=new Order(); o1.setCustomer(c); c.getOrders().add(o1); o1=null

Java学习之==&gt;Java线程生命周期与状态切换

一.Java线程生命周期与状态切换 这些状态的描述可以总结成下图: NEW 一个刚创建但尚未启动的Java线程实例就是处于 NEW 状态 public class App { public static void main(String[] args) { Thread thread = new Thread(); Thread.State state = thread.getState(); System.out.println(state); } } // 输出结果 NEW RUNNABLE

Java常见问题

自古深情留不住,总是套路得人心 最近经历了一次惨无人道的程序员笔试,真的是“笔”试,默默地来整理一下…… 以后遇到问题要多整理…… 常见套路: 当一个变量被赋值为null的时候就被视为垃圾会被回收 当一个 .java 文件从第一行运行到最后一行时垃圾回收机制就会起作用,这是错误的,垃圾回收机制一直开着 if语句和suitch语句的区别(仅限十五字……):前者判断,后者选择 多态的好处允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)

Java实现生命周期管理机制

先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然只写以下几行代码,于是我感觉瞬间受到了很多伤害. public static void main(String[] args) { System.out.println(new Date() + ",server shutdown!"); } 这个中间件启动和运行的时候,开启了监听,启动着

java对象生命周期

java中一个对象的完整生命周期涉及java平台的很多技术.在创建一个java对象之前,需要先由虚拟机加载该类,然后对该java类进行链接和初始化.初始化完成之后,才创建出该类的对象实例.java对象也有自己的初始化过程,主要通过构造方法完成.当不再有引用指向该对象时,对象占用的内存会在合适的时机被垃圾回收器回收.对象终止机制提供了一种方式在对象被回收之前进行清理工作. java类的链接 虚拟机刚启动时,内部只包含java核心类的相关信息.随着程序的运行,不断有新的java类被加载到虚拟机中.j

Java WebSocket生命周期

本章将讲述WebSocket端点的生命周期.WebSocket端点的生命周期为开发人员提供了一个框架来管理端点所需要的资源,也提供了一个框架来拦截消息.我们将仔细探讨其生命周期的顺序和语义,以及Java WebSocket API如何提供API和注解来支持处理这些事件. 一.WebSocket协议 与基于HTTP的技术不同,WebSocket具有生命周期.此生命周期周期由WebSocket协议支撑.WebSocket协议定义了客户端和服务器长时间存活的专用的TCP连接,一旦连接已经建立,数据的传