java基础-引用数据类型之一维数组(Array)

                                   作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.数组的定义

1>.为什么需要数组

  保存一个数据可以定义一个变量,如果要保存一个班级的100多名同学的成绩,是否要定义100多个变量呢?其实在Java中可以通过定义一个变量来保存这100多个同学的成绩,而保存这么100多个学生成绩的载体就是数组。

2>.数组的概念

  数组是同一种数据类型的集合,可以是基本数据类型,也可以是引用数据类型。变量就是内存中的一块存储空间,数据就是内存中的一块连续的存储空间。

3>.数组的特点

  a>.数组存储的都是相同数据类型的元素;

  b>.数组的长度也就是数组中元素的个数;

  c>.元素从0开始编号,编号也称“索引”:index(下标,角标);

  d>.数组中元素的访问方式是通过“数组名+索引”的方式;

4>.数组的声明

5>.数组的初始化

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ public class ArrayDemo{
/*
数组:
同一种数据类型的若干个值的容器.
元素:
数组中的值称为元素.
索引:
元素的标号,从0开始.
长度:
数组中元素的个数. */
public static void main(String[] args){
//定义数组,第一种格式:动态初始化,定义数组时,不指定数组里具体的值.
int[] arr = new int[10];
/**
arr是数组名称,arr的数据类型是int[],new int[10]会在内存中分配
一块连续的存储空间,这块存储空间可以存储10个int类型的元素。在定义数
组时,括号也可以卸载数组名的后面,如“int arr[] = new int[10];”,
但是我不建议这样写!
*/ //第二种静态初始化:定义数组时,元素已经确定.
int[] arr2 = new int[]{1,2,3}; //简化写法,在定义元素的同时,可以给数组的各个元素进行赋值。
int[] arr3 = {10,20,30};
/**
定义了一个数组arr3,这个数组的每个元素是10,20,30.这个数组的长度
就是初始化时制定的数组元素的个数。
*/ }
}

二.数组的内存结构

  数组是引用数据类型,那么大家知道引用数据类型和基本数据的类型的区别吗?其实,(操作系统给JVM分配一块连续的内存地址)Java程序在运行时,为了提高运行效率,对内存进行了不同区域的划分,每一种区域都有特定的处理数据的方式和内存管理方式,主要有一下几种

  各个内存区域的特点如下:

    a>.栈内存:所有的方法运行的时候交进入的内存,用于存储局部变量,当数据使用完,所占空间会自动释放;

    b>.堆内存:存放数据和对象(存储的是容器和对象),通过new建立的实例都存放在堆内存中,每一个实例都有内存地址值,实例中的变量都有默认初始化值,当实例不在被使用,会在不确定的时间被垃圾回收器回收;

    c>.方法区:存放类文件和方法(这里暂时先卖个关子,等到面向对象部分在给大家详细分析,数组的存储跟方法区关系不大);

    d>.本地方法栈:供本地方法使用,与操作系统相关(有时候Java有些功能自己不能单独完成,比如复制,粘贴就可以调用操作系统的模块);

    e>.程序计数器(英文:Program Counter):对字节码文件计数;

  如上图所述,当我们执行“int[] arr = new int[4];”,可以很明显的看出来会在堆内存中创建一块单独的连续的内存空间并给这个连续的内存空间中的每一个元素赋初始值(int[]类型默认为0),然后再讲这个数组中的首个元素的下标的内存地址赋值给栈内存。也就是说“int[] arr = new int[4];”中的arr实际存储的是arr的在堆内存中的内存地址,并不是具体的数值。而“arr[3]=10;”是找到arr数组中对应的第四个元素(数组的默认其实下标为0)并将其值修改为10.

