Array的初始化(8)

  Array的初始化
    array其实就是一组对象或者一组基本数据类型的数据,每一个array中的数据必须是同一种类型,并且以一个标示符封装在一起
    例如    int[] i;    或者  int i[];
    现在你这样声明一个array,但是array里面储存的其实是一组句柄,而非具体的数据对象,你必须要撰写初始化语句才能 让array变的有意义,初始化的方式同样有2种
      int i[] = new int[3];或者是int i[] = { 1,2,3 };
    需要注意的是第二种初始化方法,只能出现在array生成的时候。java允许你将某个array指派给另一个array,你所传递的其实只是句柄罢了,我们看个例子
    
public class arrays
    {
     public static void main(String args[])
     {
      int[] i = {1,2,3};
//声明一个数组,并且初始化
      int[] ii;
//只是声明一个数组
      ii = i;
//句柄的传递,并未把数组内的值传递,换句话说就是此时ii和i的句柄已经同时指向同一个内存地址
      for(int j = 0; j<ii.length; j++)
      {
       ii[j]++; //我们只改变ii的值
      }
      for(int j = 0; j<i.length; j++)
      {
       System.out.println(" i[ "+j+" ]= "+i[j]);
//显示i的值
      }
     }
    }
    我们回发现,i的值随着ii的改变而改变了,这个现象我们在赋值运算的时候已经讲过了。我们需要知道,任何一个array都有一个特性,通过他你可以知道array内的元素的个数,那就是length,因为java是从0开始检索数组的,也就是说该数组的最大索引值是length-1。如果你的索引值大于/小于实际容纳元素值,那么就会在程序的执行期得到数组越界例外,因为java会对数组进行边界检查,所以array的效率不是很高。如果你并不知道你所需要能能容纳多少元素的array,但是你却需要这么一个array,你可以采用new的方式来生成
    
 public class arrays
     {
      public static void main(String args[])
      {
       int i[] = new int[3];
       for(int j = 0; j<i.length; j++)
       {
        System.out.println(" i[ "+j+" ]= "+i[j]);
//显示3个0
       }
      }
     }
    基本类型的array会自动初始化为0(与基本数据类型的成员数据的初始化值是一样的),但是你要是产生对象数组的话,你就必须指定初始化值
     
public class arrays
     {
      public static  void go(Object[] o)
//可以接受未定类型和个数的数组
      {
       for(int i=0;i<o.length;i++)     
        System.out.println(o[i]);
      }
      public static void show()
      {
       String[] s = new String[3];
//声明可以容纳3个元素对象数组,但是他们其实是3个句柄组成的句柄数组,并没有指向任何具体的内存块
       s[0]="one";
//分别给每个句柄连接实际的对象,这才完成初始化动作,如果要是没有这一步,就会显示的是null
       s[1]="two";
       s[2]="three";
       for(int j = 0; j<s.length; j++)
       {
        System.out.println(" i[ "+j+" ]= "+s[j]);
       }
      }
      public static void main(String args[])
      {
       arrays.go(new Object[] {new String("a"),new String("b"),new String("c")});
       arrays.show();
      }
     }
     
还有一种方法
     public class arrays
     {
      public static void main(String args[])
      {
       String[] s = {"1","2","3"}; //因为数组的容量在编译期就确定了,所以用途很小
       for(int j = 0; j<s.length; j++)
       {
        System.out.println(" i[ "+j+" ]= "+s[j]);
       }
      }
     }
     多维数组
       
public class arrays
       {
        public static void main(String args[])
        {
         System.out.println("This is Mulitdimentsional Arrays Demo One");
         int[] [] ii={{1,2,3},{2,3,4}};
         for(int i=0; i<ii.length ;i++)
         {
          for(int j = 0; j< ii[i].length ; j++)
          {
           System.out.println(" i["+i+"] ["+j+"]="+ii[i] [j]);
          }
         }
         
         System.out.println("This is Mulitdimentsional Arrays Demo Two");
         int[] [] [] iii = new int[2] [3] [4];
         for(int i=0;i<iii.length;i++)
          for(int j=0;j<iii[i].length;j++)
           for(int k=0;k<iii[i] [j].length;k++)
            System.out.println(" i["+i+"]["+j+"]["+k+"] = "+iii[i] [j] [k]);
            
         System.out.println("This is Mulitdimentsional Arrays Demo Three"); 
         Integer[] [] II= new Integer[2] [];
         for(int i=0;i<II.length;i++)
         {
          II[i]=new Integer[5];
          for(int j=0;j<II[i].length;j++)
          {
           II[i][j]=new Integer(4);
           System.out.println(" i["+i+"] ["+j+"]="+II[i] [j]);
          }
         }
        }
       }
       注意:多维数组中的每一组中括号代表arrays的层次,中括号从左到右分别代表大括号的从外到内
   习题解答:
      因为有的题目比较简单,实在是没有讲解的意义,我会把稍微有点难度的题目拿出来解答,但是也许大家的程度不一样,有的题目人家不觉得容易的你却觉得很容易,如果是这样的话,谁有问题可以从qq上或mail上告诉我,我会把答案给你写出来
      12、撰写具有finalize()的class,并且保证他一定会被调用
       
