0. 内容概览

补充:main方法中的数组

1. 数组的概述

概念:

  用来存储一组相同数据类型的集合(或者叫容器)

注意事项:

  1. 数组中的元素类型必须一致

   2. 数组本身是引用数据类型,但是里面的元素既可以是基本数据类型,也可以是引用数据类型

   3. 数组的长度一旦给定就无法改变

声明

  (1)数据类型[]  数组名   (2)数据类型  数组名[]

备注:main方法中只有两个地方可以改变,即中括号的位置和args的名字

2 . 数组的初始化  

2.1 动态初始化

给定数组的长度,有系统分配空间和初始值

格式:

   数据类型[ ]  数组名 = new 数据类型[数组的长度];

如: int[]  arr = new int[5];

数组的赋值和取值:

  索引: 索引是从0 开始的,索引的最大值是数组的长度减1

  赋值: 数组名[索引值] = 要赋的值
  取值: 数组名[索引值];

案例: 创建一个长度为4的int 数组,并赋值 

package com._51doit.javase.day06;

public class ArrayDemoTest {
public static void main(String[] args) {
int[] arr = new int[4] ;//声明
//System.out.println(arr);//局部变量不赋初值不能使用
//赋值: 数组名[索引值] = 要赋的值
//取值: 数组名[索引值];
arr[0] = 100;
arr[1] = 20;
arr[2] = 89;
arr[3] = 1000;
for(int i=0;i<=3;i++) {
System.out.println(arr[i]);
}
}
}

练习

1. 创建一个String类型长度为4的数组,输入张三,李四,王二,麻子并分别将其名字存到该数组中

package com._51doit.javase.day06;

import java.util.Scanner;

public class ArrayDemo1 {
public static void main(String[] args) {
String[] names = new String[5];
for(int i=0;i<names.length;i++) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第"+(i+1)+"个名字");
String name = sc.nextLine();
names[i] = name;
}
for(int i=0;i<names.length;i++) {
System.out.println(names[i]);
}
}
}

2. 创建一个char 类型的数组,把'多' '易' 教育分别存进去

public class ArrayTest {
public static void main(String[] args) {
char[] arr = new char[4];
arr[0] = '多';
arr[1] = '易';
arr[2] = '教';
arr[3] = '育';
}
}

2.2数组的静态初始化

 概念:

  给定数组中的元素,由系统分配长度并赋值

格式:

  数据类型[ ]  数组名 =  new 数据类型[ ]{元素1,元素2.....};

简写格式

  数据类型[ ] 数组名 = {元素1,元素2.......}

注意事项:

  只有第一次定义的时候可以简写,重写赋值的时候不能简写

数组长度的获取:数组名.length

public class ArrayDemo5 {
public static void main(String[] args) {
int[] arr = new int[] {1,2,3,4,5,6,7,8};
System.out.println(arr.length);//8
System.out.println(arr[7]);
String[] arr1 = {"中","发","白"};
//arr1 = {"梅","蓝"};//重写赋值不能简写
arr1 = new String[]{"梅","蓝"};
for(int i=0;i<=arr.length-1;i++) {
System.out.println(arr[i]);//0-7
}
}
}

练习

1. 创建一个char数组:多易教育,然后遍历

package com._51doit.javase.day06;

public class PracticeDemo1 {
public static void main(String[] args) {
char[] arr1 = new char[] {'多','易','教','育'};
for(int i=0;i<arr1.length;i++) {
System.out.print(arr1[i]);
}
} }

2. 创建int 数组,存入5 个元素,求该数组的元素之和, 平均值

package com._51doit.javase.day06;

public class PracticeDemo1 {
public static void main(String[] args) {
char[] arr1 = new char[]
int[] arr2 = new int[] {12,11,33,44};
int sum = 0;
double aver;
for(int i=0;i<arr2.length;i++) {
sum += arr2[i];
}
aver = (double)sum/arr2.length;
System.out.println("元素之和为:"+sum);
System.out.println("平均值为:"+aver);
}
}

 3. 数组的内存分析

栈(stack):

  存放局部变量和方法名,没有初始值

堆(heap):

  存放new出来的东西(如,new int[1,2,3,4]),有初始值(基本数据类型:默认值;引用数据类型:null)

如果堆中内存没有栈中变量指向时(python中指的是引用计数为0,此处不知),就会成为垃圾,等待GC自动回收

如图

