数组

数组指的就是一组相关变量的集合。例如:如果说现在要想定义100个整型变量,按照传统的思路,可能这样定义:

int i1,i2 ,... i100,一共写100个变量。

以上的形式的确可以满足技术要求,但是这里有一个问题,这100多个变量没有任何的逻辑的控制关系,完全独立,就会出现对象不方便管理的情况。那么在这种情况下就可以利用数组来解决此类问题。

数组的定义语法

  • 声明并开辟数组
数据类型 数组名称 [] = new 数据类型 [长度] ;
数据类型 [] 数组名称 = new 数据类型 [长度] ;
  • 分步完成
声明数组:数据类型 数组名称 [] = null ;
开辟数组:数组名称 = new 数据类型 [长度] ;

数组操作说明

当数组开辟空间之后,那么可以采用“数组名称[下标|索引]”的形式进行访问,但是所有数组的下标都是从0开始的,即:如果是3个长度的数组,那么下标的范围:0 ~ 2(0、1、2一共是三个内容)。如果访问的时候超过了数组的允许下标的长度,那么会出现数组越界异常(ArrayIndexOutOfBoundsException)。

以上给出的数组定义结构使用的是动态初始化的方式,即:数组会首先开辟内存空间,但是数组中的内容都是其对应数据类型的默认值,如果现在声明的是int型数组,则数组里面的全部内容都是其默认值:0。

由于数组是一种顺序的结构,并且数组的长度都是固定的,那么可以使用循环的方式输出,很明显需要知道for循环,而且在Java里面为了方便数组的输出提供有一个“数组名称.length”的属性,可以取得数组长度。

定义数组

public class ArrayDemo {
public static void main(String args[]) {
int data[] = new int[3]; // 声明并开辟了一个3个长度的数组
data[0] = 10; // 设置数组内容
data[1] = 20; // 设置数组内容
data[2] = 30; // 设置数组内容
for (int x = 0; x < data.length; x++) { // 循环输出数组
System.out.print(data[x] + "、");
}
}
}
程序执行结果: 10、20、30、

数组操作

数组的引用传递

public class ArrayDemo {
public static void main(String args[]) {
int data[] = new int[3]; // 声明并开辟了一个3个长度的数组
data[0] = 10; // 设置数组内容
data[1] = 20; // 设置数组内容
data[2] = 30; // 设置数组内容
int temp[] = data; // 数组引用传递
temp[0] = 99; // 修改数组内容
for (int x = 0; x < data.length; x++) { // 循环输出数组
System.out.print(data[x] + "、");
}
}
}
程序执行结果: 99、20、30、

数组引用传递

数组静态初始化

  • 格式一:简化格式
数据类型 数组名称 [] = {值,值,...} ;

  • 格式二:完整格式
数据类型 数组名称 [] = new 数据类型 [] {值,值,...} ;

public class ArrayDemo {
public static void main(String args[]) {
int data[] = new int[] { 1, 2, 3, 4, 5 }; // 数组的静态初始化
for (int x = 0; x < data.length; x++) { // 循环输出数组
System.out.print(data[x] + "、");
}
}
}
程序执行结果: 1、2、3、4、5、

二维数组

二维数组的定义语法

  • 动态初始化
数据类型 数组名称[][] = new 数据类型[行的个数][列的个数];
  • 静态初始化
数据类型 数组名称[][] = new 数据类型[][] {{值,值,值},{值,值,值}}

观察二维数组的定义及使用

public class ArrayDemo {
public static void main(String args[]) {
int data [][] = new int [][] {
{1,2,3} ,{4,5,6} , {7,8,9}
} ; // 定义二维数组
for (int x = 0; x < data.length; x++) {// 外层循环是控制数组的数据行内容
for (int y = 0; y < data[x].length; y++) { // 内层循环是控制数组的数据列内容
System.out.print(data[x][y] + "\t");
}
System.out.println(); // 换行
}
}
}
程序执行结果:
1 2 3
4 5 6
7 8 9

数组与方法参数的传递

既然数组内容可以进行引用传递,那么就可以把数组给方法之中的参数,而如果一个方法要想接收参数,则对应的参数类型必须是数组。

一个数组传递的程序
public class ArrayDemo {
public static void main(String args[]) {
int data[] = new int[] { 1, 2, 3 }; // 开辟数组
change(data); // 引用传递,等价于:int temp [] = data ;
for (int x = 0; x < data.length; x++) {
System.out.print(data[x] + "、");
}
}
/**
* 此方法的主要功能是进行数组数据的改变操作,在本方法中会将数组中的每个元素内容乘2
* @param temp 要进行改变内容的数组引用
*/
public static void change(int temp[]) { // 此方法定义在主类中,并且由主方法直接调用
for (int x = 0; x < temp.length; x++) {
temp[x] *= 2; // 将数组的内容乘2保存
}
}
}
程序执行结果: 2、4、6、
数组与方法间的引用传递