class test
       {
        protected  void finalize()
        {
         System.out.println(" finalize() running......");
        }
        public static void main(String args[])
        {
         new test();
//注意这里为什么写成new test(),而不写成test t = new test();原因就是这样写更容易引起垃圾回收器的注意
         System.gc();
        }
       }
       使用System.gc();可能会让你的finalize()调用,记住我们只是说可能,System.gc();只是一个请求,但是至于是否执行,不得而知。大家一定要记住,无论是垃圾回收还是终结动作,都不一定保证会发生,如果jvm没有面临资源紧张的情况,那么,他就不会去执行清理动作,以节省系统开支
       Basically, there’s no way to ensure that finalize( ) will be called.
      
      13、撰写一个名叫tank的类,此类的状态是满的或者是空的,他的死亡条件是,对象在清理的时候必须是空的,请撰写finalize()函数,来判断其死亡条件是否成立,并且
      在main 中检测几种可能发生的情况
      
 class Tank
       {
         static int counter = 0;
         int id = counter++;
         boolean full = false;
         public Tank()
         {
           System.out.println("Tank " + id + " created");
           full = true;
         }
         public void empty()
         {
           full = false;
         }
         protected void finalize()
         {
           if(full)
             System.out.println( "Error: tank " + id +" must be empty at cleanup");
           else
             System.out.println( "Tank " + id + " cleaned up OK");
         }
       }
       class tankTest
       {
        public static void main(String args[])
        {
          new Tank();
          new Tank().empty();
         System.gc();
        }
       }
      16、撰写一个类,其中有2个string数据,一个在构造函数初始化,一个在定义处初始化,这2中方法有什么区别
      
 class test
       {
        String s1="hello!";
        String s2;
        public test(String s)
        {
         s2=s;
        }
        public static void main(String args[])
        {
         test t =new test("goodbye");
         System.out.println(t.s1);
//static的函数只可以调用static的数据和函数,但是对象.数据的方式除外
         System.out.println(t.s2);
        }
       }
       s1的初始化动作是在构造函数调用之前就完成的~,而与此同时s2也被初始化,但是他被初始化成null,以后s2可以根据传递给构造函数的值的变化而变化,
       更具有柔韧性。
      18、撰写一个class,有一个string 数据,使用实体初始化的方式,并且说出与本书不同的用途
       
 class test
        {
         String s;
         {
          s="hello!";  //注意不要写成 String s="hello",否则就成局部变量了!
          System.out.println("Instance before constructor ");
         }
         test()
         {
          System.out.println(s+"from test()");
         }
         public static void main(String args[])
         {
          test t=new test();
         }
        }
        书上的说的用途是,这种用法在匿名内部类(现在还没学到)中是必须用到,因为构造函数需要有个函数名,但是匿名内部类是没有名字的 ,于是我们需要用这种方法来初始化数据!我们再来说个用途:在一般的class中,实体初始化方式是在构造函数调用之前调用的,那么既然这样,这个程序会先显示Instance before constructor再显示hello! from test(),足以说明问题。
      20、撰写一个函数,能够产生三维数组并且初始化,数组的容量由函数的引数决定,array的初始值必须是在函数因数所指定的范围内,再撰写一个函数,
        可以打印出数组。在main函数中需要能够产生不同容量的数组
      
  class test
        {
         
//接受引数的函数,x、y、z分别代表数组中的元素,d1、d2代表数组的范围,并且该函数可以返回一个数组
         public static double[][][] createArray(int x , int y , int z ,double d1,double d2)
         {
          double[][][] darray = new double[x][y][z];
//定义一个数组,未初始化
          double incr = (d1-d2)/(x * y * z); //计算每个数组值的增量,因为咱们数组的值要在d1-d2的范围中
          double value=d2;
//数组中每一个元素的值,并且让他初始值等于传递引数的最小值
          for( int i =0 ; i<darray.length ; i++)  //初始化数组
           for( int j =0 ; j < darray[i].length ; j++)
             for( int k =0 ; k < darray[i][j].length ; k++)
             {
              darray[i][j][k]=value; 
//给每个元素指派值
              value=incr+value; 
//重新类加值,用于下次运算
             }
          return darray; 
//返回一个数组
         }
         public static void showArray(double[][][] darray)  
//显示数组的函数
         {
          for( int i =0; i<darray.length ; i++)
          {
           for( int j=0; j<darray[i].length; j++)
           {
            for( int k =0; k<darray[i][j].length ;k++)
             System.out.println("darray["+i+"]["+j+"]["+j+"] = "+darray[i][j][k]);
           }
           System.out.println("*****************");
//打印分割符
          }
         }
         public static void main(String args[])
         {
          double[][][] test =createArray(2,3,4,11.0,2.0);
          showArray(test);
         }
        }
 好了以上就是第四章所有的内容,知识点的东西很少,基本上全是需要理解的东西,看不懂的地方多看几便就好了~,我开始的时候看了3遍才明白呢~呵呵~驽钝
