正确应用Java数组
2024-09-01 08:35:40
一、数组的特点
数组与其他容器的区别有三方面:效率、类型和保存基本类型的能力。
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;
最新文章
- 9.27js拓展、bootstrap菜鸟教程
- 无法在提交表单前通过ajax验证解决办法
- 函数类型+WINAPI+函数名(例如inline DWORD static WINAPI RecordToKeys(const DRWT&; theDRWT,WTSBH* pKey,DWORD dwMaxNum)
- log4net 日志写入MongoDB 实现分布式日志
- 从四大音乐APP首页设计对比分析产品方向
- PowerDesigner 业务处理模型( BPM )
- php跨服务器传递对象
- Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法
- CSS实现导航条Tab切换的三种方法
- UI—视图的生命周期
- SpringMVC参数绑定(从请求中接受参数)
- [DeeplearningAI笔记]ML strategy_1_3可避免误差与改善模型方法
- Layer-level的快速算法
- JAVA使用log4j(另SSM框架中使用log4j)
- nginx下wordpress 固定链接问题
- javascript中call、apply、bind详解
- jstack Dump 日志文件中的线程状态
- php使用jquery Form ajax 提交表单,并上传文件
- Spring源码分析(十四)从bean的实例中获取对象
- RabbitMQ入门_01_简介与安装
热门文章
- SQL语句完成Excel数据导入数据库表中流程方法及注意事项
- Javascript中,实现十大排序方法之一(冒泡排序及其优化设想)
- Java虚拟机日志与参数
- 数据结构与算法—二叉排序树(java)
- Executor线程池只看这一篇就够了
- 关于sparksql中设置自定义自增列的相关要点(工作共踩过的坑-1)
- Springboot源码分析之AbstractAdvisorAutoProxyCreator
- Mybatis-plus的使用
- slice splice(数组) 和 slice substr substring split (字符串)的区别
- CodeForces 1200F