3,6 Массив понимают

Во-первых, массив памяти

  Ссылка на массив переменная просто ссылка, ссылка переменный может указывать на любую действительную память, только тогда, когда исходная точка для действительных элементов массива памяти может быть доступна через переменный массив.

Реальный объект сохраняется в массиве (кучи) памяти стека, если ссылка на массив в массив ссылку на объект переменной является локальной переменной, то оно сохраняется в памяти стека (стек). Схематический вид массива, хранящегося в памяти:

  Если вам нужно к элементам массива доступа, как показано в динамической памяти, программа может быть достигнута только через р [индекс] форму. Это ссылка на массив переменной является основным способом доступа к элементам массива стек памяти.

Heap памяти и памяти стека:

Heap (куча) память: выделение постоянной, большая области памяти, когда виртуальная машина Java началась. Только куча памяти.

Стек (Стек) Память: выделение временной, небольшая области памяти каждого метода времени выполнения. Каждый из этих методов имеет свою область стека, когда конец процесса, для области стека будут уничтожены.

  Когда выполнение метода, каждый метод будет устанавливать свой собственный стек памяти, переменные определенно в пределах этого метода один за другим в память стеки, с окончанием реализации методы, этот метод будет также уничтожить стек памяти , Соответственно, все локальные переменные , определенные в методе находятся в памяти стеки, применение при создании объекта, объект будет сохранен в области данных для выполнения повторного использования (поскольку стоимость создания большого объекта) эта область данных во время выполнения является памятью кучи . Объекты динамической памяти не исчезают с окончанием методы, даже после того, как в конце методы, объект также может быть ссылкой на другие дополнительный переменные ссылки (очень распространены в проходящем методе параметра), то объект еще не разрушен , Только тогда , когда объект не является ни одна переменная ссылается на нее, система сборщик мусора будет вернуть его в нужное время.

   Если куча памяти массив не есть какие - либо ссылки на переменные , указывающие на себя, то массив будет мусор, массив будет занимаемый системой восстановления памяти сборщика мусора. Поэтому, для того , чтобы позволить сборщику мусора освободить пространство памяти , занимаемый массивом, массив может быть присвоен пу равно нулю, то отсоединять ссылки на массив привел отношения между переменными и фактическим массив, фактический массив будет мусор.

  Пока типы совместимы, он может сделать реальный массив точек переменной в другой массив, который будет создавать иллюзию массива переменной длины. 

. 1  класс в ArrayTest 
 2  {
 . 3      общественных  статических  недействительными основных (String [] арг) 
 . 4      {
 . 5          // статические методы , определенные в массиве 
6.          Int [] = А {л, 3,5 };
 . 7          // динамический массив определения инициализации 
. 8          вар B = новый новый  INT [. 4 ];
 . 9          
10          System.out.println ( "длина массива Ь:" + к b.length);
 . 11          // цикл выходного массива A, B 
12          для ( INT I: а)
 13          {
 14              системы. out.print ( "" +I);
 15          }
 16          из System.out.print ( "\ n-" );
 . 17          для ( INT I = 0; я <к b.length; I ++ )
 18          {
 . 19              из System.out.print ( "" + B [I] , );
 20              ПЧ (I == - к b.length 1. )
 21                  из System.out.print ( "\ n-" );
 22          }
 23          // , так как, Ь INT [] ссылочный тип, можно сделать точку Ь ссылки на массивы указывают 
24          Ь = а;
 25          System.out.println ( «точки ссылочная переменная на массив точки А в точку б длины массива:» + к b.length);
 26      }
 27  }
28 ---------- запустить Java (окно захвата) ----------
 29 длина массива Ь: 4
 30    . 1. 3. 5
 31    0 0 0 0
 32 точки к точке массива после точки отсчета длины переменного массива б: 3
 33  
34 завершение вывода (Обработанное 0 секунд) - нормальное завершение

 После того, как переменные и типы переменных, которые ссылаются первый массив, на этот раз в исходные элементы массива в динамической памяти потерянных ссылок, в мусоре, ожидая сборщика мусора, чтобы вернуть его.

Во-вторых, основные типы инициализации массива

  Для базовых типов массива, значение непосредственно хранится в элементе массива элемента массива, и, следовательно, при инициализации массива, чтобы выделить пространство памяти для массива и элемент массива непосредственно в соответствующие элементы массива.

класс PrimitiveArrayTest
{
    общественности  статической  недействительным основной (String [] арг)
    {
        // определение типа INT [] массив переменной 
        Int [] Массив;
         // . Динамический массив инициализации, длина массива 5 
        Array = новый новый  INT [5. ];
         // циклическим образом , чтобы каждый элемент массива заданий 
        для (VAR = I 0, I <быть array.length; I ++ )
        {
            массив [I] = I + 10 ;
        }
        // Регулирующее массив 
        для ( INT I: Array)
        {
            System.out.println (я);
        }
    }
}
---------- Запуск Java (захват окна) ----------
10
11
12
13
14

Завершение вывода (занимает 1 секунду) - нормальное завершение

 Исполнение INT [] массив, на этот раз выделение памяти стека и память кучи (виртуальная машина Java начинается, когда существует), определяет ссылку нулевой, то ссылочная переменная не указывает на какой-либо действительной памяти, он не может знать массив длина

 Массив = новый INT [5], инициализация динамическая, система будет по умолчанию значения инициализации для массива пространства для хранения памяти, выделенное и назначенное: 0 присваиваются все элементы массива.

        для (вар я = 0; I <Array.length; я ++ )
        {
            array[i]=i+10;
        }