数组排序
public class ArrayDemo {
public static void main(String args[]) {
int data [] = new int [] {2,1,9,0,5,3,7,6,8} ;
sort(data) ; // 实现排序
print(data) ;
}
public static void sort(int arr[]) { // 这个方法专门负责排序
for (int x = 0 ; x < arr.length ; x ++) {// 外层控制排序总体的次数
for (int y = 0 ; y < arr.length - 1 ; y ++) { // 内层控制每次的排序控制
if (arr[y] > arr[y + 1]) { // 判断需要交换
int t = arr[y] ;
arr[y] = arr[y + 1] ;
arr[y + 1] = t ;
}
}
}
}
public static void print(int temp[]) {// 专门定义一个输出的功能的方法
for (int x = 0 ; x < temp.length ; x ++) {
System.out.print(temp[x] + "、") ;
}
System.out.println() ;
}
}
实现数组的转置(首尾交换) —— 实现思路(元素长度为偶数)

实现数组的转置(首尾交换) —— 实现思路(元素长度为奇数)

public class ArrayDemo {
public static void main(String args[]) {
int data [] = new int [] {1,2,3,4,5,6,7} ;
reverse(data) ;// 实现转置
print(data) ; // 输出数组内容
}
public static void reverse(int arr[]) { // 此方法专门实现数组的转置操作
int len = arr.length / 2 ;// 转置的次数
int head = 0 ; // 头部索引
int tail = arr.length - 1 ; // 尾部索引
for (int x = 0 ; x < len ; x ++) { // 循环次数为数组长度÷2
int temp = arr[head] ;// 数据交换
arr[head] = arr[tail] ;// 数据交换
arr[tail] = temp ;// 数据交换
head ++ ;// 头部索引增加
tail -- ;// 尾部索引减少
}
}
public static void print(int temp[]) { // 数组输出
for (int x = 0 ; x < temp.length ; x ++) {
System.out.print(temp[x] + "、") ;
}
System.out.println() ;
}
}
程序结果:
7、6、5、4、3、2、1、

数组操作方法

数组拷贝:可以将一个数组的部分内容拷贝到另外一个数组之中;

System.arraycopy(源数组名称,源数组拷贝开始索引,目标数组名称,目标数组拷贝开始索引,长度)

数组排序:可以按照由小到大的顺序对基本数据类型的数组(例如:int数组、double数组都为基本类型数组)进行排序。

java.util.Arrays.sort(数组名称)

实现数组拷贝
public class ArrayDemo {
public static void main(String args[]) {
int dataA[] = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; // 定义数组
int dataB[] = new int[] { 11, 22, 33, 44, 55, 66, 77, 88 };// 定义数组
System.arraycopy(dataA, 4, dataB, 2, 3); // 数组拷贝
print(dataB);
}
public static void print(int temp[]) { // 打印数组内容
for (int x = 0; x < temp.length; x++) {
System.out.print(temp[x] + "、");
}
System.out.println();
}
} 程序执行结果: 11、22、5、6、7、66、77、88、
实现排序
public class ArrayDemo {
public static void main(String args[]) {
int data[] = new int[] { 3, 6, 1, 2, 8, 0 };
java.util.Arrays.sort(data); // 数组排序
print(data);
}
public static void print(int temp[]) {// 数组输出
for (int x = 0; x < temp.length; x++) {
System.out.print(temp[x] + "、");
}
System.out.println();
}
}
程序执行结果: 0、1、2、3、6、8、

对象数组

数组是引用类型,而类也同样是引用类型,所以如果是对象数组的话表示一个引用类型里面嵌套其它的引用类型。

在之前使用的数组都属于基本数据类型的数组,但是所有的引用数据类型也同样可以定义数组,这样的数组称为对象数组。如果要想定义对象数组(以类为例),可以采用如下的形式完成:

  • 对象数组的动态初始化
类名称 对象数组名称 = new 类名称 [长度] ;
  • 对象数组的静态初始化
类名称 对象数组名称 = new 类名称 [] {实例化对象,实例化对象,...} ;
对象数组的动态初始化
class Book {
private String title ;
private double price ;
public Book(String t,double p) {
title = t ;
price = p ;
}
// setter、getter、无参构造略
public String getInfo() {
return "书名:" + title + ",价格:" + price ;
}
}
public class ArrayDemo {
public static void main(String args[]) {
Book books [] = new Book[3] ; // 开辟了一个3个长度的对象数组,内容为null
books[0] = new Book("Java",79.8) ; // 对象数组中的每个数据都需要分别实例化
books[1] = new Book("JSP",69.8) ; // 对象数组中的每个数据都需要分别实例化
books[2] = new Book("Android",89.8) ; // 对象数组中的每个数据都需要分别实例化
for (int x = 0 ; x < books.length ; x ++) { // 循环对象数组
System.out.println(books[x].getInfo()) ;
}
}
} 程序执行结果:
书名:Java,价格:79.8
书名:JSP,价格:69.8
书名:Android,价格:89.8
对象数组的静态初始化
public class ArrayDemo {
public static void main(String args[]) {
Book books[] = new Book[] {
new Book("Java", 79.8),
new Book("JSP", 69.8),
new Book("Android", 89.8) }; // 开辟了一个三个长度的对象数组
for (int x = 0; x < books.length; x++) { // 循环输出对象数组内容
System.out.println(books[x].getInfo());
}
}
}
程序执行结果:
书名:Java,价格:79.8
书名:JSP,价格:69.8
书名:Android,价格:89.8
对象数组内存关系

