30212Java_数组
数组
1.综述
数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。
数组的三个基本特点:
1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
2. 其元素必须是相同类型,不允许出现混合类型。
3. 数组类型可以是任何数据类型,包括基本类型和引用类型。
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中存储的。
2.一维数组简介
2.1 声明方式
一维数组
type[] arr_name; //(推荐使用这种方式)
type arr_name[];
注意:
1. 声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。
2. 声明一个数组的时候并没有数组真正被创建。
3. 构造一个数组,必须指定长度。
//创建基本类型一维数组
public class Test {
public static void main(String args[]) {
int[] s = null; // 声明数组;
s = new int[10]; // 给数组分配空间;
for (int i = 0; i < 10; i++) {
s[i] = 2 * i + 1;//给数组元素赋值;
System.out.println(s[i]);
}
}
}
//创建引用类型一维数组
class Man{
private int age;
private int id;
public Man(int id,int age) {
super();
this.age = age;
this.id = id;
}
}
public class AppMain {
public static void main(String[] args) {
Man[] mans; //声明引用类型数组;
mans = new Man[10]; //给引用类型数组分配空间; Man m1 = new Man(1,11);
Man m2 = new Man(2,22); mans[0]=m1;//给引用类型数组元素赋值;
mans[1]=m2;//给引用类型数组元素赋值;
}
}
2.2 初始化
数组的初始化方式总共有三种:静态初始化、动态初始化、默认初始化。
2.2.1 静态初始化
除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。
int[] a = { 1, 2, 3 };// 静态初始化基本类型数组;
Man[] mans = { new Man(1, 1), new Man(2, 2) };// 静态初始化引用类型数组;
//表格数据模型是计算机世界最普遍的模型
//可以使用一个一维数组存储表格每一行
Object[] a1 = {111,"num1",18,"first","2001-1-11"};
Object[] a2 = {112,"num2",19,"second","2001-11-11"};
Object[] a3 = {113,"num3",20,"last","2001-1-1"};
//此处基本数据类型”1001”,本质不是Object对象。
//JAVA编译器会自动把基本数据类型“自动装箱”成包装类对象。
2.2.2 动态初始化
数组定义与为数组元素分配空间并赋值的操作分开进行
int[] a1 = new int[2];//动态初始化数组,先分配空间;
a1[0]=1;//给数组元素赋值;
a1[1]=2;//给数组元素赋值;
2.2.3 数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,
因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
//数组的默认初始化
int a2[] = new int[2]; // 默认值:0,0
boolean[] b = new boolean[2]; // 默认值:false,false
String[] s = new String[2]; // 默认值:null, null
2.3 数组遍历
2.3.1 length
数组元素下标的合法区间:[0, length-1]
可以通过下标来遍历数组中的元素,遍历时可以读取元素的值或者修改元素的值
//使用循环遍历初始化和读取数组
public class Test {
public static void main(String[] args) {
int[] a = new int[4];
//初始化数组元素的值
for(int i=0;i<a.length;i++){
a[i] = 100*i;
}
//读取元素的值
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
}
length字段的使用
对于一维数组,“数组名.length”的值就是数组中元素的个数;
对于二维数组“数组名.length”的值是它含有的一维数组的个数
例如: float boy []=new float[4];
boy.length的值为4.
int [][] a = new int[3][8];
a.length的值是3.
a[0].length的值是8
a[1].length的值是8
a[2].length的值是8
2.3.2 for - each
增强for循环for-each是JDK1.5新增加的功能,
专门用于读取数组或集合中所有的元素,即对数组进行遍历
//增强for循环
public class Test {
public static void main(String[] args) {
String[] ss = { "aa", "bbb", "ccc", "ddd" };
for (String temp : ss) {
System.out.println(temp);
}
}
}
注意:
1. for-each增强for循环在遍历数组过程中不能修改数组中某元素的值。
2. for-each仅适用于遍历,不涉及有关索引(下标)的操作。
2.4数组元素的使用
一维数组通过索引(下标运算)符访问自己的元素。如:boy[0],boy[1]等.
需要注意的是索引从0开始,因此,数组若有4个元素,那么索引到3为止,如果程序使用了如下语句:
boy[4] = 384.98f;
程序可以编译通过,但运行时将发生ArrayIndexOutOfBoundsException异常,因此在使用数组时必须谨慎,防止索引越界。
3.多维数组
多维数组可以看成以数组为元素的数组。
可以有二维、三维、甚至更多维数组,但是实际开发中用的非常少。
最多到二维数组(学习容器后,我们一般使用容器,二维数组用的都很少)
3.1 二维数组
3.1.1 二维数组的声明
声明二维数组有下列两种格式:
数组的元素类型 数组名[][];
数组的元素类型 [][] 数组名;
//例如:
float a[][];
Char [][] b;
public class Test {
public static void main(String[] args) {
// Java中多维数组的声明和初始化应按从低维到高维的顺序进行
int[][] a = new int[3][];
a[0] = new int[2];
a[1] = new int[4];
a[2] = new int[3];
// int a1[][]=new int[][4];//非法
}
}
3.1.2 二维数组初始化
1)二维数组静态初始化
//二维数组静态初始化
public class Test {
public static void main(String[] args) {
int[][] a = { { 1, 2, 3 }, { 3, 4 }, { 3, 5, 6, 7 } };
System.out.println(a[2][3]);
}
}
2)二维数组的动态初始化
//二维数组的动态初始化
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[][] a = new int[3][];
// a[0] = {1,2,5}; //错误,没有声明类型就初始化
a[0] = new int[] { 1, 2 };
a[1] = new int[] { 2, 2 };
a[2] = new int[] { 2, 2, 3, 4 };
System.out.println(a[2][3]);
System.out.println(Arrays.toString(a[0]));
System.out.println(Arrays.toString(a[1]));
System.out.println(Arrays.toString(a[2]));
}
}
//可以为二维数组中的一维数组专门分配空间
//二维数组保存表格数据
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Object[] a1 = {1001,"高淇",18,"讲师","2006-2-14"};
Object[] a2 = {1002,"高小七",19,"助教","2007-10-10"};
Object[] a3 = {1003,"高小琴",20,"班主任","2008-5-5"};
Object[][] emps = new Object[3][];
emps[0] = a1;
emps[1] = a2;
emps[2] = a3;
System.out.println(Arrays.toString(emps[0]));
System.out.println(Arrays.toString(emps[1]));
System.out.println(Arrays.toString(emps[2]));
}
}
3.1.3 获取数组长度
//获取的二维数组第一维数组的长度。
System.out.println(a.length);
//获取第二维第一个数组长度。
System.out.println(a[0].length);
length字段的使用
对于一维数组,“数组名.length”的值就是数组中元素的个数;
对于二维数组“数组名.length”的值是它含有的一维数组的个数
例如: float boy []=new float[4];
boy.length的值为4.
int [][] a = new int[3][8];
a.length的值是3.
a[0].length的值是8
a[1].length的值是8
a[2].length的值是8
4.数组与类
4.1 System类
4.1.1 数组拷贝
System类里也包含了一个static void arraycopy(object src,int srcpos,object dest, int destpos,int length)方法,
该方法可以将src数组里的元素值赋给dest数组的元素,
其中srcpos指定从src数组的第几个元素开始赋值,length参数指定将src数组的多少个元素赋给dest数组的元素。
//数组拷贝
public class Test {
public static void main(String args[]) {
String[] s = {"test1","new1","test2","new2","test3"};
String[] sBak = new String[6];
System.arraycopy(s,0,sBak,0,s.length);
for (int i = 0; i < sBak.length; i++) {
System.out.print(sBak[i]+ "\t");
}
}
}
4.2 java.util.Arrays类
JDK提供的java.util.Arrays类,包含了常用的数组操作,方便我们日常开发。
Arrays类包含了:排序、查找、填充、打印内容等常见的操作
4.2.1 打印数组
import java.util.Arrays;
public class Test {
public static void main(String args[]) {
int[] a = { 1, 2 };
System.out.println(a); // 打印数组引用的值;
System.out.println(Arrays.toString(a)); // 打印数组元素的值;
}
}
// [I@15db9742
//[1,2]
注意:
此处的Arrays.toString()方法是Arrays类的静态方法,不是前面讲的Object的toString()方法。
4.2.2 数组元素的排序
import java.util.Arrays;
public class Test {
public static void main(String args[]) {
int[] a = {1,2,323,23,543,12,59};
System.out.println(Arrays.toString(a));
Arrays.sort(a);
System.out.println(Arrays.toString(a));
}
}
//数组元素是引用类型的排序(Comparable接口的应用)
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Man[] msMans = { new Man(3, "a"), new Man(60, "b"), new Man(2, "c") };
Arrays.sort(msMans);
System.out.println(Arrays.toString(msMans));
}
} class Man implements Comparable {
int age;
int id;
String name; public Man(int age, String name) {
super();
this.age = age;
this.name = name;
} public String toString() {
return this.name;
} public int compareTo(Object o) {
Man man = (Man) o;
if (this.age < man.age) {
return -1;
}
if (this.age > man.age) {
return 1;
}
return 0;
}
}
数组元素是引用类型的排序(Comparable接口的应用)
4.2.3 二分法查找
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] a = {1,2,323,23,543,12,59};
System.out.println(Arrays.toString(a));
Arrays.sort(a); //使用二分法查找,必须先对数组进行排序;
System.out.println(Arrays.toString(a));
//返回排序后新的索引位置,若未找到返回负数。
System.out.println("该元素的索引:"+Arrays.binarySearch(a, 12));
}
}
4.2.4 数组填充
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] a= {1,2,323,23,543,12,59};
System.out.println(Arrays.toString(a));
Arrays.fill(a, 2, 4, 100); //将2到4索引的元素替换为100;
System.out.println(Arrays.toString(a));
}
}
总结
1. 数组是相同类型数据的有序集合。
2. 数组的四个基本特点:
-- 其长度是确定的
-- 其元素必须是相同类型
-- 可以存储基本数据类型和引用数据类型
-- 数组变量属于引用类型
3. 一维数组的声明方式
-- type[] arr_name; (推荐使用这种方式)
-- type arr_name[]。
4. 数组的初始化:静态初始化、动态初始化和默认初始化。
5. 数组的长度:数组名.length,下标的合法区间[0,数组名.length-1]。
6. 数组拷贝:System类中的static void arraycopy(object src,int srcpos,object dest, int destpos,int length)方法。
7. 数组操作的常用类java.util.Arrays类
-- 打印数组:Arrays.toString(数组名);
-- 数组排序:Arrays.sort(数组名);
-- 二分查找:Arrays.binarySearch(数组名,查找的元素)。
8. 二维数组的声明
-- type[][]arr_name=new type[length][];
-- type arr_name[][]=new type[length][length]。
30212Java_数组的更多相关文章
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- JavaScript常见的五种数组去重的方式
▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...
- js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的
题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...
- javascript数组查重方法总结
文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
随机推荐
- Struts2——(7)拦截器组件
AOP:面向切面编程(通过配置文件来指定作用到目标对象) OOP:面向对象编程 AOP具有很好的可插拔特性,很灵活. 可用于封装共通的业务处理,之后可以通过配置作用到Action组件上. 共通的业务处 ...
- JScript实现将指定目录下的vc工程加到解决方案
作者:朱金灿 来源:http://blog.csdn.net/clever101 main(); function main() { try { var WSShell = WScript.Creat ...
- 追本溯源 —— 句型、表达、模式,pattern,著名的话
** 时候,做了 ** 事,是我 **,做得最对的一件事: "Winning that ticket was the best thing that ever happened to me& ...
- python3使用Lxml库操作XPath
download address: http://pypi.python.org/pypi/lxml/2.3 lxml is a Pythonic, mature binding for the li ...
- 超平面(hyperplane)的定义
Hyperplane - Wikipedia Hyperplane – from Wolfram MathWorld a1,a2,-,an 为一组不全为 0 的纯量,如下定义的集合 S 由这样的向量构 ...
- WPF多点触摸放大缩小旋转
原文:WPF多点触摸放大缩小旋转 版权声明:本文为博主原创文章,需要转载尽管转载. https://blog.csdn.net/z5976749/article/details/40118437 如果 ...
- IT该忍者神龟Oracle 树操作(select…start with…connect by…prior)
oracle树查询的最重要的就是select-start with-connect by-prior语法了.依托于该语法.我们能够将一个表形结构的以树的顺序列出来. 在以下列述了oracle中树型查询 ...
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :- ...
- WPF 用代码调用dynamic resource动态更改背景 - CSDN博客
原文:WPF 用代码调用dynamic resource动态更改背景 - CSDN博客 一般dynamic resoource通常在XAML里调用,如下范例: <Button Click=&qu ...
- Win10自带应用不喜欢?一条命令全部卸载
与Win8/Win8.1一样,Win10中继续内置了应用商店,所不同的是Windows10中已升级为通用应用商店,具有跨平台特性.可能有的朋友仍不喜欢使用Modern应用,因为传统桌面应用几乎能够满足 ...