《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利用信号与运行在系统中的进程进行通信. 也可以通过对脚本进行编程,使其在收到特定信号时执行 ...
随机推荐
- 【转】The best career advice I’ve received
原文地址:http://www.nczonline.net/blog/2013/10/15/the-best-career-advice-ive-received/ I recently had an ...
- linux mysql 链接数太小
Data source rejected establishment of connection, message from server: "Too many connections&q ...
- Struts2值栈
一.前言 很多事儿啊,就是“成也萧何败也萧何”,细想一些事儿心中有感,当然,感慨和本文毛关系都没有~想起之前有篇Struts2中值栈的博客还未完工,就着心中的波澜,狂咽一把~ 二.正文 博文基于:st ...
- 用 xampp 在ubuntu 下配置php 运行环境 lampp
在linux下搭建php的运行环境,可以分别安装apache.mysql .php .phpmyadmin,也可以安装xampp(apache.mysql .php .phpmyadmin)集成包 ...
- servletContext的定义
- ASP.NET页面之间传值Application(5)
Application对象的作用范围是整个全局,也就是说对所有用户都有效.它在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所 以可以在不同页面中对它进行存取.它和Session变量的区别 ...
- AGC016C +/- Rectangle(构造)
题目大意:给定H,W,h,w四个数,求是否满足矩阵的全部数之和和正数,h行w列之和为负数 如果h和w恰好是H,W的约数,则肯定不存在 否则肯定存在 只需要把h,w内每个元素填的足够大,然后小矩形的最后 ...
- FFT多项式乘法模板
有时间来补算法原理orz #include <iostream> #include <cstdio> #include <cmath> #include <c ...
- [AT2558]Many Moves
题目大意:有$n$个位置$1,2,\dots n$:你有两个棋子$A$和$B$,你要进行$q$次操作,第$i$次操作给定一个$x_i$,你要选择一个棋子移动到$x_i$:求两个棋子最小移动的步数之和. ...
- [洛谷P2626]斐波那契数列(升级版)
题目大意:请你求出第$n$个斐波那契数列的数$mod 2^{31}$之后的值.并把它分解质因数. 题解:乱搞 卡点:1.忘记取模 C++ Code: #include<cstdio> #i ...