[关闭]
@wxf 2017-04-30T03:46:43.000000Z 字数 2358 阅读 847

2.赋值

老马说编程


上节我们说了数据类型和变量,通过声明变量,给每个变量赋予一个数据类型和一个有意义的名字,这样我们就告诉了计算机我们要操作的数据。有了数据,我们可以做很多操作,但本文只说对数据的赋值操作。
在Java中基本数据类型、数组、对象的赋值有明显不同,本文将介绍基本类型和数组的赋值,关于对象赋值后面详述。

基本类型的赋值

赋值形式很简单,直接把熟悉的数字常量赋值给变量即可,对应的内存空间的值就从未知变成了确定的常量。但是常量不能超过对应类型的表示范围。

整数类型

整数类型包括:byte、short、int、long,它们分别占用1、2、4、8个字节的内存空间。
值得注意的是,在给long类型赋值时,如果常量超过了int的表示范围,需要在常量的后面加大写L和小写l,例如:

  1. long a = 3232343433L;

这是由于整数常量默认是int类型的。

小数类型

小数类型包括:float和double,它们分别占用4、8个字节的内存空间。
在对double进行赋值时,直接将数字常量赋值给变量即可,例如:

  1. double d = 333.33;

但是对于float,需要在数字后面加大写F或小写f,例如:

  1. float f = 333.33f;

这是由于小数常量默认是double类型的

boolean类型

直接使用true和false进行赋值,分别表示真和假。

字符类型

字符类型char用于表示一个字符,这个字符可以是中文字符,也可以是英文字符。在内存中,Java用两个字节表示一个字符。赋值时把字符常量用单引号括起来,而不要使用双引号,例如:

  1. char c = 'A';
  2. char z = '中';
说明:
给变量赋值的形式包括:直接给变量赋值、变量赋值给变量、将变量的运算结果赋值给变量。

数组类型的赋值

赋值语法

基本类型的数组有三种赋值形式,如下所示:

  1. //1.预先知道数组内容
  2. int[] arr = {1, 2, 3};
  3. //2.预先知道数组内容
  4. int[] arr = new int[]{1, 2, 3};
  5. //3.先分配长度,再给每个元素赋值
  6. int[] arr = new int[3];
  7. arr[0] = 1;
  8. arr[1] = 2;
  9. arr[2] = 3;

数组和基本数据类型在内存中的区别

在Java中定义的基本类型变量存在于栈内存中。但是对于数组这种复合数据结构,就需要将数组变量存在栈内存中,将数组对象存在堆内存中。然后通过引用变量来访问堆内存中的数据。
有一个int变量a,和一个int数组变量arr,其代码、变量对应的内存地址和内存内容如下:

代码 内存地址 内存数据
int a = 100; 1000 100
int[] arr = {1, 2, 3}; 2000 3000
3000 1
3004 2
3008 3

基本类型a的内存地址是1000,这个位置存储的就是它的值100。数组类型arr的内存地址是2000,这个位置存储的值是一个堆内存地址值3000,3000开始的位置存储的才是实际的数据1, 2, 3。

Java中内存分为两种:栈内存和堆内存。

  • 栈内存用来存放基本类型变量和对象的引用变量。
  • 堆内存用来存放由new创建的对象和数组,以及对象的实例变量。

为什么数组要用两块内存空间

首先,我们先来看一下这段代码:

  1. int[] arr1 = {1, 2, 3};
  2. int[] arr2 = {4, 5, 6, 7};
  3. arr1 = arr2;

这段代码中,arr1的初始长度是3,arr2的长度是4,后来将arr2赋值给arr1。如果arr1对应的内存空间是直接存储的数组内容,那么它将没有足够的空间去容纳arr2的所有元素。
当使用两块空间存储时,这个问题就简单多了。我们就可以将arr1的引用变量指向arr2的数组对象,从而完成数组赋值。而arr1的内存空间由于无人引用会被垃圾回收,如下:
数组赋值.jpg-17.9kB
由此,可以看出,给数组变量赋值和给数组中元素赋值时两回事。给数组中元素赋值是改变数字内容,而给数组变量赋值则是让变量指向一个内存空间。
数组一旦初始化完成后,其内存空间就已经分配结束,无法改变其长度,但是可以修改元素的值。可是数组又是一种引用类型的变量,它只是指向了内存中的数组对象。我们可以通过改变其引用,从而营造出一种长度可变的假象。

数组使用

当定义了一个数组,为其赋值后就相当于定义了多个相同类型的变量。通过索引使用数组元素时,可将其作为普通变量使用。

  1. class Cat{
  2. double weight;
  3. int age;
  4. public Cat(double weight, int age){
  5. this.weight = weight;
  6. this.age = age;
  7. }
  8. }
  9. public class ArrayTest{
  10. public static void main(String[] args){
  11. //定义,并动态初始化int数组
  12. int[] pos = new int[5];
  13. //循环为每个数组元素赋值
  14. for(int i = 0; i < pos.length; i++){
  15. pos[i] = (i + 1)*2;
  16. }
  17. int a = pos[1]; //将数组元素的值赋值给int变量
  18. int b = 20;
  19. pos[2] = b; //将int变量的值赋值给数组元素
  20. //定义,并动态初始化一个Cat[]数组
  21. Cat[] cats = new Cat[2];
  22. cats[0] = new Cat(3.34, 2);
  23. //将cats数组的第一个元素赋值给c1
  24. Cat c1 = cat[0];
  25. Cat c2 = new Cat(4.3, 3);
  26. //将c2的值赋给cats数组的第2个元素
  27. cats[1] = c2;
  28. }
  29. }

上述代码中,相关的内存分配示意图:
数组使用.jpg-18.1kB

给变量赋予明确的值之后,变量可以被加载到CPU,CPU可以对这些值进行各种运算,运算后的结果又可以被赋值给变量,保存到内存中。那么数据可以进行哪些运算?又该如何进行数据运算呢?


参考资料:

  1. 老马说编程(微信号:laoma_shuo)——赋值
  2. 翻滚吧码农(微信号:fgbcxy)——Java 数组及其内存管理
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注