Java数组之二维数组
Java中除了一维数组外,还有二维数组,三维数组等多维数组。本文以介绍二维数组来了解多维数组。
1.二维数组的基础
二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组。
二维数组表示行列二维结构
2.二维数组的声明
二维数组有三种声明方式。
2.1.根据二维数组的定义
import java.util.Arrays;
public class Test05{
public static void main(String[] args){
//根据二维数组的定义
//二维数组
//int[] arr;
//(int[])[]arr; //声明
int[][] arr;
//初始化一个能存三个一维数组的二维数组
arr = new int[3][];
//赋值
int[] arr1 = {3,4,5,7};
int[] arr2 = {3,4,6};
int[] arr3 = {3,4,7,8}; arr[0] = arr1;
arr[1] = arr2;
arr[2] = arr3; System.out.print(arr);
System.out.println(Arrays.toString(arr));
}
}
此时arr = new int[3][];只分配了二维数组的空间,一维数组没有分配空间。
2.2.声明一个规则的二维数组
import java.util.Arrays;
public class Test06{
public static void main(String[] args){
//声明一个规则的二维数组,3行4列
int[][] arr = new int[3][4];
arr[0][0]=10;
arr[0][1]=10;
arr[0][2]=10;
arr[0][3]=10; arr[1][0]=10;
arr[1][1]=10;
arr[1][2]=10;
arr[1][3]=10; arr[2][0]=10;
arr[2][1]=10;
arr[2][2]=10;
arr[2][3]=10; System.out.println(Arrays.toString(arr));
}
}
此时,二维数组已经分配好空间,同时一维也分配好空间。
2.3.当已知二维数组元素的数值,可以考虑字面量声明
import java.util.Arrays;
public class Test02{
public static void main(String[] args){
//已知数组元素,二维数组的声明方式
int[][] arr ={
{10,20,30,40},
{100,200,300},
{1000,2000,3000,4000}
};
System.out.println(Arrays.toString(arr));
}
}
3.二维数组的遍历
import java.util.Arrays;
public class Test02{
public static void main(String[] args){
//已知数组元素,二维数组的声明方式
int[][] arr ={
{10,20,30,40},
{100,200,300},
{1000,2000,3000,4000}
};
//遍历二维数组
for(int i = 0;i<arr.length;i++){ //行数遍历二维数组
for(int j = 0;j<arr[i].length;j++){ //列的元素
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
总结:
二维数组是行列结构,使用双层for循环,外层for用于控制行,内层for用于控制列=>行列结构 => 双层for遍历。
以上,我们就了解完二维数组的基本知识了。
此外,在学习数组知识的时候有一些细节是需要我们注意的,就是基本数据类型和引用数据类型赋值的区别。接下来我们通过一些小练习来讲解一下基本数据类型和引用数据类型赋值的区别。
4.基本数据类型和引用数据类型赋值的区别
import java.util.Arrays;
public class Test09{
public static void main(String[] args){ // 基本数据类型的赋值
int a = 10;
int b;
b = a;
// a? b?
b = 20;
// a? b? // 引用数据类型的赋值
int[] arr = {1,3,5};
int[] arr2 = arr;
arr2[0] = 100; System.out.println("arr:"+arr);
System.out.println("arr2:"+arr2);
System.out.println("arr[0]:"+arr[0]);
}
}
通过图解来加深理解。
总结:
基本数据类型赋值时,复制的是值
引用数据类型赋值时,复制的是引用。
5.Arrays类
在上面,我们运用了Array类,关于Array类我们也来讲解一下关于Array类的用法。
jdk中为了便于开发,给开发者提供了Arrays类,其中包含了很多数组的常用操作。例如快速输出、排序、查找等。
5.1常用用法
import java.util.Arrays;
public class Test00{
public static void main(String[] args){
//Arrays类的常用方法
int[] arr = {4,3,7,8};
//【1】数组的字符串形式
String str = Arrays.toString(arr);
System.out.println(str); //【2】sort对数组进行排序(只能是升序)->内部使用快速排序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); /*【3】fill 填充数组 Arrays.fill(arr,fromIndex,toIndex,填充的值);
*toIndex:结束下标不包含,(含头不含尾)
*/
//Arrays.fill(arr,0,4,2);
//System.out.println(Arrays.toString(arr)); //【4】equals(arr1,arr2)判断两个数组是否相等。
//数组相等的条件是:a.长度相等 b.两个数组对应位置的元素相等
int[] arr3 = {3,4,7,8};
System.out.println(Arrays.equals(arr,arr3));
}
}
5.2.二分法查找
import java.util.Arrays;
public class Test03{
public static void main(String[] args){
//二分法查找,二分法查找必须是有序的数组,如果找到返回索引;
//源码
/*private static int binarySearch0(long[] a, int fromIndex, int toIndex,
long key) {
int low = fromIndex;
int high = toIndex - 1; while (low <= high) {
int mid = (low + high) >>> 1; //除2
long midVal = a[mid]; if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found. low为插入点,即Key应该放在数组中的位置
}
*/ /*二分法查找数组的元素(有序的数组),返回的是元素的下标,binarySearch(arr,fromIndex,toIndex,key)
*a - 要搜索的数组
key - 要搜索的值
*/
int[] arr = {1,2,4,5,7,8};
int a = Arrays.binarySearch(arr,4);//找4的索引
System.out.println("要找的值的位置为:"+a);
}
}
5.3数组的复制
import java.util.Arrays;
public class Test01{
public static void main(String[] args){
//数组的复制
int[] arr = {1,3,4,6,8};
int[] newArr = Arrays.copyOf(arr,5);//复制到一个新数组
System.out.println(Arrays.toString(newArr)); //copyOfRange(arr,from,to) from:开始的位置(包含) to:目标位置(不包含) 含头不含尾 int[] newArr2 = Arrays.copyOfRange(arr,1,3);
System.out.println(Arrays.toString(newArr2)); //其中System也提供了赋值数组的方法。
//arraycopy(object str,int srcPos,object dest,int destPos,int length)
/*
*arraycopy(srcArr,srcPos,destArr,destPos,len)
srcArr:要复制的源数组
srcPos:从srcArr的srcPos位置开始复制
destArr:复制到的目标数组
destPos:目标数组从destPos开始存放
len:从源数组中复制len个长度
*/
int[] arr2 = new int[arr.length];
System.arraycopy(arr,1,arr2,0,4);
System.out.println(Arrays.toString(arr2));
}
}
Java数组之二维数组的更多相关文章
- Java中的二维数组
Java 中的二维数组 所谓二维数组,可以简单的理解为是一种"特殊"的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: 1. 声明数组并分配空 ...
- java学习之二维数组
java当中的二维数组,存储一组比较特殊的对象.他存储一个数组,同时存储的数组当中又存储着元素. java二维数组的声明方式一: class Arr2Demo { public static void ...
- java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象
1. java.util.Arrays 数组工具类 Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...
- java基础5 (一维)数组和二维数组
本文知识点(目录): 一维数组(一维数组的概念.优点.格式.定义.初始化.遍历.常见异常.内存分析以及常见操作(找最大值.选择排序.冒泡排序等等)) 二维数组(二维数组的遍历.排序.查找.定义. ...
- JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数
JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数 示例如下 至少需要九个元素:"A","B","C",&q ...
- 【转】java中定义二维数组的几种写法
原文链接 注:以下的 type[][] var 也可以这样申明 type var[][] type为数组的类型,var为变量名 写法一:行列固定的数组 //定义二维数组写法1 class Test { ...
- Java中一维,二维数组的静态和动态初始化
今天我们要开始来讲讲Java中的数组,包括一维数组和二维数组的静态初始化和动态初始化 数组概述: 数组可以看成是多个相同类型数据的组合,对这些数据的统一管理; 数组变量属于引用数据类型,数组也可以看成 ...
- Java编程基础——数组和二维数组
Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...
- 一维数组、二维数组——Java
一. 一维数组 1. 数组是相同类型数据的有序集合 相同类型的若干个数据,按照一定先后次序排列组合而成 每个数组元素可以通过一个下标来访问它们 其中,每一个数据称作一个数组元素 2. 数组特点: 其 ...
随机推荐
- pip错误-failed to create process/fatal error in launcher
电脑同时装了python2和python3,并且都配置了环境变量 将python2的python.exe改成python2.exe,python3的python.exe没有改(主要用python2时则 ...
- 快速启动FTP下载服务器
nohup python -m SimpleHTTPServer 8000 > myout.file 2>&1 &
- UOJ#172. 【WC2016】论战捆竹竿 字符串 KMP 动态规划 单调队列 背包
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ172.html 题解 首先,这个问题显然是个背包问题. 然后,可以证明:一个字符串的 border 长度可 ...
- css3实现水平垂直居中
1.transform实现居中(未设宽高) <div id="wrap">内容</div> <style> #wrap{ padding:50p ...
- Python WMI获取Windows系统信息
#!/usr/bin/env python # -*- coding: utf-8 -*- #http://www.cnblogs.com/liu-ke/ import wmi import os i ...
- Python中os与sys两模块的区别
<os和sys的官方解释> ➤os os: This module provides a portable way of using operating system dependent ...
- [转] Java程序员学C#基本语法两个小时搞定(对比学习)
Java程序员学C#基本语法两个小时搞定(对比学习) 对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. ...
- North American Invitational Programming Contest 2018
A. Cut it Out! 枚举第一刀,那么之后每切一刀都会将原问题划分成两个子问题. 考虑DP,设$f[l][r]$表示$l$点顺时针一直到$r$点还未切割的最小代价,预处理出每条边的代价转移即可 ...
- 清除电脑缓存的bat文件
电脑在使用了之后,会产生垃圾缓存,若不及时清理会降低电脑的运行速度. 1.步骤: 2.新建一个记事本文件,命名“系统清理”;(或其他名字) 3.原封不动复制下面的文字到该记事本中 @echo off ...
- [LeetCode] Binary Tree Pruning 二叉树修剪
We are given the head node root of a binary tree, where additionally every node's value is either a ...