正确应用Java数组

suen061 2019-09-17 原文

正确应用Java数组

一、数组的特点

数组与其他容器的区别有三方面:效率、类型和保存基本类型的能力。

1、效率。数组是一种效率最高的存储和随机访问对象引用序列的方式。数组是一段连续地址空间内的线性序列,所以访问非常快。但也要付出点代价,数组对象的大小一旦创建就不能改变。

2、类型。出现泛型之前,只有数组能够保持有类型的对象引用,其他容器只能保存Object的引用。

3、保存基本类型。数组直接保存基本类型的值,使用其他容器需要转换成包装类,效率大大下降。数组在连续的地址空间中保存基本类型的值,对象则保存其引用。

 

二、数组的初始化

1、数组是第一级引用
无论使用哪种类型的数组,数组标识符其实只是一个对象的引用,该对象用来保存数组的值,只读成员length是该对象唯一可以访问的字段。数组对象可以使用new关键字显式创建,也可以使用数组初始化语法隐式创建。
方法需要返回多个值时,可以返回一个数组。这在C语言里面是不行的,C语言里面离开函数创建的数组就被销毁了。

2、一维数组创建

int[] a = new int[10]; //指定空间大小
int[] a = {3,4,5,6,7,19,20};//隐式创建数组,只能用来定义。不能作为参数传递。
int[] a = new int[]{7,9,30,2,19};//可作为参数传递。

 

3、多维数组创建
Java的多维数组是粗糙数组。即不要求低维度的数组长度保持一致。

int[][][] a = new int[10][][];
int[][] a = {{1,2,3,4,5},{8,9,10}};//各维度用{}括起来。
int[][] a = new int[][]{{8,9,4},{3,4,5,6,9}};

 

4、数组与泛型
不能实例化具有参数化类型的数组。

List<String>[] ls = new ArrayList<String>[10];//无效的定义
//可以如下定义
List<String>[] ls = (List<String>[]) new ArrayList[10]; //强制转换。

 

三、Arrays的使用

1、fill()
对所有的元素填充同一个值,对象填充对象的引用。

int[] a = new int[10];
Arrays.fill(a, 10);//填充10
Integer[] a = new Integer[10];
Arrays.fill(a, new Integer(10));//填充10

 

2、equals()
比较两个数组是否相同,条件是数组的长度和每个元素都相同。

 

3、sort()
对数组排序,基本类型的只能按升序。

int[] a = new int[]{3,4,5,2,1,7,9,8,10};
Arrays.sort(a);//升序排列

对象类型数组排序有两种方式。

方式1:类可以比较
class T implements Comparable{
	int s;
	int e;
	public T(int s, int e){
		this.s = s;
		this.e = e;
	}
	public int compareTo(T t){
		return this.s - t.s; //大于0则交换位置
	}
}

T[] a = new T[10];
Arrays.sort(a);

方式2:给类一个比较器
class T{
	int s;
	int e;
	public T(int s, int e){
		this.s = s;
		this.e = e;
	}
}

import java.util.Comparator;
T[] a = new T[10];
Arrays.sort(a, (x, y)-> x.s - y.s);//lambda表达式

 

4、binarySearch()
二分查找,对有序数组进行查找,对象调用比较器或者该对象可比。

Arrays.binarySearch(a, r, (x, y) -> x.s - y.s);//r为待查找的对象。

未找到返回一个负数。

 

5、asList
接收一个序列,或者数组。返回一个List;

 

发表于
2019-09-17 23:27 阳光有点暖 阅读() 评论() 编辑 收藏

 

版权声明:本文为suen061原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/suen061/p/11537994.html

正确应用Java数组的更多相关文章

随机推荐

  1. 在 Kubernetes 上部署 OpenStack 是什么体验

    红蓝出 CP,OpenStack 和 Kubernetes 在一起会怎样? 背景 从去年开始就想深入地学习 K […]...

  2. Jmeter_ForEach控制器实现网页爬虫

    一直以来,爬虫似乎都是写代码去实现的,今天像大家介绍一下Jmeter如何实现一个网页爬虫! Jmeter的爬虫 […]...

  3. 如何操纵已打开的IE窗口 – TIB

    如何操纵已打开的IE窗口 如何操纵已打开的IE窗口: http://www.automationqa.com/ […]...

  4. Linux的初次使用及软件安装

    Linux: 简单的快捷键:   提示键位:tab,也是比较常用的键   输入当前目录的绝对路径:pwd    […]...

  5. 14-网页,网站,微信公众号基础入门(网页版MQTT,小试牛刀) – 杨奉武

    14-网页,网站,微信公众号基础入门(网页版MQTT,小试牛刀) https://www.cnblogs.co […]...

  6. HTML5 WEB SQL 无法创建数据表的问题

    不知是什么原因, 反复试, 最后发现是数据表的某一列的字段用的是'check', 把它改了后, 就一切顺利了:无法创建数据表:db.transaction(function (tx) { tx.executeSql(...

  7. Zookeeper一致性协议——ZAB

    ZAB协议简介 Zookeeper通过ZAB保证分布式事务的最终一致性。 ZAB全称Zookeeper Ato […]...

  8. delete如何找到多重继承对象的内存块起始地址

    0.多重继承情况下,对象创建时会生成多个续表指针,用于转换成不同基类时的操作。     为了实现不同基类都能通 […]...

展开目录

目录导航