Java 代码学习之理解数据类型中的坑
package dailytest; import org.junit.Test; public class DataTypeTest { /**
* 当有字符串第一次参与运算后,+成了连接符的作用
* 注意是第一次参与运算后
*/
@Test
public void test02() {
System.out.println("hello" + 'a'); //helloa
System.out.println("hello" + 'a' + 1); //helloa1
System.out.println("hello" + ('a' + 1)); //hello98
System.out.println('a' + 1); //
System.out.println("5 + 5 =" + 5 + 5); //5 + 5 =55
System.out.println(5 + 5 + " = 5 + 5"); //10 = 5 + 5
System.out.println(5 + 5 + " = 5 + 5 = " + 5 + 5); //10 = 5 + 5 = 55
} @Test
public void test01(){
//boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。
//boolean b = 1; //编译报错 boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。 /*
* byte 占一个字节,范围-128-127
* 1.首先需要知道的是,在Java中,整数默认都是int型
* 2.jvm 在编译过程中,对于默认为int类型的数值,当赋值给一个比int类型数值范围小的数值类型时(byte,char,short),记作K
* 首先会进行判断,如果超出K类型的范围时,会报编译异常,因为超出范围了,需要强制转换。
* 3.如果此时赋值在K类型的范围内,jvm会自动进行一次隐式类型转换,将int转成K
*/
byte b1 = -128;
byte b2 = 127; //b2, b2都正常
//byte b3 = 128; //编译报错,Cannot convert from int to byte /**
* byte b3 = 3,3是直接量,在编译期间就可以直接进行判定
* 而byte b4 = i5,i5是一个变量,需要在运行期间才能确定,所以会编译异常,需要强制类型转换
*/
byte b3 = 3;
int i5 = 3;
//byte b4 = i5; //编译报错 cannot convert from double to float
byte b5 = (byte) i5; /**
* 当进行数值运算时,会将结果自动提升,再向小类型赋值时,会报异常。
* 可以简单记为:运行期才能确定的变量,赋值给小的,都会报编译异常
*/
byte b6 = 3 + 5;
byte b7 = 3 + 5;
int i6 = 3;
//byte b8 = i6 + b6; //编译异常 Cannot convert from int to byte
//byte b9 = b7 + b6; //编译异常 Cannot convert from int to byte //short同理
short s1 = 5;
//short s2 = s1 + 5; //编译异常 Cannot convert from int to short
short s3 = s1 += 5; //+=可以通过 double f4 = 3.5;
//float d = f4 + f4; //编译异常 Cannot convert from double to float /**
* 数值越界问题
*/
int a = 233;
byte b = (byte) a;
System.out.println("b:" + b); // 输出:-23 /**
* 将数值大的转换成数据小的,可能会丢失精度,主要针对符点型数据
* 默认小数类型为double,将它赋值给float,会丢失精度,因而编译异常
* 解决方法是加f或者F,或者强制类型转换
*/
//float f1 = 4.0; //编译报错 cannot convert from double to float
float f2 = 4.0f;
float f3 = (float) 4.0; /**
* 当将一个数值范围小的类型赋给一个数值范围大的数值型变量,jvm在编译过程中会进行自动提升
* 在数值类型的自动提升过程中,数值精度至少不应该降低(整型保持不变,float->double精度将变高)
*/
//Long与long
//Long l1 = 1; //编译报错,Cannot convert from int to byte
Long l1 = 1L; //正确写法,后面接小写的l和大写的L都没有问题,建议用大写的,小写的l容易和1弄混
long l2 = 1; /**
* 1.首先需要知道的是Java把内存划分为两种,一种是栈内存,一种是堆内存
* 2.byte,short,int,long,boolean,char,double,float这八个是基本数据类型,用它们声明的变量,存放的是栈内存
* 3.Byte,Short,Integer,Long,Boolean,Character,Double,Float这八种是包装类,它们声明的是变量实际上是一个对象,对象是存储在堆内存中的
* 4.所以,用包装类声明的变量,在用 == 作比较时,比较的其实是对象的地址值
*
* l3 == l4 为true的原因:
* 因为Long l = 3L,在底层,其实调用的是Long.valueOf()这个方法
* 在Long.valueOf()这个方法里,对于在-128-127范围内的数据,是直接从缓存里取的,没有new一个新的对象
* 所以,凡是在-128-127范围内的数据,== 都为true
* 不在此范围内的,每次都会新new一个对象,因而地址值肯定是不一样的。
*
* 因为对于包装类,我们需要知道的是:
* 1.在比较大小时,应该用equals,或者先转成基本数据类型再比较
* 可以用equals方法的原因在于:
* 对于Object来说,equals和==没有区别,都是比较地址值
* 但是Integer这些包装类,重写了equals方法
* 2.在做条件判断时,注意先判断是否为null,特别是Boolean类型,如果直接作条件判断,很容易在拆箱时报NullPointException
* 3.Long和Integer都将-128-127这些对象缓存了,所以下面测试的结果对于Integer同样适用
*/
Long l3 = 3L;
Long l4 = 3L;
System.out.println(l3 == l4); //true Long l5 = 129L;
Long l6 = 129L;
System.out.println(l5 == l6); //false Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2); //true Integer i3 = -129;
Integer i4 = -129;
System.out.println(i3 == i4); //false Integer i9 = -128; System.out.println(i3 > i9); } }
Java 代码学习之理解数据类型中的坑的更多相关文章
- java虚拟机学习-深入理解JVM(1)
1 Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言.Java类文件格式.Java虚拟机和Java应 ...
- java代码块的理解
最近在复习java基础,在看到java代码块的时候,忽然发现自己貌似对于java代码块一无所知,于是赶紧对着一些资料实战演练了一把. 对于java代码块,不难根据名称看出其实就是一些java语句的集合 ...
- 如何通过 Java 代码隐藏 Word 文档中的指定段落
在编辑Word文档时,我们有时需要将一些重要信息保密. 因此,可以隐藏它们以确保机密性. 在本文中,将向您介绍如何通过 Java 程序中的代码隐藏 Word 文档中的特定段落.下面是我整理的具体步骤, ...
- 学习和理解C#中的事件
注:本文系学习笔记. 上一篇文章记录了我对C#中委托的理解.委托实际上是一种类型.可以将一个或多个方法绑定到委托上面,调用委托时,一次执行委托上面绑定的方法.本文要讲述的事件实际上和委托有很深的“感情 ...
- Java代码风格和在idea中的一些设置
源文件基本设置 1. 文件名 驼峰标识,.java结尾 2. 编码 统一为UTF-8 Transport...可以解决property文件不能正常显示为中文的问题 3. 特殊字符 尽量使用转义字符(\ ...
- [改善Java代码]不要在finally块中处理返回值
在finally代码块中处理返回值,这是在面试题中经常出现的题目.但是在项目中绝对不能再finally代码块中出现return语句,这是因为这种处理方式非常容易产生"误解",会严重 ...
- Java 代码学习之数组的初始化
我们都很熟悉Java中的数组,它具有查询快,增删慢的特点.但是通常我们自认为很了解它的用法,却容易忽略一些小细节.今天通过一段代码来简单了解数组初始化中的一些我们容易忽略的地方. package da ...
- Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算
Ogre的地形系统中的重要概念:高度差,英文HeightDeltas,表示某个完整细节中的顶点,在某个它被隐去的lod中被插值之后的高度和原始高度(即高度图中的高度)之差. DeltaHeight = ...
- PL/SQL学习笔记之数据类型中的标量、LOB
一:标量 标量 即 基本数据类型,主要有4种:数值.字符.布尔类型.日期时间. 1:数值类型 数据类型 描述 PLS_INTEGER 通过2,147,483,647到-2147483648范围内有符号 ...
随机推荐
- hadoop集群服务器配置注意事项
1.使用root账户,一劳记逸,远离权限问题. 2.关闭防火墙,命令:service iptables stop 想永久关闭,命令为:chkconfig iptables off 查看防火墙状态,命令 ...
- git clone 带用户名密码的形式但包含@等特殊符号无法正常解析
正常使用git clone 的方式 git clone https://remote 使用带用户名密码的方式(可以避免后续每次都要输入用户名密码) git clone https://[usernam ...
- grunt concat针对有依赖文件的js脚本的合并
grunt concat针对有依赖文件的js脚本的合并: 在一个入口文件index.js里,有很多依赖文件,主要分两类,一类是和主文件同目录,另一类是其他目录下的js(cmd.非cmd的js文件,一般 ...
- MQTT——发布报文
发布报文的知识点并不难,只是多.看过前面几章的读者们应该或多或少都认识服务质量QOS.发布报文跟他的联系最紧的.我们也清楚订阅报文里面虽然也有用到QOS,但是他却没有更进一步的联系.往下看就知道是什么 ...
- JAVAWEB开发环境搭建,附JDK开发环境一键配置批处理bat
JDK配置: CLASSPATH: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar JAVA_HOME: C:\Program Files\J ...
- postgis常用操作手册
查询所有函数: SELECT * FROM pg_proc; 更新坐标系st_setsrid,查看坐标系:st_srid 创建空间索引: CREATE INDEX [indexname] ON [ta ...
- Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
在struts2中有很多种跳转方式如下是在struts-default.xml截取的一段源码,常用的跳转有 转发:dispatcher.重定向:redirect.转发到Action:chain.重定向 ...
- VMware下Linux网络配置局域网和外网访问
要使用Linux系统很重要的一个操作就是使Linux系统能够访问互联网,只有Linux系统能够访问互联网才能够去下载很多自己所需要的资源,如果不能访问互联网那么使用Linux系统往往会卡在这一步,假设 ...
- Swiper 判断上滑下拉操作
onTouchMove: function(swiper){ //手动滑动中触发//判断上滑下拉var i = mySwiper.translate;setTimeout(function() {va ...
- bootstrap栅格布局学习历程
了解一个东西.他叫什么?他由什么组成,能做什么? 现在响应式的网站(在不同分辨率下有不同的布局)很瘦欢迎.优点:1.解决设备之间的差异化展示缺点:a.兼容性代码多,工作量大,加载速度受到影响;b.用户 ...