数据类型

Java中存在2种数据类型,下面我们来详解一下:

  1. 基本数据类型;
  2. 引用数据类型;

可以用一张表来记录:

基本数据类型

整型

  • byte:1个字节8位,取值范围为:[-128, 127],直接写值:(byte) 1;
  • short:2个字节16位,取值范围为:[-32768, 32768],直接写值:(short) 1;
  • int:4个字节32位,取值范围为:[-2147483648, 2147483648],直接写值:1;
  • long:8个字节64位,取值范围为:[-9233372036854477808, 9233372036854477808],直接写值:1L;
  • char:2个字节16位,取值范围为:[0, 65535],直接写值:(char) 1或'a';

(注意Java中没有无符号类型,需要使用无符号类型需要自行扩展,可以参考我的扩展类库

浮点型

  • float:4个字节32位,直接写值:1.0F;
  • double:8个字节64位,直接写值:1.0D;

布尔型

  • boolean:1个字节8位,取值范围为:true或false;

引用数据类型

  • String:字符串类型,无长度限制,直接写值:"abc";
  • java.math.BigInteger:基本数据中的整型不能满足需求时可以使用该类来表示任意大小的整型数据;
  • java.math.BigDecimal:基本数据中的浮点型不能满足需求时可以使用该类来表示任意精度的浮点型数据;
  • 其他类型:类、接口、数组等其他类型;

栈和堆

栈内存

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

堆内存

堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。

从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的。

另外,栈内存的内容会在作用域结束时自动移除,而堆内存的释放要借助Java的垃圾回收机制来完成。

包装类

不同于C#的万物皆对象,Java中,基本数据类型仅仅是数据而非对象,所以为了能将基本类型视为对象进行处理,并能连接相关的方法,java为每个基本类型都提供了包装类。以便将基本数据类型作为一个对象来处理。

C#中一切皆对象,所以将一个数字转换为16进制可以这么写:

254.ToString("x");//输出FE

但是在Java中,整型数据并不是对象,所以需要这么写:

new Integer(254).toString();//输出字符串"254"

包装类功能

  1. 提供数据的最大值与最小值;
  2. 提供转换为其他数据类型的功能;
int i = 5;//直接在栈中分配空间
Integer i = new Integr(5);//对象是在堆内存中,而i(引用变量)是在栈内存中

当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装类。

  • 原始类型 包装类
  • boolean Boolean
  • char Character
  • byte Byte
  • short Short
  • int Integer
  • long Long
  • float Float
  • double Double

装箱和拆箱

装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。int包装成Integer、float包装成Float;

拆箱:和装箱相反,将引用类型的对象简化成值类型的数据;

Integer a = Integer.valueOf(100);
int b = a.intValue();

Java1.5之后引入了自动装箱和自动拆箱,如下:

Integer a = 100;//编译后实际是Integer a = Integer.valueOf(100);
int b = a;//编译后实际是int b = a.intValue();

需要注意的地方

需要注意每个包装类的valueOf方法的实现:

Integer

 public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}

当数值在[-128,127]之间使用实现缓存好的对象,否则创建新的Integer对象,这就不难解释下面的代码运行了:

 public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);//true
System.out.println(i3==i4);//false
}
}

Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。

Double

 public static Double valueOf(double d) {
return new Double(d);
}

为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。

看下面的代码:

 public class Main {
public static void main(String[] args) {
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1==i2);//false
System.out.println(i3==i4);//false
}
}

Double、Float的valueOf方法的实现是类似的。

Boolean

 public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}

布尔是直接返回一个常量,而该常量是提前创建好的两个Boolean对象。

 public class Main {
public static void main(String[] args) {
Boolean i1 = false;
Boolean i2 = false;
Boolean i3 = true;
Boolean i4 = true;
System.out.println(i1==i2);//true
System.out.println(i3==i4);//true
}
}

变量

在Java中定义变量的写法如下:

int a = 0;
int b = 1, c = 2;

作用域