三.数组元素的访问

  我们可以通过索引值(下标值)来访问数组的各个元素。不过要注意的是,下标的起始位置是“0”。

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ public class ArrayDemo1{
/*
数组的访问方式:
数组名[索引值]
*/
public static void main(String[] args){
//创建一个长度为10的String类型的数组
String[] arr = new String[5]; //访问arr数组的第一个元素并将结果赋值给一个变量字符串变量。
String Name = arr[0]; //修改第一个元素的值。
arr[0] = "yinzhengjie"; //访问arr数组的内存地址
System.out.println(arr); //访问arr的全部元素
for(int i=0;i< arr.length;i++){
System.out.println(arr[i]);
}
/**
定义了数组之后,系统会给数组的各个元素进行默认的初始化操作
a>.对于数值型数据默认初始化为0;
b>.对于布尔数据默认初始化为false;
c>.对于字符数据默认初始化为码值为0的字符;
d>.对于引用数据类型默认初始化为null;
*/ int[] arr1 = new int[3];
arr1[2] = 2018;
int i = 0;
while(true){
if(i < arr1.length){
System.out.println(arr1[i]);
}else{
break;
}
i++;
} System.out.println("-------------------");
String[] arr2={"尹","正","杰"};
//如果遍历某个集合中所有的数据,还可以使用foreach循环
for(String x:arr2){
System.out.println(x);
}
/**
依次把arr2数组的每一个元素赋值x变量,在循环体中可以对x变量进行处理。
*/ }
}

