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. 重写page的OnInit(学习中总结的)

    在写b/s框架的系统的时候,我们会发现,我们经常会在不同的网页中验证Session是否存在,,而我这里没有用Session,用的是MemCache技术,其实它就是键值对. 只不过将Memcache中的 ...

  2. DPDK vhost库

    原创翻译,转载请注明出处. vhost库实现了一个用户空间的virtio net server,允许用户直接处理virtio ring队列.换句话说,它让用户可以从VM virtio网络设备读取或写入 ...

  3. el-input为数字时验证问题

    el-input为数字时,初始有值,怎么还会验证不能为空? html: <el-form-item label="审核数量:" prop="checkNum&quo ...

  4. wait_event_interruptible_timeout

    最近一套方案涉及到内核线程之间的同步,用到了函数wait_event_interruptible_timeout函数,大致是这样: A:是一个后台的线程,平常没事就睡觉,有时被唤醒,或者每5分钟醒一次 ...

  5. 【python】python 中的三元表达式(三目运算符)

    python中的三目运算符不像其他语言其他的一般都是 判定条件?为真时的结果:为假时的结果 如 result=5>3?1:0 这个输出1,但没有什么意义,仅仅是一个例子.而在python中的格式 ...

  6. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  7. 【考试记录】4.8 Table ( 数论数学 --组合数 & 杨辉三角)

    陆陆续续的开始考很多的试,也会更新这些题目记录下来,免得做完了之后毫无印象,就这么水过去了(以前的考试都是如此,哎……) Table (T1) : 样例: 出于对数学题本能的恐惧考场上放弃了此题专攻T ...

  8. [NOIP2018 TG D2T2]填数游戏

    题目大意:$NOIP2018\;TG\;D2T2$ 题解:在skip2004的博客基础上修改的,也是暴搜. 说明一下把vector改成数组并不可以通过此题,记录. 结论:在$m>n+1$时答案为 ...

  9. 【ZJ选讲·字符串折叠】

    给一个字符串(len<=100) 把这个字符串折叠(就是压缩) 记 X(子串) 表示重复 X次该子串 比如 3(orz)  orzorzorz  来点神奇例子: AAAAAAAAAA ...

  10. oracle数据库导入导出方法

    Oracle Database 10g以后引入了最新的数据泵(Data Dump)技术,使DBA或开发人员可以将数据库元数据(对象定义)和数据快速移动到另一个oracle数据库中. 数据泵导出导入(E ...