在栈内存中定义的变量是存在作用域的:

  1. 使用大括号来定义作用域;
  2. 作用域可以嵌套,子作用域可以访问父级的变量,父作用域不能访问子级的变量;
  3. 同一个作用域中的变量名不能重复;
  4. 离开作用域变量会被JVM自动回收;

下面我们看几个例子:

 public static void main(String[] args)
{
int a = 0;
{
int b = 1;
a = 10;
}
a = b;//这行编译报错, 变量 b 离开自身作用域后就被回收了, 不能访问
}
 public static void main(String[] args)
{
int a = 0;
{
int b = 1;
a = 10;
}
int b;//这个 b 是当前作用域创建的新变量, 值为默认的 0 而不是 1
a = b;//不报错, b 可以访问到
}
 public static void main(String[] args)
{
int a = 0;
{
int a = 100;//报错, 子作用域不能使用父级已经存在的变量名
}
}

类型转换

数据类型之间常常会需要相互转换,下面我们来看看;

小数据向大数据转换

由JVM自动完成,不需要进行额外处理,称为隐式类型转换,如:

 public class Main
{
public static void main(String[] args)
{
byte a = 16;
short b = a;
int c = b;
long d = c; float e = 16.66f;
double f = e; test(a);
test(e);
} private static void test(int i)
{
} private static void test(double i)
{
}
}

整数转换为浮点数时会出现精度丢失的情况。

大数据向小数据转换

需要强制转换,称为显式类型转换,如:

 public class Main
{
public static void main(String[] args)
{
long a = 1L;
int b = (int) a;
short c = (short) b;
byte d = (byte) c; double e = 16.66f;
float f = (float) e; test((byte) a);
test2((float) e);
} private static void test(byte i)
{
} private static void test2(float i)
{
}
}

转换时要注意数据越界的问题。

运算时要注意的点

有一个要注意的地方,请看下面的代码:

 public class Main
{
public static void main(String[] args)
{
System.out.println(5 / 3);// System.out.println(5.0 / 3);//1.6666666666666667
System.out.println(5 / 3.0);//1.6666666666666667
System.out.println(5d / 3);//1.6666666666666667
System.out.println((double)5 / 3);//1.6666666666666667 System.out.println((double)(5 / 3));//1.0 System.out.println(5f / 3);//1.6666666
System.out.println(5 / 3f);//1.6666666
System.out.println(5 / (float)3);//1.6666666 System.out.println((float)(5 / 3));//1.0
}
}

根据输出,我看可以得到下面的结论:

  1. 两个整形进行运算得到的仍然是整形;
  2. 其中一个是浮点型则另一个也转换为浮点型,并且结果也是浮点型;
  3. 其中一个是双精度浮点型则另一个也转换为双精度浮点型,并且结果也是双精度浮点型;
  4. 默认的小数不带“f”则表示为一个双精度浮点数;
  5. 整形相除之后再转换为浮点数,小数部分仍然丢失;