四.数组定义常见问题

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ public class ExceptionDemo{
public static void main(String[] args){
/*
数组操作的常见异常
1.数组索引越界
2.空指针异常
3.数据类型不匹配
*/ int[] arr = new int[]{1,2,3,4,5,6};
int[] arr2 = new int[]{7,8,9};
int[] arr3 = new int[]{70,80,90};
boolean[] arr4 = {true,false,true,true}; printArray(arr);
printArray(arr2);
printArray(arr3);
printArray(arr4); // System.out.println(arr[30]);
/**类型一:
“java.lang.ArrayIndexOutOfBoundsException:数组索引越界异常”。
原因:
访问到了数据中不存在的索引发生的异常。
*/ // arr = null;
// System.out.println(arr[2]);
/**
类型二:
“java.lang.NullPointerException:空指针异常”
原因:
arr引用没有指向数组,却在操作数组中的元素。
*/ //arr = "yinzhengjie";
/**
类型三:“错误: 不兼容的类型: String无法转换为int[]”
原因:
我们上面另一的arr类型为int[],而我们传入的确实一个字符串类型!
*/ } public static void printArray(int[] arr){
for(int i = 0;i<arr.length;i++){ //根据数组的length属性动态的获取数组的长度
System.out.print(arr[i] + " ");
}
System.out.println();
} public static void printArray(boolean[] arr){
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}

五.小试牛刀

1>.随机生成一个数字,并自动求出其中的最大值和最小值。

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ import java.util.Scanner; public class ArraryDemo2{
//获取数组
public static int[] getArray(){
Scanner s = new Scanner(System.in);
System.out.print("请输入数组的长度:>>>");
int len = s.nextInt();
int[] arr = new int[len] ;
for(int i = 0;i<len;i++){
System.out.print("请输入第" + (i+1) + "个数:>>>");
int number = s.nextInt();
arr[i] = number;
}
return arr;
} //获取最大值
public static int getMax(int[] arr){
int max = arr[0];
for(int i = 0;i < arr.length;i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
} //获取最小值
public static int getMin(int[] arr){
int min = arr[0];
for(int i = 0;i<arr.length;i++){
if(arr[i] < min){
min = arr[i];
}
}
return min;
} public static void main(String[] args){
int[] arr = getArray();
System.out.println("最大值是:" + getMax(arr));
System.out.println("最小值是:" + getMin(arr));
} }

2>.每位数字都加上8,然后用和除以10的余数代替该数字,再将生成的数字反转。

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ import java.util.Scanner; /*
某个公司采用公用电话传递数据,数据是随机的整数(整数的个数由用户自定义),
在传递过程中是加密的,加密规则如下:每位数字都加上8,然后用和除以10的余数
代替该数字,再将生成的数字第一位和最后以为互换一下顺序,第二位和倒数第二位
互换一下顺序,以此类推...。
*/ public class DataEncryption{
//主函数
public static void main(String[] args){
int[] array = randomArray(); //获取随机数组
encryptionArray(array); //加密操作
ArraySwap(array); //将加密的数字进行反转
System.out.print("加密后的数字是:"+"\t");
printArray(array); decryptArray(array); //解密操作
ArraySwap(array); //然后在将数据反转 System.out.print("解密后的数字是:"+"\t");
printArray(array);
}
//随机生成一个数组
public static int[] randomArray(){
Scanner Input = new Scanner(System.in);
System.out.print("请输入您想产生随机数的个数:>>> ");
int number = Input.nextInt();
int[] array = new int[number];
for(int index=0;index<array.length;index++){
array[index] = (int)(Math.random()* 8 + 1); //表示随机生成一个int类型的数字并赋值。
}
System.out.print("您产生的随机数是:" + "\t");
printArray(array);
return array;
}
//加密方法:每个数字都加上8之后除以10的余数来代替该数字.
public static void encryptionArray(int[] args){
for(int index = 0;index < args.length;index++){
args[index]= (args[index] + 8)%10;
}
}
//解密方法:每个数字都加上2之后除以10的余数来代替该数字.
public static void decryptArray(int[] args){
for(int index = 0;index < args.length;index++){
args[index]= (args[index] + 2)%10;
}
} //将数组翻转
public static void ArraySwap(int[] args){
for(int index=0;index<=args.length/2;index++){
int temp = args[index];
args[index] = args[args.length-1-index];
args[args.length-1-index] = temp;
}
}
//遍历数组
public static void printArray(int[] args){
for(int index=0;index<args.length;index++){
System.out.print(args[index] + " ");
}
System.out.println();
}
}

六.Java参数传递问题-值传递

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ public class CopyArrayDemo{
/*
数组的复制:返回值类型是数组
判断堆空间中的两个对象(数组)是否是同一个数组,可以使用 == 判断他们的地址值
*/
public static void main(String[] args){
int[] arr1 = genArray();
System.out.println("arr1的内存地址是:" + arr1);
print(arr1);
int[] arr2 = copyArray(arr1);
// int[] arr2 = arr1; //arr2引用的是arr1同一块内存地址
print(arr2); // System.out.println(arr1 == arr2);//
System.out.println("arr2的内存地址是:" + arr2);//[I@6d06d69c 类型@十六进制值 } //定义获取一个数组的方法
public static int[] genArray(){
int[] arr = new int[5];
for(int i = 0;i<arr.length;i++){ //这里是利用的数组的length属性,可以获取数组的长度。
int r = (int)(Math.random() * 50 + 1); //这里是利用了Java内置的模块模拟了的随机生成1-50的int数字
arr[i] = r;
}
return arr;
} //我这里专门定义了一个可以打印数组的犯法
public static void print(int[] arr){
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
} //这里是用于拷贝数组的方法
public static int[] copyArray(int[] arr){
//1>.创建一个和参数一样大小的数组
int[] copy = new int[arr.length];
//2>.遍历参数的数组,把元素拷贝到新数组中
for(int i = 0;i<arr.length;i++){
copy[i] = arr[i];
}
//3>.将拷贝元数组的副本返回
return copy;
}
}

java基础-引用数据类型之一维数组(Array)的更多相关文章

  1. java基础-引用数据类型之二维数组(Array)

    java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...

  2. Java基础-引用数据类型之集合(Collection)

    Java基础-引用数据类型之集合(Collection) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便 ...

  3. Java 基础 引用数据类型 ArrayList集合

    引用数据类型(类) 分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类, ...

  4. Java 基础 引用数据类型 和 流程控制

    引用数据类型 与定义基本数据类型变量不同,引用数据类型的变量定义及复制有一个相对固定的步骤和格式: 数据类型 变量名 = new 数据类型(); 如:String st = new String(); ...

  5. java 基础 04 循环结构 一维数组

    内容: (1)循环结构 (2)一维数组 1.循环结构 1.1for循环 (1)语法格式 for(初始化表达式1;条件表达式2;修改初始化表达式3){ 循环体; } (2)执行流程 执行初始化表达式 = ...

  6. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  7. java基础知识-数据类型及转换

    1.java中的常量大体分为两种: <1>字面量常量 <2>自定义常量 2.java中常量(字面量)的分类:<1>,整数常量:直接出现的整数<2>,小数 ...

  8. Java基础笔记(十)—— 数组

    数组是具有相同类型的数据的集合,是一种引用数据类型,一般具有固定的长度,并且在内存中占据连续的空间. 数组声明:数据类型[ ] 数组名;             数据类型 数组名[ ]; 如:int[ ...

  9. java基础(数据类型,运算符)

    java基础之数据类型(变量) java中存在的数据有常量和变量 常量:在程序执行的过程中其值不可以发生改变 常量的分类 字面值常量 字面值常量的分类 常量 描述 字符串常量 用双引号括起来的内容 整 ...

随机推荐

  1. Scrum Meeting 10.26

    1.会议内容 姓名 今日任务 明日任务 预估时间(h) 徐越 学习服务器配置 配置SQLserver 4 卞忠昊 阅读代码 找上届代码的bug 3 武鑫 查阅资料 查阅资料,各种app的界面设计 3 ...

  2. No.100_第一次团队会议

    任务的确立 这次会议,我们的主要目标是确定任务: 我们的任务有以下几个选择: 学霸网站,这个项目拥有以前的前端代码,我们再使用Django后端服务.上手难度较低,环境较好. 多平台时间管理软件. 安卓 ...

  3. 1到N中“1”出现的次数

    题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数 思路:刚开始做的时候,是想从1到N进行遍历,其中每个数都出现1的个数加起来,最后得出结果,但是老师让我们找规 ...

  4. Oracle安装后出现的问题

    安装oracle没有勾选"安装模板数据库",可以通过执行以下命令进行修改: cd $ORACLE_HOME/rdbms/admin 到这个目录下sqlplus /as sysdba ...

  5. Android界面设计适配不同屏幕的尺寸和密度解读

    Android是运行在各种提供不同的屏幕尺寸和密度的设备.Android系统提供跨设备的统一开发环境和处理大部分的工作,以调整每个应用程序的用户界面,以在其上显示的画面. 同时,该系统提供了API,允 ...

  6. vue 过渡效果

    Vue中提供了`<transition>`和`<transition-group>`来为元素增加过渡动画.文档写的很清楚,但是实际使用起来还是费了一番功夫.这里做一个简单的记录 ...

  7. Linux内核0.11 setup文件说明

    一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下setup.s源文件的实现功能的总结说明. setup.s是一个操作系统加载程序,它的主要功能是利用BIOS中断读取机器系 ...

  8. HHVM 3.0 发布,执行 PHP 的虚拟机

    HHVM 详细介绍 HipHop VM(HHVM)是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT(Just-In- Time)编译器,同时具有产生快速代码和即时编译的优点. ...

  9. DB2 数据库常用操作【持续更新】

    好久没写博客了. 上次还是两个月前. 1. 连接数据库 db2 connect to dbName user userName using password 2. 查看表结构 db2 "de ...

  10. C# 单例模式的多种简单实现

    什么是单例模式? 这里我就不做过多的解释了, 毕竟关于Singleton的资料实在是太多太多了.点击这里 1.简单的思路就是, 创建对象单例的动作转移到另外的行为上面, 利用一个行为去创建对象自身, ...