注意  打印arr时,得到的是一个编号(图中是[I@7852e922, "["表示以为数组,I表示int类型,7852e922则表示存储地址)

当main方法执行完时,main方法就从栈中弹出去了,也就是说arr没了(就没有指向堆的指针了),所以对重的数据就被当垃圾回收掉了,如下

当初始化多个数组时,如将第二个数组赋值给第一个数组(如下图,令arr=arr1),此时数组指向的地址就会发生改变,此处的arr指向由ox0001变为0x0002

4. 数组常见异常

 空指针异常

  产生的原因: 使用null 调用堆中的内容,要注意的是,如果一个变量的初始值是null,直接打印是不报错的,只有调用他里面的东西才会报空指针

案例:

int [] arr = null;//有初始值,初始值为null
System.out.println(arr); //null
System.out.println(arr[0]);// java.lang.NullPointerException

这里能解释前面比较字符串相等出现的equals,其形式为:字符串a.equals(字符串b),若将未知字符串放在a位置,若未知字符串是空,则会报空指针异常错误,但将已知的字符串放a位置就不会出现这种情况

 数组角标越界异常:

  产生的原因:数组的索引值超出的最大的范围,就会出现该异常

案例: 

int[] arr = new int[3];// 索引值0-2
System.out.println(arr[4]);// java.lang.ArrayIndexOutOfBoundsException

  

 5. 数组案例

5.1 点名系统

从全班同学的名字中随机挑选一个:

分析步骤:
1. 构建一个String 类型的数组,用来存储全班同学的名字
2. 需要生成一个随机数,作为索引值,

Random(java.util)
Random r = new Random();
int a = r.nextInt(20);//生成[0-20) 之间的随机数

3. 根据索引值从数组中取元素

package com._51doit.javase.day06;

import java.util.Random;

public class CallName {
public static void main(String[] args) {
     // 1. 构建一个全班同学名字的数组
String[] names = new String[] {"张三","李四","王二","麻子","小红","小明","小强","老王"};
     // 2. 生成随机索引
Random r = new Random();
int index = r.nextInt(8);
     //3. 根据随机数从数组中获取元素
String name = names[index];
System.out.println("有请"+name+"同学发言");
}
}

5.2 数组的遍历 

案例:定义一个数组{1,2,3,4,5},按如下格式打印数据[1,2,3,4,5]

分析: 1. 对数组做遍历
2. 如果是第一个元素:打印” [元素, ”
3. 最后一个元素: 元素]
4.其余元素: 元素,

package com._51doit.javase.day06;

public class ArrayDemo2 {
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
//1. 对数组做遍历
for(int i=0;i<arr.length;i++) {
//对一个元素的数组做单独处理
if(arr.length == 1) {
System.out.println("["+arr[0]+"]");
}
//2. 如果是第一个元素:打印[元素,
else if(i == 0) {
System.out.print("["+arr[i]+",");//注意不换行
}else if(i==arr.length-1) {
//3. 最后一个元素: 元素]
System.out.println(arr[i]+"]");//可以换行
}else {
//4.其余元素: 元素,
System.out.print(arr[i]+",");//不换行
}
}
}
}

封装成方法:

    public static void printArr(int[] arr) {
//1. 对数组做遍历
for(int i=0;i<arr.length;i++) {
//对一个元素的数组做单独处理
if(arr.length == 1) {
System.out.println("["+arr[0]+"]");
}
//2. 如果是第一个元素:打印[元素,
else if(i == 0) {
System.out.print("["+arr[i]+",");//注意不换行
}else if(i==arr.length-1) {
//3. 最后一个元素: 元素]
System.out.println(arr[i]+"]");//可以换行
}else {
//4.其余元素: 元素,
System.out.print(arr[i]+",");//不换行
}
}
}

在main方法中调用:

public static void main(String[] args){
int[] arr = {1,2,3,4,5,6};
printArr(arr);
}

5.3  工具类的封装

1.在我们的项目中创建一个util的包,并在在包下创建一个类:ArrayUtil

在类中建方法:

package com._51doit.javase.util;

public class ArrayUtil {
// 打印数组
public static void printArr(int[] arr) {
//1. 对数组做遍历
for(int i=0;i<arr.length;i++) {
//对一个元素的数组做单独处理
if(arr.length == 1) {
System.out.println("["+arr[0]+"]");
}
//2. 如果是第一个元素:打印[元素,
else if(i == 0) {
System.out.print("["+arr[i]+",");//注意不换行
}else if(i==arr.length-1) {
//3. 最后一个元素: 元素]
System.out.println(arr[i]+"]");//可以换行
}else {
//4.其余元素: 元素,
System.out.print(arr[i]+",");//不换行
}
}
}
}

调用

