四.数组

数组就是主函数(main方法)中的参数:
public static void main(String[] args){
    
}
数组是指一组数据的集合,数组中的每个数据称为元素。在Java中,数组也是Java对象。数组中的元素可以是任意类型(包括基本类型和引用类型),但同一个数组里只能存放类型相同的元素。创建数组大致包括如下步骤:    
. 声明一个数组类型的引用变量,简称为数组变量;
. 用new语句构造数组的实例。new语句为数组分配内存,并且为数组中的每个元素赋予默认值;
. 初始化,即为数组的每个元素设置合适的初始值。

即:声明/创建/初始化赋值

一.数组声明

声明数组:
    1) 一个存放同一类型数据的集合
       a. 即可以是基本类型,也可以是对象类型;
       b. 数组中的每个数据为元素;
    2) 数组是一个对象,成员是数组长度和数组中的元素;
    3) 声明了一个数组变量并不是创建了一个对象;
    4) 声明数组的方式:

int[] IArray 或者 int IArray[]     基本数据类型数组,数组中存放的是基本数据类型。
       Teacher[] tArray 或者 Teacher tArray[]    类类型数组,数组中存放的是Teacher类创建的若干个的对象。

注意:1) 声明数组变量的时侯,不能指定数组的长度,以下声明方式是非法的。

int x[1];
             int[2] x;

二.初始化

初始化:自变量创建后首次赋值的过程;

1.创建数组对象

数组对象和其他Java对象一样,也用new语句创建;

int[] iArray = new int[2];

new int[2]语句执行以下步骤:

a. 在堆区中为数组分配内存空间,以上代码创建了一个包含2个元素的int数组
       b. 为数组中的每个元素赋予其数据类型的默认值。
          byte/short/int/long     0
          float            0.0f
          double                0.0d
          String                null
          char                     '\u0000'
          boolean                  false
       c. 返回数组对象的引用
       
       在用new语句创建数组对象时,需要指定数组长度。数组长度表示数组中包含的元素数目。数组长度可以用具体的数值表示,也可以用
       变量表示。如:
   
       int[] x = new int[10];
       或
       int size=10;
       int[] x = new int[size];

数组的长度可以为0,此时数组中一个元素也没有。例如:

int[] x = new int[0];

对于Java类的程序入口方法main(String args[]),如果运行时这个类没有输入参数,那么main()方法的参数args并不是null, 而是一个
       长度为0的数组。例如:

public class Sample {
           public static void main(String[] args) {
                System.out.println(args.length);           //打印0
           }
       }

数组对象创建后,它的长度是固定的。数组对象的长度是无法改变的,但是数组变量可以改变所引用的数组对象。

int[] x = new int[3];
       int[] y = x;
       x = new int[4];

2. 初始化数组对象

数组中的每个元素都有一个索引,或者称为下标。数组中的第一个元素的索引为0,第二个元素的索引为1, 依次类推。
       通过索引可以访问数组中的元素或者给数组中元素内容赋值。

1) 声明、创建、初始化分开:
      //声明
          int[] iArray;
          //创建
          iArray = new int[2];
      //初始化
          iArray[0] = 0;
          iArray[1] = 1;

2) 声明、创建的同时并初始化数组;

int[] iArray = {0, 1};
      int[] iArray = new int[]{0, 1};
          Student sArray[] = new Student[] { new Student(“George”, “Male”, 20), new Student()};
          Student[] stArray = { new Student(), new Student()} ;

注意:a.下面这些都是非法的数组初始化方式:
                   int[] x = new int[5]{5,4,3,2,1};           //编译出错,创建数组对象的同时并初始化的时候就不能指定数组长度了;
                   
                   int[] x;
                   x = {5,4,3,2,1};                           //{5,4,3,2,1}必须在声明数组变量的语句中使用,不能单独使用
 课堂练习:1) 求一组值的平均值:

public class ArrayAvgTest {
                      public double avg(int[] n) {
                           double result = 0.0;
                           for(int i=0;i<n.length;i++) {
                                  result += n[i];
                           }
                           result /= n.length;
                           
                           return result;
                      }

public static void main(String[] args) {
                           ArrayAvgTest a = new ArrayAvgTest();
                           int[] a = {100,60,80,90,75,38};
                           System.out.println("Avg score: " + a.avg(a));
                      }
                 }

3. 多维数组

Java支持多维数组。假定某个宾馆有三层楼,第一层有4个房间,第二层有3个房间,第三层有5个房间。某一天客户人住宿情况如
       下图所示:

第三层:           |    |Tom |Jerry|    |Rose|
       第二层:          |Mary|    |Kevin|
       第一层:          |Mike|Jane|Duke |    |

可以用两维数组来存储各个房间的客人信息。

