零基础学习java------day6----数组
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----数组的更多相关文章
- 总结了零基础学习Java编程语言的几个基础知识要点
很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面 初学者先弄清这 ...
- 音乐出身的妹纸,零基础学习JAVA靠谱么
问:表示音乐出身的妹纸一枚 某一天突然觉得身边认识的是一群程序员 突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...
- salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值
注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...
- 零基础学Java第四节(字符串相关类)
本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...
- 零基础学Java第三节(基本输入输出)
本篇文章是<零基础学Java>专栏的第三篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] Java程序的命令行参数 我们可以 ...
- 【零基础学习iOS开发】【转载】
原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...
- 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇
从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...
- 零基础学习hadoop到上手工作线路指导
零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了.整个过程整理一下,给大家参考,欢迎讨论,共同学习. ...
- 【零基础学习iOS开发】【01-前言】01-开篇
本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过I ...
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
随机推荐
- 有向路径检查 牛客网 程序员面试金典 C++ Python
有向路径检查 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径. 给定图中的两个结点的指针DirectedGraphNode* a, ...
- js实现日期格式化封装--八种
封装一个momentTime.js文件,包含8种格式. 需要传两个参数: 时间戳:stamp 格式化的类型:type, 日期补零的方法用到es6语法中的padStart(length,'字符'): 第 ...
- Linux cat文件正常,vim文件乱码
cat: vim: 1.临时解决 vim 文件后,命令模式下执行: :set encoding=utf-8 2.永久解决 vi 配置文件路径:/etc/virc vim 配置文件路径:/etc/ ...
- 【数据结构&算法】08-栈概念&源码
目录 前言 栈的定义 定义 常见应用 栈的常见应用 进栈出栈变化形式 栈的抽象数据类型 栈的顺序存储结构及实现 栈的顺序存储结构 顺序栈 顺序栈的结构定义 两栈共享空间 栈的链式存储结构及实现 栈的链 ...
- httprunner3源码解读(3)client.py
源码目录结构 ApiResponse 这个类没啥好说的 class ApiResponse(Response): """ 继承了requests模块中的Response类 ...
- 手把手从0到1:搭建Kubernetes集群
搭建 k8s 集群网上很多教程,如果是手工部署或者实验环境可以直接使用 MiniKube 或者 Kind,来在本地启动简单的 Kubernetes 集群进行后面的学习即可.如果是使用 MiniKube ...
- webpack 打包图片资源
webpack 打包图片资源 /** * loader: 1. 下载 2. 使用(配置) * plugins:1. 下载 2. 引入 3.使用 */ // 用来拼接绝对路径的方法 const {res ...
- 南京大学OS笔记(1)-应用眼中的操作系统
南京大学OS笔记(1)-应用眼中的操作系统 早就想刷一刷南大JYY老师的os课.之前稍微看过几节,果然讲的风趣幽默,而且现场写代码展示水平确实很高,这次准备认真刷一刷然后好好记一下笔记.当然lab就不 ...
- CF264BGood Sequences
CF264BGood Sequences 题面 大意 寻找最长递增字串,使得相邻两个数不互质. 思路 动态规划思想,ans记录当前的数以下标i为约数答案,使得需要填进去的数肯定与前一个数不互质.在开始 ...
- PAT A1063——set的常见用法详解
set 常用函数实例 set是一个内部自动有序且不含重复元素的容器 (1)insert() (2)find() st.find(*it) 找到返回其迭代器,否者返回st.end() (3)size( ...