数据类型

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. uva11181Probability|Given

    枚举,条件概率. 2^20次方等于100w,是大约可以没准还能过的. 二进制枚举时,如果买东西的人恰好为r个,设概率为p,就将sum[i]+=p(sum[i]为r个人买东西时第i个人买东西的概率),t ...

  2. ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中

     参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-th ...

  3. BZOJ_1624_ [Usaco2008_Open]_Clear_And_Present_Danger_寻宝之路_(最短路_Floyd)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1025 给出\(n\)个点以及之间的边的长度,给出必须访问的点的顺序,求最短路线长度. 分析 用 ...

  4. codevs 1218 疫情控制

    啊好烦这道题.... 基本思路网上都有. 注意的一点是在匹配的时候,如果有军队的来源没有被匹配到,那么就先匹配这个来源.(因为不花钱). 不过数据好水.... #include<iostream ...

  5. JavaScript备忘录-原型

    function Person() { this.name = "fs"; } Person.prototype.sayHello = function () { return & ...

  6. hdu 3535 AreYouBusy

    // 混合背包// xiaoA想尽量多花时间做ACM,但老板要求他在T时间内做完n堆工作,每个工作耗时ac[i][j],// 幸福感ag[i][j],每堆工作有m[i]个工作,每堆工作都有一个性质,/ ...

  7. 底部菜单栏(二) TabHost & RadioGroup 实现

    需求:使用TabHost & RadioGroup实现底部菜单栏: 效果图: 实现分析: 1.目录结构: 代码实现: 1. activity_main.xml <?xml version ...

  8. XtraGrid的若干种用法 z

    支持多种类型的数据集合作为数据源 XtraGrid与传统的DataGridView一样,支持多种类型作为其数据源.下面例子是将DataTable, List<T>和数组分别绑定到XtraG ...

  9. Drawer Layout

    http://developer.android.com/training/implementing-navigation/nav-drawer.html#DrawerLayout <menu ...

  10. 《Python CookBook2》 第一章 文本 - 改变多行文本字符串的缩进 && 扩展和压缩制表符(此节内容待定)

    改变多行文本字符串的缩进 任务: 有个包含多行文本的字符串,需要创建该字符串的一个拷贝.并在每行行首添加或者删除一些空格,以保证每行的缩进都是指定数目的空格数. 解决方案: # -*- coding: ...