String[][] room = new String[3][];
       room[0] = new Stirng[]{"Mike","Jane","Duke",null};
       room[1] = new String[]{"Mary",null,"kevin"};
       room[2] = new String[]{null,"Tom","Jerry",null,"Rose"}

以上代码等价于:

String[][] room = {
                {"Mike","Jane","Duke",null},
                            {"Mary",null,"kevin"},
                            {null,"Tom","Jerry",null,"Rose"}
             };

多维数组本质上是数组的数组,数组的元素内容还是数组;

写一个类MultiArray.java来创造一个二维数组并输出其中元素

4. 数组的边界

1) 一个数组的下标从0开始,数组通过数组的对象引用变量的下标访问数组。

数组中第一个元素的索引为0, 第二元素的索引为1,依次类推。如果一个数组长度是5,要访问最后一个数组元素可以通过
          下标4来访问,如果通过下标5访问,超出了数组的边界,在运行时会抛出ArrayIndexOutOfBoundsException。

2) 通过调用数组的length方法可以获得一个数组的元素个数(数组长度)。
       
          所有Java数组都有一个length属性,表示数组的长度. 该属性只能读取,但是不能修改。

以下修改数组的length属性,这是非法的。

int[] x = new int[4];
          x.length = 10;            //编译出错,length属性不能被修改。

注:a. 数组变量必须在指向一个数组对象之后,才能访问其元素。

b. 当数组的元素为引用类型时,数组中存放的是对象的引用,而不是对象本身;

2)  求一组值的最大值:

public class ArrayMaxTest {
                      public int max(int[] n) {
                           int result = n[0];
                           for(int i=1;i<n.length;i++) {
                                  if(result<n[i])
                                        result = n[i];
                           }
                          
                           return result;
                      }

public static void main(String[] args) {
                           ArrayMaxTest a = new ArrayMaxTest();
                           int[] n = {100,60,80,90,75,38};
                           System.out.println("Max score: " + a.max(n));
                      }
                 }

3) 数组内容排序

冒泡排序:值较小的数逐渐向数组的顶部(即朝第一个元素)冒上来,就像水中的气泡上升一样,同时,值较大的数据逐渐
                           向数组的底部(即朝最后一个元素)沉下去。这种算法用嵌套的循环对整个数组进行数次遍历,每次遍历都要比
                           较数组中相邻的一对元素,如果这对元素以升序(或者值相等)的顺序排列,那么保持它们的位置不变;如果这
                           对元素以降序的顺序排列,那么交换它们的值。

数组原内容:100,60,80,90,75,38

第一次循环:    60    80    90    75    38    100    
         第二次循环:    60    80    75    38    90    100    
         第三次循环:    60    75    38    80    90    100    
         第四次循环:    60    38    75    80    90    100    
         第五次循环:    38    60    75    80    90    100

public class ArraySortTest {

public void sort(int[] n) {
                for(int i=0;i<n.length-1;i++) {
                    for(int j=0;j<n.length-i-1;j++) {
                        if(n[j]>n[j+1]) {
                            int temp = n[j];
                            n[j] = n[j+1];
                            n[j+1] = temp;
                        }
                    }
                    print(n);
                }
            }
            
            public void print(int[] n) {
                for(int i=0;i<n.length;i++)
                    System.out.print(n[i] + "\t");
                System.out.println();
            }
            
            public static void main(String[] args) {
                ArraySortTest s = new ArraySortTest();
                int[] n = {100,60,80,90,75,38};
                s.sort(n);
                s.print(n);
            }
        }                 
        4)选择排序:
在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找
最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
Selection.java

5) java.util.Arrays辅助类的使用。sort(int[] n)以及

6)从众多手机号码中抽取一个获奖手机号码

public class ArrayRandomTest {
            public String getTel(String[] n) {
                int index = (int)(Math.random()*n.length);
                return n[index];
            }

public static void main(String[] args) {
                ArrayRandomTest a = new ArrayRandomTest();
                String[] n = { "1318259016", "13564560540","13858687810","13999999999"};
                System.out.println(a.getTel(n));
            }
        }

6)产生四位长度的验证码, 验证码内容为大小写字母或数字组成;

public class ArrayValidateCodeTest {

private char[] c;
            
            public ArrayValidateCodeTest() {
                String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                c = s.toCharArray();
            }
            
            public String getValidateCode() {
                int i1 = (int)(Math.random()*c.length);
                int i2 = (int)(Math.random()*c.length);
                int i3 = (int)(Math.random()*c.length);
                int i4 = (int)(Math.random()*c.length);
                
                return ""+c[i1]+c[i2]+c[i3]+c[i4];
            }
            
            public static void main(String[] args) {
                ArrayValidateCodeTest a = new ArrayValidateCodeTest();
                System.out.println(a.getValidateCode());
            }
        }

5. 数组的拷贝

