五、 java中数组
定义数组的两种方式
class myarray1 {
    public static void main(String[] args) {
        //1.如何定义一个数组
        //1.1数组的声明
        String[] names;
        int scores[];
        //1.2初始化
        //第一种:静态初始化:初始化数组与给数组元素赋值同时进行。
        names = new String[]{"jeff","frank","xixi"};
        //第二种:动态初始化:初始化数组与给数组元素赋值分开进行。
        scores = new int[4];
        //2.如何调用相应的数组元素:通过数组元素的下角标的方式来调用。
        //下角标从0开始,到n -1 结束。其中n表示的数组的长度。
        scores[0] = 87;
        scores[1] = 89;
        scores[3] = 98;
        //3.数组的长度:通过数组的length属性。
        System.out.println(names.length);//
        System.out.println(scores.length);//4
        //4.如何遍历数组元素
//        System.out.println(names[0]);
//        System.out.println(names[1]);
//        System.out.println(names[2]);
        for(int i = 0;i < names.length;i++){
            System.out.println(scores[i]);
            System.out.println(names[i]);
        }
    }
}
运行结果
3
4
87
jeff
89
frank
0//未赋值为0
xixi
未赋值的数组结果会打印什么
public class weifuzhi {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //对于基于基本数据类型的变量创建的数组:byte short int long float double char boolean
        //1.对于byte short int long 而言:创建数组以后,默认值为0
                int[] scores = new int[4];
                scores[0] = 89;
                scores[3] = 90;
                for(int i = 0;i < scores.length;i++){
                    System.out.println(scores[i]);
                }
                byte[] scores1 = new byte[4];
                scores1[0] = 89;
                scores1[3] = 90;
                for(int i = 0;i < scores1.length;i++){
                    System.out.println(scores1[i]);
                }
    }
}
运行结果:
89
0
0
90
89
0
0
90
public class weifuzhi {
    public static void main(String[] args) {
                //2.对于float  double而言:默认值是0.0
                float[] f = new float[3];
                f[0] = 1.3f;
                for(int i = 0;i < f.length;i++){
                    System.out.println(f[i]);
                }
                System.out.println();
    }
}
运行结果:
1.3
0.0
0.0
public class weifuzhi {
    public static void main(String[] args) {
                //3.对于char而言:默认为空格
                char[] c = new char[3];
                c[0] = 'a';
                for(int i = 0;i < c.length;i++){
                    System.out.println(c[i]);
                }
                System.out.println();
    }
}
运行结果:
a
public class weifuzhi {
    public static void main(String[] args) {
                //4.对于boolean而言:默认为false
                boolean[] b = new boolean[3];
                for(int i = 0;i < b.length;i++){
                    System.out.println(b[i]);
                }
    }
}
运行结果:
false
false
false
public class weifuzhi {
    public static void main(String[] args) {
                //5.对于引用类型的变量构成的数组而言:默认初始化值为null。以String为例
                String[] strs = new String[3];
                strs[0] = "aa";
                strs[1] = "bb";
                //遍历数组的元素
                for(int i = 0;i < strs.length;i++){
                    System.out.println(strs[i]);
                }
                System.out.println();
    }
}
运行结果:
aa
bb
null
那么,数组未定义和已定义在内存中是如何表现的呢。

借一张图,上图为内存结构的抽象图,在栈中存放局部变量和堆中变量实际引用的值的内存地址。堆中存放new开辟的内存空间及空间存放的值。
数组的生成

比如现在我们定义一个int[] scores = new int[4],这里做了两步操作,先在栈中生成局部变量scores,再在堆中开辟一块4个int大小的内存空间,在栈中将定义变量scores指向开辟的内存的起始地址。int类型开辟内存默认值为0。接下来要将我们动态赋值的数值放入指定的堆空间中,未赋值部分就是默认值。
静态初始化的操作步骤与上述基本一致,也是有默认开辟相应类型默认值的步骤,然后将后面的赋值部分存入堆的内存空间。
当我们之前定义的数组长度不够用了该怎么办。
public class short_array {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] i = new int[]{12, 13, 14};
        int[] j = new int[10];
        for(int k = 0; k<i.length; k++){
            j[k] = i[k];
        }
        j[3] = 15;
        j[4] = 16;
        for(int k = 0;k < j.length;k++){
            System.out.println(j[k]);
    }
}
}
运行结果:
12
13
14
15
16
0
0
0
0
0
例题:1.(1)定义类Pritimive,在类中定义一个有3个元素的boolean类型的数组t作为其成员变量。数组元素未赋值。
  定义类TestPritimive,在TestPritimive的main()方法中创建Pritimive对象d,输出其成员变量t的三个元素值。
     (2)给对象d的成员变量t赋值为{true,true,true},并输出t的三个元素值。
