1 数组

  • 数组和容器比较,数组的优点也只剩访问效率高这一点了。

2 数组是第一级对象

  • 数组也是一个对象,和其他普通对象一样在堆中创建, int[ ] arr  arr是数组的引用。
  1. 可以隐式创建数组对象,也可以new显式创建数组对象

        int[] ints = {1 ,8 ,9}; //聚集初始化
    /*动态聚集初始化,任意位置创建并初始化,
    * 有时候传一个数组类型参数时代码更简单*/
    int[] iArr = new int[]{2 , 5 , -12 , 20};
    int[] arr = new int[3];//只定义了大小
  2. 对象数组中数组存的是对象的引用,基本类型数组直接存值
  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 填充数组

  1. Array.fill(Object[] a, int fromIndex, int toIndex, Object val) 使用val值填充范围内的每一个值,没有范围就填充全部值,此方法被重载了很多次可以适用任何类型。缺点就是只能用一个值填充。

7 Arrays类库

  • java.util.Arrays 类库是用来操作数组的,全部为static方法
  1. 复制数组
    1. 可以使用System.arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length); 参数有(源数组,偏移量,目标数组,偏移量,长度)长度+源/目标数组偏移量后不能越界。会将目标数组偏移量后指定长度的元素替换为源数组的偏移量后指定长度的元素,此方法是本地方法直接内存操作具有较高的效率,但对于对象类型数组只是复制了一份引用而已,并没有复制对象,这也叫浅度复制。并且没有实现自动包装。
    2. 1.6开始 可以使用 Arrays.copyO f(int [] original, int newLength) ,复制一份数组如果新数组长度大于源数组长度则用0或null填充,属于深复制。
    3. copyOfRange(char[] original, int from, int to)  深度复制
  2. 数组比较
    1. Arrays.equals(a1, b1) 相同的条件是数组元素个数相等,相同位置元素内容相同。Arrays的equals()是重载过的是基于内容比较。
    2. 多维数组使用Arrays.deepEquals()比较。
  3. 数组元素比较
    1. 一个类实现Comparable接口,重写compareTo()方法后就具有了比较能力。,至于什么跟什么比可以根据要求决定写在compareTo(Object a)方法里,

      • 如果指定的数与参数相等返回0。

      • 如果指定的数小于参数返回 -1。

      • 如果指定的数大于参数返回 1。

    2. 实现Comparable接口后调用Arrays.sort()方法就会自动升序排序。
  4. 数组排序
    1. Arrays.sort(Object[] a)   a 必须实现Comparable接口
    2. 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,返回负整数

    3. Comparable.compareTo(Object a)也称自然排序,内比较器,自己内的元素排序。Comparator.compare(Object a, Object b) 外比较器,比较对象属性,无法对基本类型数组排序。
  5. 在已经排序的数组中查找
    1. Arrays.binarySearch(Object[] a, Object key)  如果找到返回索引,找不到返回一个负值,该负值=  -(插入点)-1 ,插入点为第一个比Key大的元素的索引。
    2. 对于使用了Comparator排序的对象数组要使用 binarySearch(T[] a, T key, Comparator<? super T> c) 查找
    3. 基本数据类型数组无法使用 binarySearch(T[] a, T key, Comparator<? super T> c)

知识点:

  1. 二维数组a[ ][ ] 中 a.length 就是行数row, a[0].length就是列数column。

《Java编程思想》笔记 第十六章 数组的更多相关文章

  1. java编程思想笔记(1)

    java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...

  2. 《HTTP 权威指南》笔记:第十六章&第十七章 国际化、内容协商与转码

    <HTTP 权威指南>笔记:第十六章 国际化 客户端通过在请求报文中的 Accept-Language 首部和 Accept-Charset 首部来告知服务器:“我理解这些语言.”服务器通 ...

  3. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

  4. 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记

    第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...

  5. #Java编程思想笔记(一)——static

    Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...

  6. 2.1(java编程思想笔记)位移操作

    java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...

  7. 【学习笔记】《Java编程思想》 第1~7章

    第一章 对象导论 对整书的概要. 略读. 第二章 一切都是对象 创建一个引用,指向一个对象. 安全的做法:创建一个引用的同时便进行初始化. 对象存储的地方:1)寄存器:这是最快的存储区,因为它位于不同 ...

  8. java编程思想第四版第九章习题

    第三题 package net.mindview.interfaces; abstract class Base{ public Base(){ print(); } abstract void pr ...

  9. 《Linux命令行与shell脚本编程大全》第十六章 控制脚本

    一些控制脚本的方式:向脚本发送信号.修改脚本优先级,在脚本运行时切换到运行模式 16.1 处理信号 linux利用信号与运行在系统中的进程进行通信. 也可以通过对脚本进行编程,使其在收到特定信号时执行 ...

随机推荐

  1. LTE中基于S1的切换

    1:源eNodeB决定进行基于S1的切换.S1切换的原因可能是源eNodeB和目标eNodeB之间不存在X2连接,或者源eNodeB根据其他情况作出的判断. 2:源eNodeB向源MME发送Hando ...

  2. PokeCats开发者日志(四)

      现在是PokeCats游戏开发的第八天的上午,感觉游戏做得差不多了,来写一下开发者日志吧!   (1)增加闯关模式,一共30关.   (2)更改了最后一关的主题,更换了背景,将树桩改为礼物盒.   ...

  3. 利用vue-cli搭建项目后的目录结构

    npm install -g vue-cli vue init webpack my-project(项目名称)  后的目录结构: -----build         webpack配置相关 --- ...

  4. [HDU6304][数学] Chiaki Sequence Revisited-杭电多校2018第一场G

    [HDU6304][数学] Chiaki Sequence Revisited -杭电多校2018第一场G 题目描述 现在抛给你一个数列\(A\) \[ a_n=\begin{cases}1 & ...

  5. 变量可以通过into赋值

  6. 机器学习:最近邻规则KNN算法

    这个算法就比较简单易懂了 就是把每个向量的特征值抽象成坐标,寻找最近的k个点,来进行划分 代码如下 #include <iostream> #include <cstdio> ...

  7. 【题解】洛谷P2418 yyy loves OI IV

    感觉很是妙啊……这题数次误入歧途...最开始想的二维dp,单调队列优化:无果,卒.于是没忍住看了下标签:暴力枚举?搜索?于是开始想记忆化搜索.以为会有什么很强的剪枝之类的:30分,卒.最后终于回到正道 ...

  8. CentOS 6通过yum升级Git

    By francis_hao    Mar 9,2017   在一个新机器上推送代码到github上时出现了下面的问题 error: The requested URL returned error: ...

  9. E. Sonya and Ice Cream(开拓思维)

    E. Sonya and Ice Cream time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  10. tomcat 配置文件中设置JAVA_HOME

    Tomcat默认情况下会用系统的环境变量中找到JAVA_HOME和JRE_HOME.但是有的时候我们需要不同版本的JDK共存. 可以在${TOMCAT_HOME}/bin/setclasspath.b ...