数组的长度一旦确定之后便不能调整,我们可以通过复制数组的内容变通实现改变数组长度。在System类中提供一个辅助的
       arraycopy方法提供复制数组内容的功能:

public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)

参数1,需要被复制的目标数组
    参数2,从这个数组的那个一个位置开始复制
    参数3,需要把数据复制到的另外的那一个新的数组对象
    参数4,复制到新数组里面哪个位置(从这个位置开始算)
    参数5,复制的目标数组的长度

6.可变参数  (JDK1.5或以上)

之前的写法
    public void test(int[] a){
    
    }
    main:
        int[] i = {1,2,3,4};
        a.test(i);

可变参数写法
        public void test2(int... a){
    
    }
    main:
        int[] i = {1,2,3,4};
        test2(i);
        test2();
        test2(1,2,3,4);
        test2(1,2,3,4,5,6,7);
    
    可变参数前面可以加其他参数
    public static void test3(String msg,int... a){
        
    }
    main:
        int[] i = {1,2,3,4};
        String msg = "helo";
        test3(msg,i);
        test3(msg);
        test3(msg,1,2,3,4);
        test3(msg,1,2,3,4,5,6,7);

可变参数后面不能加任何参数 这样是编译不通过的
    public static void test4(int... a,String msg){
        
    }

Core Java(四)的更多相关文章

  1. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  2. Java四种线程池

    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...

  3. applet示例 WelcomeApplet.java <Core Java>

    import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Font; import java.awt.Grap ...

  4. Java四种引用包括强引用,软引用,弱引用,虚引用。

    Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...

  5. Core Java Volume I — 1.2. The Java "White Paper" Buzzwords

    1.2. The Java "White Paper" BuzzwordsThe authors of Java have written an influential White ...

  6. Core Java Volume I — 4.7. Packages

    4.7. PackagesJava allows you to group classes in a collection called a package. Packages are conveni ...

  7. Core Java Interview Question Answer

    This is a new series of sharing core Java interview question and answer on Finance domain and mostly ...

  8. Core Java 学习笔记——1.术语/环境配置/Eclipse汉化字体快捷键/API文档

    今天起开始学习Java,学习用书为Core Java.之前有过C的经验.准备把自己学习这一本书时的各种想法,不易理解的,重要的都记录下来.希望以后回顾起来能温故知新吧.也希望自己能够坚持把自己学习这本 ...

  9. Pascal、VB、C#、Java四种语法对照表

    因为工作原因,自学会了vb后陆续接触了其它语言,在工作中经常需要与各家使用不同语言公司的开发人员做程序对接,初期特别需要一个各种语法的对照比,翻看了网络上已有高人做了整理,自己在他基础上也整理了一下, ...

随机推荐

  1. 【Oracle】创建角色

    任务:创建角色 1)创建角色sse_role,授予create session 权限 2)创建角色tblo_role,授予CREATE PROCEDURE, CREATE SEQUENCE, CREA ...

  2. MySQL数据库的使用流程,代码解释+Hibernate连接数据库

    数据库的使用流程: 1.注册驱动: 2.用DriverManager.getConnection方法获得连接对象con: A方法:  3.用连接对象的createStatement()方法,获得可以执 ...

  3. -1.#IND000 &&图像类型转换

    (1):float acos(float x) 参数x的范围为-1.0f到1.0f之间,返回值范围在0.0f到3.141592653f之间,值得注意的是:当x超出[-1.0f,1.0f]这个范围时此函 ...

  4. DDoS攻击与防范策略

    DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大.最难防御的攻击之一. 按照发起的方式 ...

  5. Everything Be True FreeCodeCamp

    function every(collection, pre) { // Is everyone being true? for(var i in collection){ if(!collectio ...

  6. CSS 居中【整合】

    <center> text-align:center 在父容器里水平居中 inline 文字,或 inline 元素 vertical-align:middle 垂直居中 inline 文 ...

  7. 在 vue-test-utils 中 mock 全局对象

    vue-test-utils 提供了一种 mock 掉 Vue.prototype 的简单方式,不但对测试用例适用,也可以为所有测试设置默认的 mock. mocks 加载选项 mocks 加载选项 ...

  8. 题解 ZOJ3203 Light Bulb

    也就是loj上的#10016灯泡了... 先上原图: 因为长度肯定是个开口向下的二次函数,所以先是确定用三分来找位置,然后想办法求出当前阴影长度 看到这条斜线,就想到了一次函数,所以就建了一个系,没想 ...

  9. oracle(cast , to_char , to_date )用法

    cast : cast(要转换的值 AS 转换的类型) From To BINARY_FLOAT, BINARY_DOUBLE To CHAR, VARCHAR2 To NUMBER To DATET ...

  10. HDU 3849 By Recognizing These Guys, We Find Social Networks Useful

    By Recognizing These Guys, We Find Social Networks Useful Time Limit: 1000ms Memory Limit: 65536KB T ...