Java学习笔记(一):数据类型与变量的更多相关文章

  1. Java学习笔记18---final关键字修饰变量、方法及类

    英语里final这个单词大家都知道是"最终的"意思,其实还有一个意思是"不可更改的".在Java里,final关键字作"不可更改的"来解释更 ...

  2. Java学习笔记三——数据类型

    前言 Java是强类型(strongly typed)语言,强类型包含两方面的含义: 所有的变量必须先声明后使用: 指定类型的变量只能接受预支匹配的值. 这意味着每一个变量和表达式都有一个在编译时就确 ...

  3. Java学习笔记(二)——变量与常量

    一.java中的关键字 Java 语言中有一些具有特殊用途的词被称为关键字.关键字对 Java 的编译器有着特殊的意义,在程序中应用时一定要慎重哦!! 二.认识Java标识符 1.定义 标识符就是用于 ...

  4. 【原】Java学习笔记003 - 数据类型

    package cn.temptation; public class Sample01 { public static void main(String[] args) { System.out.p ...

  5. JAVA学习笔记:注释、变量的声明和定义、

    本文内容: 注释 变量的声明和定义 成员变量和局部变量 首发时间:2018-03-16 15:59 注释: 单行注释:// 多行注释:/* - */ 变量: 变量是内存中的一个存储区域,变量的定义就是 ...

  6. Java学习笔记(4)--- 变量类型,修饰符

    1.变量类型: a.定义: 和C++差不多,就是: type identifier [ = value][, identifier [= value] ...]: type为Java数据类型.iden ...

  7. Java学习笔记二---设置环境变量JAVA_HOME,CLASSPATH,PATH

    1.环境变量包括: JAVA_HOME,CLASSPATH,PATH 2.设置环境变量的目的: 路径搜索,方便查找到jdk的安装路径.方便搜索用到的类文件.方便搜索用到的可执行文件如java,java ...

  8. Java学习笔记8---类的静态成员变量与静态成员方法的访问与调用方式

    (注:静态变量修改为静态成员变量,静态方法改为静态成员方法) 静态成员变量又称类变量,静态成员方法又称类方法,它们统称为静态成员或类成员.静态成员由static修饰,是属于整个类的,所有的对象共享这些 ...

  9. Java学习笔记2、环境变量配置与初学者常见错误

    2.1 环境变量的配置   2.1.1 path环境变量配置的作用 程序的执行需要使用外部指令javac,但是javac指令仅仅能在JDK安装目录下的bin目录下运行,因此程序只能写入bin目录程序开 ...

  10. Java学习笔记2---设置环境变量JAVA_HOME,CLASSPATH,PATH

    1.环境变量包括: JAVA_HOME,CLASSPATH,PATH 2.设置环境变量的目的: 路径搜索,方便查找到jdk的安装路径.方便搜索用到的类文件.方便搜索用到的可执行文件如java,java ...

随机推荐

  1. bzoj2535 2109

    做过4010这题其实就水了 把图反向之后直接拓扑排序做即可,我们可以用链表来优化 每个航班的最小起飞序号就相当于在反向图中不用这个点最迟到哪 type node=record po,next:long ...

  2. bzoj2431: [HAOI2009]逆序对数列

    dp. f[i][j]表示放置第i个数有j个逆序对的方案数. s[i][j]维护前缀和(f[i][0]~f[i][j]). 状态转移方程 f[i][j]=s[i-1][j]-s[i-1][max(j- ...

  3. bzoj1863: [Zjoi2006]trouble 皇帝的烦恼

    白书原题.l边界又设错啦.一般都是错这里吧.注意为什么这里不能是l=0.(只是为了判断第一个和最后一个 #include<cstdio> #include<cstring> # ...

  4. Entity Framework查询,EF执行SQl

    一.简介 EF 支持开放底层的 ADO.NET 框架,DbContext有三种常用方法 DbSet.SqlQuery //查询并返回Entities DbContext.Database.SqlQue ...

  5. 使用AngularJS 进行Hybrid App 开发已经有一年多时间了,这里做一个总结

    一.AngularJS 初始化加载流程 1.浏览器载入HTML,然后把它解析成DOM.2.浏览器载入angular.js脚本.3.AngularJS等到DOMContentLoaded事件触发.4.A ...

  6. Make AngularJS $http service behave like jQuery.ajax()(转)

    There is much confusion among newcomers to AngularJS as to why the $http service shorthand functions ...

  7. 最简单的视音频播放示例2:GDI播放YUV, RGB

    前一篇文章对“Simplest Media Play”工程作了概括性介绍.后续几篇文章打算详细介绍每个子工程中的几种技术.在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和 ...

  8. (4) Spring中定时任务Quartz集群配置学习

    原 来配置的Quartz是通过spring配置文件生效的,发现在非集群式的服务器上运行良好,但是将工程部署到水平集群服务器上去后改定时功能不能正常运 行,没有任何错误日志,于是从jar包.JDK版本. ...

  9. POJ 1077 Eight

    题意:经典的八数码=3= 3*3的格子,里面有1~8这8个数字,还有一个空格x,移动空格的位置,直到移到1~8按顺序排好,输出移动的序列. 解法:看到题果断写了个广搜……然后T了……百度了一下说广搜虽 ...

  10. Android中空格及换行

    空两个字符          换行  \n