public class ArrayDemo2 {
public static void main(String[] args){
int[] arr = {1,2,3,4,5,6};
ArrayUtil.printArr(arr);
}

5.4 最值

最值:最大值和最小值

案列:数组{1,2,3,4,5,6} 打印最大值和最小值

思路: 1. 设置一个变量用来代表最值(数组中的第一个元素)
    2. 用这个变量和数组中的每一个元素作比较
    3. 如果数组中有元素比他大,就把他的值重新赋值
    4. 比较结束后,打印最值

package com._51doit.javase.day06;

public class PrintMaxAndMinValue {
public static void main(String[] args) {
int[] arr1 = new int[] {1,2,3,4,5,6};
printMaxAndMin(arr1);
}
public static inr[] getMaxAndMin(int[] arr) {
int max = arr[0];
int min = arr[0]; for(int i=0;i<arr.length;i++) {
if(arr[i]>max) {
max = arr[i];
}
if(arr[i]<min) {
min = arr[i];
}
}
//System.out.println(max);
//System.out.println(min);
     int[] result = {max,min}
     return result;

}
}

封装方法

    public static int[] getMaxAndMin(int[] arr) {
int max = arr[0];
int min = arr[0]; for(int i=0;i<arr.length;i++) {
if(arr[i]>max) {
max = arr[i];
}
if(arr[i]<min) {
min = arr[i];
}
}
int[] result = {max, min};
return result;
}

调用

    public static void main(String[] args) {
int[] arr1 = new int[] {1,2,3,4,5,6};
ArrayUtil.getMaxAndMin(arr1);

5.5 数组元素索引的查找

案例

查找数组[1,2,3,4,5,6]中数值为5的索引

封装方法

    public static int index(int[] arr,int num) {
int location = -1;
for(int i=0;i<arr.length;i++) {
if(arr[i] == num) {
location = i;
break;
}
}
System.out.println(location);
return location;
}

调用

    public static void main(String[] args) {
int[] arr1 = new int[] {1,2,3,4,5,6};
int num=5;
ArrayUtil.index(arr1,num); //得到结果为4

5.6 元素交换

如何将数组中的两个元素做交换
举例: 将一杯雪碧和一杯可乐做交换:
  思路:要引入一个空杯.,先把雪碧倒入空杯,把可乐倒入雪碧杯,再把空杯中的可乐倒入空杯

int temp = arr[0];//第一个元素进空杯
arr[0] = arr[1];//第二个元素进第一个元素被
arr[1] = temp;//空杯中倒入第二个被
//创建一个方法,交换数组中的两个元素:
public static void swap(int[]arr,int x,int y) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] =temp;
}

5.7 逆序
大致流程如下图,第一个数和最后一个数换,第二个数与倒数第二个数换,以此类推。。。。。

封装方法

