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. 使用HashOperations操作redis

    方法 c参数 s说明 Long delete(H key, Object... hashKeys); H key:集合key Object... hashKeys:key对应hashkey  删除ma ...

  2. 详细解析@Resource和@Autowired的区别 , 以及@Qualifier的作用

    (41)  (0) 首先 . @Resource是javax.annotation 包中的注解类 , 是jdk中封装的 . @AutoWired是spring的中注解,依赖于spring上下文. 相同 ...

  3. hw_breakpoint使用方法

    hw_breakpoint 使用方法 kprobe在 do_page_fault 函数中不能使用,那么如果真要在这里打点怎么办呢?看看hw_breakpoint是否可用: 事实证明,即便 hw_bre ...

  4. float与定位的区别

    float和绝对定位的区别 CSS中脱离文档流,也就是将元素从普通的布局排版中拿走,其他盒子在定位的时候,会当做脱离文档流的元素不存在而进行定位.1 需要注意的是,使用float脱离文档流时,其他盒子 ...

  5. P3375【模板】KMP字符串匹配

    前言: 额……很久以前就写了KMP模板(只是半知不解),话说看完了manacher,再回过头看KMP,是真TM简单啊!字符串专题整体较抽象,所以必须牢记思路并时常复习 题目描述 如题,给出两个字符串s ...

  6. 制作Windows10政府版的小白教程

    制作Windows10政府版的小白教程 https://03k.org/make10entg.html 首先,宿主系统要比操作的系统新,因为低版本dism操作不了: 当然也可以单独下载ADK,提取最新 ...

  7. [Leetcode] Length of last word 最后一个单词的长度

    Given a string s consists of upper/lower-case alphabets and empty space characters' ', return the le ...

  8. 【BZOJ 2744 朋友圈】

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1570  Solved: 532[Submit][Status][Discuss] Descripti ...

  9. 湖南大学第十四届ACM程序设计新生杯 Dandan's lunch

    Dandan's lunch Description: As everyone knows, there are now n people participating in the competiti ...

  10. 两数之和 [ leetcode ]

    原题地址:https://leetcode-cn.com/articles/two-sum/ 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元 ...