循环为数组赋值

三、引用类型的初始化

基本类型的赋值:直接将该值存入变量的内存中。

引用类型的赋值:将该引用对象的第一个内存单元的编号(首地址)存入变量。

引用类型数组的数组元素时引用,因此情况更加复杂。每个数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了有效数据。

定义一个Person类

 1 class Person 
 2 {
 3     public int age;
 4     public double height;
 5     //定义一个方法
 6     public void info()
 7     {
 8         System.out.println("年龄:"+age+",身高:"+height);
 9     }
10 }

 下面程序定义一个Person[]数组,接着初始化这个Person[]数组,并为这个数组的每个元素指定值。

 1 public class ReferenceArrayTest
 2 {
 3     public static void mian(Srting[] args)
 4     {
 5         //定义一个sudentd数组,类型Person[]
 6         Person[] students;
 7         //执行初始化
 8         students=new Person[2];
 9 
10         //创建两个Person实例
11         var zhang=new Person();
12         zhang.age=15;
13         zhang.height=158;
14 
15         var lee=new Person();
16         lee.age=16;
17         lee.height=168;
18 
19         students[0]=zhang;
20         students[1]=lee;
21 
22         //下面代码的执行结果完全一样
23         lee.info();
24         students[0].info();
25     }
26 }

 执行Person[] students;代码时,这行代码仅仅在栈内存中定义了一个引用变量,也就是一个指针,这个指针并未指向任何有效内存区。

执行动态初始化,默认由系统指定初始值null。

 students=new Person[2];

 然后代码定义了zhang和lee两个Person实例,实际上分配了四个内存,在栈内存储zhang和lee两个引用变量,还在堆内存储两个Person实例,如下所示:

  students[0]=zhang;
  students[1]=lee;

  从图可以看出zhang和students[0]同时指向一个内存区,且都为引用变量,因此通过zhang和students[0]来访问Person实例的方法和变量效果是一样的,无论修改students[0]指向的实例还是zhang指向的实例,所修改的其实是一个内存区。

四、没有多维数组

  java语言的数组类型还是引用类型,这个引用指向真实的数组内存。数组元素的类型也可以是引用,如果数组元素的引用再次指向真实的数组内存,这种情况看上去就很像多维数组。

  定义一个变量的用法:type varName,type是变量类型。如果定义一个引用变量的数组类型,只需要将这个type具体成int[]。

  二维数组的定义:

type[][] arrayName;

 

从采用上面的语法格式来定义二维数组,但它的实质还是一维数组,只是数组元素还是引用,数组元素里保存的引用指向一位数组。

对二维数组的初始化,同样可以将数组看成以为数组初始化,把这个“二维数组”当成一一维数组,其元素类型是type[]类型,可以采用以下语法进行初始化

arrayName=new type[length][]

 

上面的语法相当于初始化一个一维数组,这个一维数组的长度为length,同样这个一维数组的数组元素是引用类型(数组类型),所以系统为每个元素分配的初始值为null。这个二维数组完全可以当成一维数组:使用new type[length]相当于定义了length个type类型变量;类似的,使用new type[length][]初始化这个数组后,相当于定义了length个type[]类型的变量,当然这个type[]类型的变量都是数组类型,因此需要再一次进行初始化。

 1 class 二维数组
 2 {
 3     public static void main(String[] args)
 4     {
 5         //定义一个二维数组
 6         int[][] a;
 7         //把a当成一维数组进行初始化,初始化a为一个长度为4的数组
 8         //a数组的数组元素有是引用类型
 9         a=new int[4][];
10         //把a当成一维数组,遍历a数组的每个元素
11         for(int i=0;i<a.length;i++)
12         {
13             System.out.println(a[i]);
14         }
15         //初始化a数组的第一个元素
16         a[0]=new int[2];
17         a[0][0]=1;
18         a[0][1]=2;
19 
20         //遍历二维数组a的第一个元素
21         for(int i=0;i<a[0].length;i++)
22         {
23             System.out.println(a[0][i]);
24         }
25     }
26 }

 

[][] a;这一行代码,将在栈里定义一个引用变量,这个变量并未指向任何有效的内存空间,此时堆内存还未为这行代码分配任何存储区。
a=new int[4][];程序对数组进行初始化,这行代码让a变量指向一块长度为4的内存空间,这个长度为4的数组里每个数组元素都是引用类型(数组类型),系统为这些数组元素分配初始值:null。此时数组a在内存中存储的示意图:

 

 

 a[0]=new int[2];
 a[0][0]=1;
 a[0][1]=2;

对一个数组原素a[0]进行初始化

 

 初始化多维数组时,可以只指定左边维的大小;当然也可以一次指定每一维的大小。

1 int[][] b=new int[3[4];

 

上面的代码定义一个b数组变量,这个变量指向一个长度为3的数组,这个数组的每个元素又是一个数组类型,他们各自指向长度为4的int[]数组,每个数组的元素为0。示意图为:

 

还可以使用静态初始化方式来初始化二维数组,使用静态初始化方式来初始化二维数组,二维数组的每个数组元素都是一维数组,因此必须指定多个一维数组作为二维数组的初始值。代码如下:

//使用静态初始化方法来初始化一个二维数组
String[][] str1=new String[][]{new String[3],new String[]{"hello"}}

 

 结论:二维数组是一维数组,其数组元素是一维数组;三维数组其数组元素是二维数组。

 

рекомендация

отwww.cnblogs.com/weststar/p/12314117.html
рекомендация