public class array_class {
    public static void main(String[] args) {
        //创建Pritimive的对象d
        Pritimive d = new Pritimive();
        //遍历d的数组元素
        for(int i = 0;i < d.t.length;i++){
            System.out.println(d.t[i]);
        }
        //给d的数组元素重新赋值
        d.t[0] = true;
        d.t[1] = true;
        d.t[2] = true;
        for(int i = 0;i < d.t.length;i++){
            System.out.println(d.t[i]);
        }
    }
}
class Pritimive{
    boolean[] t = new boolean[3];
}
运行结果
false
false
false
true
true
true
从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
  {成绩>=最高分-10 等级为’A’ 
	  成绩>=最高分-20    等级为’B’
	  成绩>=最高分-30    等级为’C’   
	  其余                            等级为’D’}
import java.util.Scanner;
public class students_scores { public static void main(String[] args) {
// 创建scanner对象,键入学生个数
Scanner s = new Scanner(System.in);
System.out.println("student人数");
int count = s.nextInt();//count用来计数
//根据键入人数创建数组
int[] scores = new int[count];
int maxScore = scores[0];
//一次键入学生成绩,赋给相应数组元素,并获取最高分
System.out.println("请输入第" + count + "个成绩:");
for(int i=0; i<scores.length;i++){
int score = s.nextInt();
scores[i] = score;
if(scores[i]>maxScore){
maxScore = scores[i];
}
}
//遍历学生成绩的数组,并根据学生成绩与最高分的差值,赋予相应的等级,并输出
System.out.println("最高分为:" + maxScore);
for(int i = 0;i < scores.length;i++){
char level;
if(scores[i] >= maxScore - 10){
level = 'A';
}else if(scores[i] >= maxScore - 20){
level = 'B';
}else if(scores[i] >= maxScore - 30){
level = 'C';
}else{
level = 'D';
} System.out.println("student " + i + " score is " + scores[i] + " grade is " + level); } }
}
二维数组
初始化
public class array2 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //定义一个二维数组
        int[][] scores;
        //二维数组初始化
        //静态初始化
        scores= new int[][]{{1,2},{2,8},{6,6,6,6}};
        String[][] names;
        //动态初始化1
        names = new String[3][2];
        //动态初始化2
        names = new String[3][];
        names[0] = new String[2];
        names[1] = new String[1];
        names[2] = new String[3];
    }
}
赋值操作
public class array2 {
    public static void main(String[] args) {
        //引用具体的某一个元素
        int[][] fuzhi = new int[3][2];
        fuzhi[0][1] = 12;
        fuzhi[2][1] = 33;
    }
}
二维数组的长度
public class array2 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //定义一个二维数组
        int[][] scores;
        //二维数组初始化
        //静态初始化
        scores= new int[][]{{1,2},{2,8},{6,6,6,6}};
        String[][] names;
        //动态初始化1
        names = new String[3][2];
        //动态初始化2
        names = new String[3][];
        names[0] = new String[2];
        names[1] = new String[1];
        names[2] = new String[3];
        //引用具体的某一个元素
        int[][] fuzhi = new int[3][2];
        fuzhi[0][1] = 12;
        fuzhi[2][1] = 33;
        //二维数组的长度:length属性
        System.out.println(fuzhi.length);//3
        //二维数组中元素的长度
        System.out.println(fuzhi[0].length);//
        System.out.println(names.length);//3
        System.out.println(names[2].length);//3
        System.out.println();
    }
}
遍历二维数组
public class array2 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //定义一个二维数组
        int[][] scores;
        //二维数组初始化
        //静态初始化
        scores= new int[][]{{1,2},{2,8},{6,6,6,6}};
        //for循环遍历数组
        for(int m = 0;m < scores.length;m++){//控制行数
            for(int n = 0;n < scores[m].length;n++){
                System.out.print(scores[m][n] + "  ");
            }
            System.out.println();
        }
    }
}
二维数组的内存结构

