数据类型

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. ganglia的yum插件的配置

    由于默认的centos的库是不存在ganglia的相关软件,因此要重新配置yum的库 配置yum库 安装yum优先级插件 yum install yum-priorities 安装Epel  此处是6 ...

  2. onkeypress与onkeydown及 oncopy和onpaste 事件区别详细说明

    onkeypress与onkeydown 具体区别: 1. 一个放开一个没有放开,onkeydown 先于 onkeypress 发生. 2.onkeypress 无法系统按钮. 2.onkeydow ...

  3. Oracle中使用escape关键字实现like匹配特殊字符,以及&字符的转义

    转:http://blog.chinaunix.net/uid-26896647-id-3433968.html 问题描述:如果在一个表中的一个字段上存在'&',  '_',  '%'这样的特 ...

  4. I.MX6 git patch

    /********************************************************************** * I.MX6 git patch * 说明: * 之前 ...

  5. 运维角度浅谈MySQL数据库优化(转)

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...

  6. (function(){})()这个是什么?有不明觉厉的感觉么?

    今天在RunJs上看到一个人分享的一个jquery代码,写的是jquery弹性滑动效果.不过,看着看着,发现一句代码(function{})(),突然有种不明觉厉的感觉. 事实上,只是因为我们没有用过 ...

  7. ECSHOP v2.5数据库字典

    ECSHOP v2.5 数据库字典 ECSHOP R&D Team 2007年4月16日 商品相关表 商品分类表 category 此表用来维护商品分类信息 字段名 字段描述 字段类型 默认值 ...

  8. linux下网络排错与查看

    基本的故障排除错误 故障的排除一定是先简单后复杂的,有的人把上述的文件反复配置,就是上不了网,一直都认为是系统出了故障,想重装机子.结果发现原来是网线压根就没插上. 排错要慢慢的按部就班的来: (1) ...

  9. VelocityTracker简单用法

    VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出 当前的速度,这样的用法在androi ...

  10. linux命令——rmdir

    rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.rm - r dir命令可代替rmdir rmdir [选项]... 目录... - p 递归删除目录dirname,当 ...