    // 数组的反转
public static void reverse(int[] arr) {
for(int i=0;i<arr.length/2;i++) {
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
}

调用

public class Reverse {
public static void main(String[] args) {
int[] arr1 = new int[] {1,2,3,4,5,6};
ArrayUtil.printArr(arr1);
ArrayUtil.reverse(arr1);
ArrayUtil.printArr(arr1);
}

运行结果如下

6. 多维数组

1 数据类型[ ][ ]  数组名 = new 数据类型[m][n];
  m: 二维数组中一维数组的个数
  n: 一维数组中元素的个数
2  数据类型[][] 数组名= new 数据类型[m][];
  m:二维数组中一维数组的个数
3. 数据类型[][] 数组名= new  数据类型[][]{{元素值,元素值...},{元素值,元素值...},{元素值,
元素值,...}};
简写: = {{元素值,元素值...},{元素值,元素值...},{元素值,元素值,...}};

  
第一种类型案例

package com._51doit.javase.day06;

public class MultiDArrayDemo {
public static void main(String[] args) {
int[][] arr = new int[4][5];
System.out.println(arr[1][3]); // 打印的是第二个数组中的低是个元素
}
}

这种类型只能表示元素数相同的数组(二元数组中的数组),为了解决这个问题,类型二就很有必要了

第二种类型

int[][] arr1 = new int[3][];
arr1[0] = new int[] {1,2,3,4,5};
arr1[1] = new int[] {1,2};
arr1[2] = new int[]{7,8,9,9,2}

注意:给二维数组赋值时,不能简写,如下面写法就是错误的

arr1[2]= {3,4}; //给二维数组中一维数组赋值的时候,不能简写

但如上面这样数组一个一个的定义比较麻烦,这时候3的形式就比较重要了(下面代码相当于上面第二种类型的效果)

int[][] arr1 = new int[][] {{1,2,3,4,5},{1,2},{7,8,9,9,2}};

7. main方法中的数组

main方法中的数组是用来接收键盘录入的参数的(即可以在终端命令行输入参数)

用法:

  javac 命令不变

  java命令 后面跟参数,多个参数用空格隔开

  如:java HelloWorld a b c d

  a b c d就自动装入args数组里了

案例

package com._51doit.javase.day06;

public class ArrayTest {
public static void main(String[] args) {
for(int i=0;i<args.length;i++) {
System.out.print(args[i]);
}
}
}

在终端命令行运行的话,直接编译,即javac ArrayTest.java=======>java ArrayTest  1 2 3即可遍历得到数组args的元素分别为1 ,2, 3

若在eclipse上运行的话,run as===>选择run configurations=====>找到要运行的类(如此处是ArrayTest)====>点击Arguments===>输入自己的参数,如下图

应用后,点击run即可得到代码运行后的结果

零基础学习java------day6----数组的更多相关文章

  1. 总结了零基础学习Java编程语言的几个基础知识要点

    很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面   初学者先弄清这 ...

  2. 音乐出身的妹纸,零基础学习JAVA靠谱么

    问:表示音乐出身的妹纸一枚  某一天突然觉得身边认识的是一群程序员   突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...

  3. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  4. 零基础学Java第四节(字符串相关类)

    本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...

  5. 零基础学Java第三节(基本输入输出)

    本篇文章是<零基础学Java>专栏的第三篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] Java程序的命令行参数 我们可以 ...

  6. 【零基础学习iOS开发】【转载】

    原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...

  7. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

  8. 零基础学习hadoop到上手工作线路指导

    零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了.整个过程整理一下,给大家参考,欢迎讨论,共同学习. ...

  9. 【零基础学习iOS开发】【01-前言】01-开篇

    本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过I ...

  10. salesforce 零基础学习(六十八)http callout test class写法

    此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...

随机推荐

  1. 有向路径检查 牛客网 程序员面试金典 C++ Python

    有向路径检查 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径. 给定图中的两个结点的指针DirectedGraphNode* a, ...

  2. js实现日期格式化封装--八种

    封装一个momentTime.js文件,包含8种格式. 需要传两个参数: 时间戳:stamp 格式化的类型:type, 日期补零的方法用到es6语法中的padStart(length,'字符'): 第 ...

  3. Linux cat文件正常,vim文件乱码

    cat: vim: 1.临时解决 vim 文件后,命令模式下执行: :set encoding=utf-8 2.永久解决 vi    配置文件路径:/etc/virc vim 配置文件路径:/etc/ ...

  4. 【数据结构&算法】08-栈概念&源码

    目录 前言 栈的定义 定义 常见应用 栈的常见应用 进栈出栈变化形式 栈的抽象数据类型 栈的顺序存储结构及实现 栈的顺序存储结构 顺序栈 顺序栈的结构定义 两栈共享空间 栈的链式存储结构及实现 栈的链 ...

  5. httprunner3源码解读(3)client.py

    源码目录结构 ApiResponse 这个类没啥好说的 class ApiResponse(Response): """ 继承了requests模块中的Response类 ...

  6. 手把手从0到1:搭建Kubernetes集群

    搭建 k8s 集群网上很多教程,如果是手工部署或者实验环境可以直接使用 MiniKube 或者 Kind,来在本地启动简单的 Kubernetes 集群进行后面的学习即可.如果是使用 MiniKube ...

  7. webpack 打包图片资源

    webpack 打包图片资源 /** * loader: 1. 下载 2. 使用(配置) * plugins:1. 下载 2. 引入 3.使用 */ // 用来拼接绝对路径的方法 const {res ...

  8. 南京大学OS笔记(1)-应用眼中的操作系统

    南京大学OS笔记(1)-应用眼中的操作系统 早就想刷一刷南大JYY老师的os课.之前稍微看过几节,果然讲的风趣幽默,而且现场写代码展示水平确实很高,这次准备认真刷一刷然后好好记一下笔记.当然lab就不 ...

  9. CF264BGood Sequences

    CF264BGood Sequences 题面 大意 寻找最长递增字串,使得相邻两个数不互质. 思路 动态规划思想,ans记录当前的数以下标i为约数答案,使得需要填进去的数肯定与前一个数不互质.在开始 ...

  10. PAT A1063——set的常见用法详解

    set 常用函数实例 set是一个内部自动有序且不含重复元素的容器 (1)insert() (2)find()  st.find(*it) 找到返回其迭代器,否者返回st.end() (3)size( ...