《Java编程思想》笔记 第十六章 数组
1 数组
- 数组和容器比较,数组的优点也只剩访问效率高这一点了。
2 数组是第一级对象
- 数组也是一个对象,和其他普通对象一样在堆中创建, int[ ] arr arr是数组的引用。
- 可以隐式创建数组对象,也可以new显式创建数组对象
int[] ints = {1 ,8 ,9}; //聚集初始化
/*动态聚集初始化,任意位置创建并初始化,
* 有时候传一个数组类型参数时代码更简单*/
int[] iArr = new int[]{2 , 5 , -12 , 20};
int[] arr = new int[3];//只定义了大小 - 对象数组中数组存的是对象的引用,基本类型数组直接存值
- length表示数组大小,不表示数组内具体存有多少个元素。
3 返回一个数组
- 和返回一个普通类型没区别
4 多维数组
- Java没有多维数组,任何多维数组都可以看成一维数组内引用一维数组
- 初始化多维数组时可以先只初始化最左边的维数,此时该数组的每个元素都相当于一个数组引用变量,这些数组元素还需要进一步初始化
- int a = new int[2][3][5] ; 直接定义大小,这样的数组是个规则的多维数组
- 逐步定义大小如下:
int[][][] a = new int[2][][];
System.out.println("a.length="+a.length); //a中只有2个元素a[0],a[1]它们是一个二维数组的引用
a[0]=new int[3][];
a[1]=new int[3][];
System.out.println("a[1].length="+a[1].length);//a[1]中3个元素a[1][0],a[1][1],a[1][2]他们是一维数组的引用
a[0][1] = new int[5];
System.out.println("a[0][1].length="+a[0][1].length);// a[0][1] 中有5个元素a[0][1][0]-a[0][1][4]
System.out.println(Arrays.deepToString(a));
/* a.length=2
a[1].length=3
a[0][1].length=5
[[null, [0, 0, 0, 0, 0], null], [null, null, null]]
*/ - 逐步定义大小可以定义出不规则多维数组,如
a[0]=new int[3][];
a[1]=new int[2][]; - 打印多维数组Arrays.deepToString();
- 数据存在[5]这个数组中,其他[2]和[3]都存的引用。
5 数组与泛型
- 可以创建泛型数组引用 Fruit<Apple>[ ] apples;
- 但不能实例化具有泛型的数组如 apples = new Fruit<Apple>[ ];
6 填充数组
- Array.fill(Object[] a, int fromIndex, int toIndex, Object val) 使用val值填充范围内的每一个值,没有范围就填充全部值,此方法被重载了很多次可以适用任何类型。缺点就是只能用一个值填充。
7 Arrays类库
- java.util.Arrays 类库是用来操作数组的,全部为static方法
- 复制数组
- 可以使用System.arraycopy(Object src, int srcPos,Object dest, int destPos,int length); 参数有(源数组,偏移量,目标数组,偏移量,长度)长度+源/目标数组偏移量后不能越界。会将目标数组偏移量后指定长度的元素替换为源数组的偏移量后指定长度的元素,此方法是本地方法直接内存操作具有较高的效率,但对于对象类型数组只是复制了一份引用而已,并没有复制对象,这也叫浅度复制。并且没有实现自动包装。
- 1.6开始 可以使用 Arrays.copyO f(int [] original, int newLength) ,复制一份数组如果新数组长度大于源数组长度则用0或null填充,属于深复制。
- copyOfRange(char[] original, int from, int to) 深度复制
- 数组比较
- Arrays.equals(a1, b1) 相同的条件是数组元素个数相等,相同位置元素内容相同。Arrays的equals()是重载过的是基于内容比较。
- 多维数组使用Arrays.deepEquals()比较。
- 数组元素比较
- 一个类实现Comparable接口,重写compareTo()方法后就具有了比较能力。,至于什么跟什么比可以根据要求决定写在compareTo(Object a)方法里,
如果指定的数与参数相等返回0。
如果指定的数小于参数返回 -1。
如果指定的数大于参数返回 1。
- 实现Comparable接口后调用Arrays.sort()方法就会自动升序排序。
- 一个类实现Comparable接口,重写compareTo()方法后就具有了比较能力。,至于什么跟什么比可以根据要求决定写在compareTo(Object a)方法里,
- 数组排序
- Arrays.sort(Object[] a) a 必须实现Comparable接口
- Arrays.sort(T[] a, Comparator<? super T> c) Comparator比较器接口,可以创建自己需要的比较规则在compare(Object a, Object b)方法实现即可。可以对没有实现Comparable接口的类或者Comparable比较方式不符合要求的对象按自己需求比较.
1、o1大于o2,返回正整数
2、o1等于o2,返回0
3、o1小于o3,返回负整数
- Comparable.compareTo(Object a)也称自然排序,内比较器,自己内的元素排序。Comparator.compare(Object a, Object b) 外比较器,比较对象属性,无法对基本类型数组排序。
- 在已经排序的数组中查找
- Arrays.binarySearch(Object[] a, Object key) 如果找到返回索引,找不到返回一个负值,该负值= -(插入点)-1 ,插入点为第一个比Key大的元素的索引。
- 对于使用了Comparator排序的对象数组要使用 binarySearch(T[] a, T key, Comparator<? super T> c) 查找
- 基本数据类型数组无法使用 binarySearch(T[] a, T key, Comparator<? super T> c)
知识点:
- 二维数组a[ ][ ] 中 a.length 就是行数row, a[0].length就是列数column。
《Java编程思想》笔记 第十六章 数组的更多相关文章
- java编程思想笔记(1)
java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...
- 《HTTP 权威指南》笔记:第十六章&第十七章 国际化、内容协商与转码
<HTTP 权威指南>笔记:第十六章 国际化 客户端通过在请求报文中的 Accept-Language 首部和 Accept-Charset 首部来告知服务器:“我理解这些语言.”服务器通 ...
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
- 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记
第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...
- #Java编程思想笔记(一)——static
Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...
- 2.1(java编程思想笔记)位移操作
java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...
- 【学习笔记】《Java编程思想》 第1~7章
第一章 对象导论 对整书的概要. 略读. 第二章 一切都是对象 创建一个引用,指向一个对象. 安全的做法:创建一个引用的同时便进行初始化. 对象存储的地方:1)寄存器:这是最快的存储区,因为它位于不同 ...
- java编程思想第四版第九章习题
第三题 package net.mindview.interfaces; abstract class Base{ public Base(){ print(); } abstract void pr ...
- 《Linux命令行与shell脚本编程大全》第十六章 控制脚本
一些控制脚本的方式:向脚本发送信号.修改脚本优先级,在脚本运行时切换到运行模式 16.1 处理信号 linux利用信号与运行在系统中的进程进行通信. 也可以通过对脚本进行编程,使其在收到特定信号时执行 ...
随机推荐
- lock关键字的使用
最近在代码中,发现别人使用了lock关键字,为了理解别人写的代码,所以自己对lock关键字的使用研究了下. 微软官方解释,请百度:lock 语句(C# 参考) 微软给了个官网实例代码: class A ...
- lintcode-103-带环链表 II
带环链表 II 给定一个链表,如果链表中存在环,则返回到链表中环的起始节点的值,如果没有环,返回null. 样例 给出 -21->10->4->5, tail connects to ...
- PAT 甲级 1002 A+B for Polynomials
https://pintia.cn/problem-sets/994805342720868352/problems/994805526272000000 This time, you are sup ...
- maven中进行go的编译
maven提供的插件maven-antrun-plugin真是个好东东,使得maven可以利用ant的很多功能. 最近需要实现在maven中实现对go代码的编译,添加如下代码在pom文件中即可. &l ...
- c# 调用 matlab 引发初始化错误 异常
1. 除了matlab 编译的DLL 意外还需要引用 MWArray.dll 这个dill 在安装了 MCRInstaller.exe(matlab运行环境之后就会有了): 2. 最重要的一点.ne ...
- json数据中的某一个字段进行快速排序quicksort
快速排序(Quicksort)是对冒泡排序的一种改进,是一种分而治之算法归并排序的风格. 核心的思想就是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小 ...
- hdu 3231 Box Relations (拓扑排序)
Box Relations Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Linux相关——关于文件调用
本文主要记录几个常见文件调用(表示为了造数据试了n种方法,,,发现了一些神奇的东西,会在下面一一说明. 首先在程序中我们可以打开和关闭程序. 常见的freopen用法简单,但是只能使用一次,如果在程序 ...
- POJ1847:Tram(最短路)
Tram Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20116 Accepted: 7491 题目链接:http:/ ...
- Death Note
注:本文系作者原创,但可随意转载. ********************************************************************************** ...