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. redis基础和通用key操作

    redis是什么? redis开源的,构建于内存的数据结构的nosql数据库.常被用于数据存储,缓存处理和消息处理. redis的优势? 1.极高的读写能力 2.丰富的数据类型 3.原子性操作 4.支 ...

  2. Android流式布局控件

    1,自定义flowlayout代码 package com.hyang.administrator.studentproject.widget; import android.content.Cont ...

  3. 福大软工1816:Alpha(2/10)

    Alpha 冲刺 (2/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.学习qqbot库: 2.实 ...

  4. lintcode-87-删除二叉查找树的节点

    87-删除二叉查找树的节点 给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点.如果树中没有相同值的节点,就不做任何处理.你应该保证处理之后的树仍是二叉查找树. 样例 给出如下二叉查找树: ...

  5. BZOJ4651 NOI2016网格(割点)

    首先显然可以通过孤立角落里的跳蚤使其不连通,所以只要有解答案就不会大于2.同样显然的一点是当且仅当跳蚤数量<=2且连通时无解.做法其实也很显然了:特判无解,若跳蚤不连通输出0,否则看图中是否无割 ...

  6. [洛谷P1361]小M的作物

    题目大意:将作物种在A,B两地,对于每种作物,种A,B分别有不同的收益,对于一些特殊的作物集合,共同种到A,B集合分别有一些额外收益.求最大收益. 题解:最小割,S向i连容量为$a_i$的边,i向T连 ...

  7. 【BZOJ 3165】 [Heoi2013]Segment 李超线段树

    所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #in ...

  8. PHP 5.4语法改进与弃用特性

    PHP 5.4于本月尘埃落定,它是 PHP 自 2009 年以来的首次重大更新.该版本对语言部分进行了增强,包括支持 Traits 和移除部分争议特性. Traits 同 Java 和 .NET 一样 ...

  9. Ubuntu下安装LNMP之Mysql的安装及卸载

    Mysql的安装过程也可参考:http://blog.csdn.net/qq_20565303/article/details/69813868 Mysql安装包下载地址:https://dev.my ...

  10. spring中PropertyPlaceholderConfigurer的运用---使用${property-name}取值

    代码如下: 配置文件: jdbc.properties的代码如下: jdbc.driverClassName=org.hsqldb.jdbcDriver jdbc.url=jdbc:hsqldb:hs ...