对象数组的最大好处是将多个对象统一进行了管理,并且除了数据类型改变之外,和之前的数组也没有任何的区别,而且数组本身就属于引用数据类型,那么对象数组就是在一个引用数据类型之中嵌入了其他的引用数据类型,如果非要用内存图表示的话,可以简单理解为图所示的结构。

Java基础_0306:数组的定义与使用的更多相关文章

  1. Java基础总结--数组

    ---数组的定义---组织存储一组数据1.存放相同类型数据的集合--就是一种容器本质上变量也是一种容器--区别就是只存储了一个数据的容器--面对容器,而不是分散的数据eg.买一盘鸡蛋--蛋托其实就是容 ...

  2. Java基础之数组类型

    对于Java,前面的一些基础概念不是很想写,看了看还是从数组开始写吧(毕竟数组是第一个引用类型,相对复杂一点),我也是学了JAVA不是很久,目前看完了JAVA的基础视频,还有JAVA疯狂讲义这本书的大 ...

  3. Java基础-反转数组

    /** java基础,如何将一个数组反转,思考方法采用使用临时变量的情况下,将第一个元素与第二个元素进行反转,需要定义两个索引,一个记录数组的第一个元素与最后一个元素,将其两两交换* */public ...

  4. JAVA中关于数组的定义

    前些日子,有网友问:在JAVA中 int[] a 这样定义的数组和 int a[] 定义的数组有什么区别? 当时没有细看,直接回复说,在JAVA中,两者是一样的,没有区别. 回头仔细看时,还是稍有区别 ...

  5. java二维数组的定义

    java中的一维数组的定义都熟了,但是二位数组和一维数组的定义有些微差别.在网上看到了篇文章,总结的很详细.转载下了. 原文链接[http://blog.sina.com.cn/s/blog_6189 ...

  6. 黑马程序员——JAVA基础之数组

    ------- android培训.java培训.期待与您交流! ---------- 数组: 数组的定义: 数组是相同类型数据的集合, 描述的是相同类型的若干个数据按照一定的先后顺序排列组合而成,其 ...

  7. Java基础之 数组详解

    前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...

  8. Java基础之数组(一)

    数组的定义 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照 一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们.数组的三个基本特 ...

  9. java基础语法 数组

    数组是相同数据类型元素的集合   数组本身是引用数据类型,即对象.但是数组可以存储基本数据类型,也可以存储引用数据类型. 在java中如果想要保存一组基本类型的数据,使用数组:如果想保存一组对象或者其 ...

随机推荐

  1. Python中pandas dataframe删除一行或一列:drop函数

    用法:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False) 参数说明:labels 就是要删除的行列的 ...

  2. Day033--Python--进程

    什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体 ...

  3. poj 2559(栈的应用)

    传送门 参考资料: [1]:挑战程序设计竞赛 题意: 柱状图是由一些宽度相等的长方形下端对齐后横向排列得到的图形.现在有由n个宽度为1,高度分别为h[1,2,3.......n]的长方形从左到右依次排 ...

  4. 我眼中的正则化(Regularization)

    警告:本文为小白入门学习笔记 在机器学习的过程中我们常常会遇到过拟合和欠拟合的现象,就如西瓜书中一个例子: 如果训练样本是带有锯齿的树叶,过拟合会认为树叶一定要带有锯齿,否则就不是树叶.而欠拟合则认为 ...

  5. linux基本

    一.初识 Linux与windows相比的优点是:长期稳定的运行,避免了因为系统的问题导致的项目运行中断:占用资源少:开源软件多. Centos(Community Enterprise Operat ...

  6. MySQL会发生死锁吗?

    SHOW ENGINE INNODB STATUS;来查看死锁日志: SHOW PROCESSLIST;查看进程 MySQL的InnoDB引擎事务有4种隔离级别,主要是为了保证数据的一致性. Inno ...

  7. kaggle竞赛入门整理

    1.Bike Sharing Demand kaggle: https://www.kaggle.com/c/bike-sharing-demand 目的:根据日期.时间.天气.温度等特征,预测自行车 ...

  8. 安装saltstack使用的shell

    sed -i 's/^#//g'  /etc/yum.repos.d/centos6.8.repo sed -i 's/enabled=0/enabled=1/g'  /etc/yum.repos.d ...

  9. Windows-kms

    系统下载 Windows 长期服务版 Windows 10 Enterprise LTSC 2019 (x64) - DVD (Chinese-Simplified) 文件名 cn_windows_1 ...

  10. 【英文文档】 Installing Go from source Go语言官方编译指南 2019.02.27

    Introduction Go is an open source project, distributed under a BSD-style license. This document expl ...