二维数组的存储与一维数组并没有什么区别,只是在第一层的数组中存的是下一层数组的内存地址,真实存储数据的是在第二层数组中。
public class TestException {
    public static void main(String[] args) {
        //1.数组下标越界的异常:java.lang.ArrayIndexOutOfBoundsException
        int[] i = new int[10];
//        i[0] = 90;
//        i[10] = 99;
//        for(int m = 0;m <= i.length;m++){
//            System.out.println(i[m]);
//        }
        //2.空指针的异常:NullPointerException
        //第一种:
//        boolean[] b = new boolean[3];
//        b = null;
//        System.out.println(b[0]);
        //第二种:
//        String[] str = new String[4];
//        //str[3] = new String("AA");//str[3] = "AA";
//        System.out.println(str[3].toString());
        //第三种:
        int[][] j = new int[3][];
        j[2][0] = 12;
    }
}
数组常见异常
声明:int[] x,y[]以下能允许通过编译的是:
首先分析,一维数组的定义方式为:int[]x或int x[]。
二维数组的定义方式为int[][] y 或int[] y[] 或 int y[][]。
本题定义的为int[] x与,int[] y[]。所以x是一维数组,y是二维数组。
public class yanghui {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //每层的个数
        int[][] yanghui = new int[10][];
        for(int i =0;i<yanghui.length;i++){
            yanghui[i] = new int[i+1];
        }
        for(int i = 0;i<yanghui.length;i++){
            for(int j = 0;j<yanghui[i].length;j++){
                yanghui[i][0] = yanghui[i][i] = 1;
                if(i>1 && j>0 && j<i){
                    yanghui[i][j] = yanghui[i-1][j]+yanghui[i-1][j-1];
                }
            }
        }
        //遍历二维数组
        for(int i = 0;i < yanghui.length;i++){
            for(int j = 0;j < yanghui[i].length;j++){
                System.out.print(yanghui[i][j] + "\t");
            }
            System.out.println();
        }
    }
}
杨辉三角
java中的数组array1=array2,array2的栈存入array1的内存地址。
所以数组的复制不能这样操作
int[] arr1 = new int[arr.length];
for (int i = 0; i < arr1.length; i++) {
arr1[i] = arr[i];
}
排序部分
public class array_sort {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] array1 = new int[]{-2, 4, 32, 44, 0, 10, -5};
    for(int i = 1;i<array1.length; i++){
        for(int j=0;j<array1.length-i;j++){
            if(array1[j]>array1[j+1]){
                int temp = array1[j+1];
                array1[j+1] = array1[j];
                array1[j] = temp;
            }
        }
    }
    for(int m=0;m<array1.length; m++){
        System.out.print(array1[m]+"\t");
    }
    System.out.println();
    }
}
冒泡排序
public class array_sort1 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //直接选择排序
        int[] array1 = new int[]{-2, 4, 32, 44, 0, 10, -5};
        for(int i = 0;i<array1.length; i++){
            for(int j=i;j<array1.length;j++){
//                int array_min=array1[i];
                if(array1[i]>array1[j]){
                    int temp = array1[j];
                    array1[j] = array1[i];
                    array1[i] = temp;
                }
            }
        }
        for(int m=0;m<array1.length; m++){
            System.out.print(array1[m]+"\t");
        }
        System.out.println();
        }
    }
直接选择排序
//使用直接选择排序使数组元素从小到大排列
for(int i = 0; i < arr.length - 1; i++){
int t = i;//默认i处是最小的
for(int j = i;j < arr.length;j++){
//一旦在i后发现存在比其小的元素,就记录那个元素的下角标
if(arr[t] > arr[j]){
t = j;
}
}
if(t != i){
int temp = arr[t];
arr[t] = arr[i];
arr[i] = temp;
}
}
直接选择排序优化版
附:
System.arraycopy的使用方法(使用它可以快速得到一个pop(某索引值)的新数组),java中没有pop()所以使用它可以快速的实现pop方法。
int[] a = new int[]{123, 31, 656, 12, 43, 5};
int[] b = new int[5];
System.arraycopy(a, 0, b, 0, 1);// [123, 0, 0, 0, 0]
System.arraycopy(a, 0, b, 0, 2);// [123, 31, 0, 0, 0]
System.arraycopy(a, 2, b, 1, 4);// [123,656,12,43, 5],前面已经修改了这个数组所以第一位不是0是,123了
System.out.println(Arrays.toString(b));
System.arraycopy的Demo
五、 java中数组的更多相关文章
- java中数组的相关知识
		