<think>嗯,用户问的是如何在编程中初始化二维数组array。首先,我需要回忆不同编程语言的初始化方法,因为不同语言可能有不同的语法。根据用户提供的引用内容,引用了Java、C++和Python的例子,所以可能需要涵盖这些语言。 首先,用户提供的引用[1]和[2]提到了Java的静态初始化和动态初始化。静态初始化是用大括号直接赋值,比如int[][] array = {{1,2}, {3,4}};而动态初始化则是先指定行和列,再逐个赋值。引用[3]提到了C++的二维字符数组,可以用来存放字符串,每行一个字符串。引用[4]的例子是关于合并两个二维数组,可能涉及到动态操作。 接下来,我需要整理这些信息,分语言说明如何初始化二维数组。用户可能希望得到具体的代码示例,所以应该给出Java、C++、Python的例子。比如Java的静态和动态初始化,C++的类似方法,以及Python中使用列表嵌套的方式。 还要注意用户提到的系统级指令,比如行内数学公式用$...$,独立公式用$$...$$,但这个问题可能不需要数学公式。但需要确保回答结构清晰,分步骤说明,并且生成相关问题。 用户可能的实际需求是学习不同语言中的二维数组初始化方法,或者解决某个特定问题。需要确保回答覆盖主要语言,并提供足够的示例代码,如静态初始化、动态初始化,以及可能的不同数据类型的处理,比如字符数组。 同时,要检查引用是否正确。引用[1]和[2]都是关于Java的,引用[3]是C++,引用[4]可能用于说明应用场景。在回答中引用这些内容,比如在Java部分提到静态初始化和动态初始化时,添加引用标记[^1][^2],在C++部分提到字符串数组时引用[^3]。 最后,生成相关问题需要考虑用户可能进一步的问题,比如不同语言的差异、动态初始化的注意事项、应用场景等。例如,如何动态初始化不规则二维数组,或者不同语言初始化的区别。 总结步骤: 1. 分语言说明初始化方法,给出示例代码。 2. 引用对应的参考资料。 3. 确保回答结构清晰,符合用户要求的格式。 4. 生成相关问题,涵盖可能的方向。</think>在编程中初始化二维数组可以通过多种方式实现,具体方法取决于编程语言和需求。以下是常见语言的实现方法: ### 一、Java中的二维数组初始化 1. **静态初始化** 直接在大括号中指定元素值,系统自动推导数组维度: ```java // 标准写法 int[][] array1 = {{1,2}, {3,4}, {5,6}}; // 3行2列[^1] // 不规则二维数组 String[][] array2 = {{"A","B"}, {}, {"C"}}; // 第二行为空数组[^2] ``` 2. **动态初始化** 先声明维度再赋值,适合元素值后续确定的情况: ```java // 固定行和列 int[][] array3 = new int[3][2]; array3[0][0] = 1; // 逐个赋值 // 仅声明行数,列数动态分配 int[][] array4 = new int[3][]; array4[0] = new int[]{2,5}; // 第一行2列 ``` ### 二、C/C++中的二维数组初始化 ```cpp // 静态初始化 int array5[3][2] = {{1,2}, {3,4}, {5,6}}; // 必须指定行列数 // 字符数组初始化 char cities[][10] = {"Beijing", "Shanghai"}; // 每行最多存9字符+结束符 ``` ### 三、Python中的二维数组初始化 ```python # 列表嵌套实现 array6 = [[1,2], [3,4], [5,6]] # 直接赋值 # 动态生成3x2零矩阵 array7 = [[0 for _ in range(2)] for _ in range(3)] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值