1. 2.数组的命名方法 1)int[]ages=new int[5]; 2) int[]ages; ages=new int[5]; 3)int[]ags={1,2,3,4,5}; 4)int[ ...
 - Java中数组的特性
		
转载:http://blog.csdn.net/zhangjg_blog/article/details/16116613 数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具 ...
 - 在java 中,数组与 List<T> 类型的相互转换
		
在java中,数组与List<T> 之前进行互相转换,转换方法可总结为以下几种: 一. 将 数组转换成List<T> 1. 使用 Collections 的addAll 方法 ...
 - Java中数组的初始化方式
		
Java中数组的初始化方式 初始化方式有两种: 1.静态初始化:初始化时由程序猿显式指定每一个数组元素的初始值,由系统指定数组长度 2.动态初始化:初始化时由程序猿仅仅指定数组长度,由系统为数组 ...
 - java中数组复制的两种方式
		
在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...
 - Java中数组的插入,删除,扩张
		
Java中数组是不可变的,但是可以通过本地的arraycop来进行数组的插入,删除,扩张.实际上数组是没变的,只是把原来的数组拷贝到了另一个数组,看起来像是改变了. 语法: System.arrayc ...
 - java中数组、集合、字符串之间的转换,以及用加强for循环遍历
		
java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...
 - Java 中数组的内存分配
		
Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...
 - 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)
		
方法一:使用Arrays.asList()方法 1 2 String[] asset = {"equity", "stocks", "gold&q ...
 - 【Java面试题】18 java中数组有没有length()方法?string没有lenght()方法?下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
		
数组没有length()这个方法,有length的属性.String有有length()这个方法. int a[]; a.length;//返回a的长度 String s; s.length();// ...
 
随机推荐
- C++实现Singleton模式(effective c++ 04)
			
阅读effective c++ 04 (31页) 提到的singleton设计模式.了解一下. 定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享. 应用场景: 比 ...
 - SSH框架面试总结----1
			
1:struts2的工作流程 1)客户端浏览器发出HTTP请求. 2)根据web.xml配置,HTTP请求会被FilterDispatcher接收. 3)根据struts.xml,找到对应的Actio ...
 - paper:基于verilog HDL 的高速可综合FSM设计
			
1.寄存器输出型状态机 VS 组合逻辑输出型状态机 2.状态编码方法 这块讲的不好,也比较少. 3.系统设计中模块划分的指导性原则
 - 【linux】【磁盘分割】Linux磁盘分割
			
全部的磁盘阵列容量均给/cluster/raid目录,占有2TB的容量: 2 GB的swap容量: 分割出/, /usr, /var, /tmp等目录,避免程序错误造成系统的困扰: /home也独立出 ...
 - OOP面向对象形式的初使化配置
			
init.php里: <?php use ElemeOpenApi\Config\Config; define("BASE_DIR", dirname(__FILE__) . ...
 - COMP9021--6.17
			
1. ''' '''the comment in the middle will be shown in your code while ranning 2. a=bc=a%bor we can si ...
 - R-codes-tips
			
1. 在shell执行R文件 chmod 0755 file.R Rscript file.R 2. 载入数据 data(dune) 3. attach() 将data.frame添加到R的搜索路径 ...
 - gpg: signing failed: secret key not available
			
1 使用png签名tag时报错“ jb@39:~/11$ git tag -s gpg -m "gpg"gpg: directory `/home/jb/.gnupg' creat ...
 - HDU 4990 Reading comprehension 矩阵快速幂
			
题意: 给出一个序列, \(f_n=\left\{\begin{matrix} 2f_{n-1}+1, n \, mod \, 2=1\\ 2f_{n-1}, n \, mod \, 2=0 \end ...
 - C++异常安全的赋值运算符重载 【微软面试100题 第五十五题】
			
题目要求: 类CMyString的声明如下: class CMyString { public: CMyString(char *pData=NULL); CMyString(const CMyStr ...