`
dasheng
  • 浏览: 146250 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

<java编程思想>学习笔记16 第16章 数组

阅读更多

1,数组和其他种类的类的容器之间的区别有三个方面:效率,类型和保存基本类型的能力。

 

数组可以持有基本的类型,而泛型之前的容器则不能。但是有了泛型,容器就可以指定并检查它们所持有的对象的类型,

 

并且有了自动包装机制,容器看起来还能持有基本类型。

 

2,数组标示符其实只是一个引用,指向在堆中创建的一个真实的对象,这个数组对象用来保存指向其他对象定的引用。

 

对象数组和基本类型数组在使用上基本是相同的;唯一的区别就是对象数组保存的是引用,基本类型数组直接保存基本类型

 

的值。

 

public class ArrayOptions {
  public static void main(String[] args) {
    // Arrays of objects:
    BerylliumSphere[] a; // Local uninitialized variable
    BerylliumSphere[] b = new BerylliumSphere[5];
    // The references inside the array are
    // automatically initialized to null:
    print("b: " + Arrays.toString(b));
    BerylliumSphere[] c = new BerylliumSphere[4];
    for(int i = 0; i < c.length; i++)
      if(c[i] == null) // Can test for null reference
        c[i] = new BerylliumSphere();
    // Aggregate initialization:
    BerylliumSphere[] d = { new BerylliumSphere(),
      new BerylliumSphere(), new BerylliumSphere()
    };
    // Dynamic aggregate initialization:
    a = new BerylliumSphere[]{
      new BerylliumSphere(), new BerylliumSphere(),
    };
    // (Trailing comma is optional in both cases)
    print("a.length = " + a.length);
    print("b.length = " + b.length);
    print("c.length = " + c.length);
    print("d.length = " + d.length);
    a = d;
    print("a.length = " + a.length);

    // Arrays of primitives:
    int[] e; // Null reference
    int[] f = new int[5];
    // The primitives inside the array are
    // automatically initialized to zero:
    print("f: " + Arrays.toString(f));
    int[] g = new int[4];
    for(int i = 0; i < g.length; i++)
      g[i] = i*i;
    int[] h = { 11, 47, 93 };
    // Compile error: variable e not initialized:
    //!print("e.length = " + e.length);
    print("f.length = " + f.length);
    print("g.length = " + g.length);
    print("h.length = " + h.length);
    e = h;
    print("e.length = " + e.length);
    e = new int[]{ 1, 2 };
    print("e.length = " + e.length);
  }
} /* Output:

 

3,多维数组

 

public class MultiDimWrapperArray {
  public static void main(String[] args) {
    Integer[][] a1 = { // Autoboxing
      { 1, 2, 3, },
      { 4, 5, 6, },
    };
    Double[][][] a2 = { // Autoboxing
      { { 1.1, 2.2 }, { 3.3, 4.4 } },
      { { 5.5, 6.6 }, { 7.7, 8.8 } },
      { { 9.9, 1.2 }, { 2.3, 3.4 } },
    };
    String[][] a3 = {
      { "The", "Quick", "Sly", "Fox" },
      { "Jumped", "Over" },
      { "The", "Lazy", "Brown", "Dog", "and", "friend" },
    };
    System.out.println("a1: " + Arrays.deepToString(a1));
    System.out.println("a2: " + Arrays.deepToString(a2));
    System.out.println("a3: " + Arrays.deepToString(a3));
  }
} /* Output:

 

 

Array.deepToString()对基本类型数组和对象数组都起作用。

 

4,Array.fill()

 

public class FillingArrays {
  public static void main(String[] args) {
    int size = 6;
    boolean[] a1 = new boolean[size];
    byte[] a2 = new byte[size];
    char[] a3 = new char[size];
    short[] a4 = new short[size];
    int[] a5 = new int[size];
    long[] a6 = new long[size];
    float[] a7 = new float[size];
    double[] a8 = new double[size];
    String[] a9 = new String[size];
    Arrays.fill(a1, true);
    print("a1 = " + Arrays.toString(a1));
    Arrays.fill(a2, (byte)11);
    print("a2 = " + Arrays.toString(a2));
    Arrays.fill(a3, 'x');
    print("a3 = " + Arrays.toString(a3));
    Arrays.fill(a4, (short)17);
    print("a4 = " + Arrays.toString(a4));
    Arrays.fill(a5, 19);
    print("a5 = " + Arrays.toString(a5));
    Arrays.fill(a6, 23);
    print("a6 = " + Arrays.toString(a6));
    Arrays.fill(a7, 29);
    print("a7 = " + Arrays.toString(a7));
    Arrays.fill(a8, 47);
    print("a8 = " + Arrays.toString(a8));
    Arrays.fill(a9, "Hello");
    print("a9 = " + Arrays.toString(a9));
    // Manipulating ranges:
    Arrays.fill(a9, 3, 5, "World");
    print("a9 = " + Arrays.toString(a9));
  }
} /* Output:

 

5,Arrays实用功能

 

复制数组System.arraycoppy();

 

public class CopyingArrays {
  public static void main(String[] args) {
    int[] i = new int[7];
    int[] j = new int[10];
    Arrays.fill(i, 47);
    Arrays.fill(j, 99);
    print("i = " + Arrays.toString(i));
    print("j = " + Arrays.toString(j));
    System.arraycopy(i, 0, j, 0, i.length);
    print("j = " + Arrays.toString(j));
    int[] k = new int[5];
    Arrays.fill(k, 103);
    System.arraycopy(i, 0, k, 0, k.length);
    print("k = " + Arrays.toString(k));
    Arrays.fill(k, 103);
    System.arraycopy(k, 0, i, 0, k.length);
    print("i = " + Arrays.toString(i));
    // Objects:
    Integer[] u = new Integer[10];
    Integer[] v = new Integer[5];
    Arrays.fill(u, new Integer(47));
    Arrays.fill(v, new Integer(99));
    print("u = " + Arrays.toString(u));
    print("v = " + Arrays.toString(v));
    System.arraycopy(v, 0, u, u.length/2, v.length);
    print("u = " + Arrays.toString(u));
  }
} /* Output:

 

数组的比较

 

Arrays.equals()

 

public class ComparingArrays {
  public static void main(String[] args) {
    int[] a1 = new int[10];
    int[] a2 = new int[10];
    Arrays.fill(a1, 47);
    Arrays.fill(a2, 47);
    print(Arrays.equals(a1, a2));
    a2[3] = 11;
    print(Arrays.equals(a1, a2));
    String[] s1 = new String[4];
    Arrays.fill(s1, "Hi");
    String[] s2 = { new String("Hi"), new String("Hi"),
      new String("Hi"), new String("Hi") };
    print(Arrays.equals(s1, s2));
  }
} /* Output:

 

数组元素的比较

 

  java有两种方式来提供比较功能。第一种是实现java.lang.Comparable接口,使得你的类具有天生的“比较”能力。

 

此接口很简单,只有compareTo()一个方法。此方法接受另一个Object为参数,如果当前对象小于参数则返回负值。

 

如果相等则返回零,如果当前对象大于参数则返回正值。

 

public class CompType implements Comparable<CompType> {
  int i;
  int j;
  private static int count = 1;
  public CompType(int n1, int n2) {
    i = n1;
    j = n2;
  }
  public String toString() {
    String result = "[i = " + i + ", j = " + j + "]";
    if(count++ % 3 == 0)
      result += "\n";
    return result;
  }
  public int compareTo(CompType rv) {
    return (i < rv.i ? -1 : (i == rv.i ? 0 : 1));
  }
  private static Random r = new Random(47);
  public static Generator<CompType> generator() {
    return new Generator<CompType>() {
      public CompType next() {
        return new CompType(r.nextInt(100),r.nextInt(100));
      }
    };
  }
  public static void main(String[] args) {
    CompType[] a =
      Generated.array(new CompType[12], generator());
    print("before sorting:");
    print(Arrays.toString(a));
    Arrays.sort(a);
    print("after sorting:");
    print(Arrays.toString(a));
  }
} /* Output:

 

数组排序

 

使用内置的排序方法,就可以对任意的基本类型数组排序;也可以对任意对象数组进行排序,只有该对象实现了

 

Comparable接口或者相关联的Comparator。

 

public class StringSorting {
  public static void main(String[] args) {
    String[] sa = Generated.array(new String[20],
      new RandomGenerator.String(5));
    print("Before sort: " + Arrays.toString(sa));
   
Arrays.sort(sa);
    print("After sort: " + Arrays.toString(sa));
  
  Arrays.sort(sa, Collections.reverseOrder());
    print("Reverse sort: " + Arrays.toString(sa));
  
  Arrays.sort(sa, String.CASE_INSENSITIVE_ORDER);
    print("Case-insensitive sort: " + Arrays.toString(sa));
  }
} /* Output:

 

在已排序的数组中查找

 

如果已经排好序了,就可以使用Arrays.binarySearch()执行快速查找。如果要对未排队的数组使用binarySearch(),

 

那将产生不可预料的结果。

 

public class ArraySearching {
  public static void main(String[] args) {
    Generator<Integer> gen =
      new RandomGenerator.Integer(1000);
    int[] a = ConvertTo.primitive(
      Generated.array(new Integer[25], gen));
    Arrays.sort(a);
    print("Sorted array: " + Arrays.toString(a));
    while(true) {
      int r = gen.next();
    
  int location = Arrays.binarySearch(a, r);
      if(location >= 0) {
        print("Location of " + r + " is " + location +
          ", a[" + location + "] = " + a[location]);
        break; // Out of while loop
      }
    }
  }
} /* Output:

 

 

如果找到目标,Arrays.binarySearch()产生的返回值等于或大于0,。否则,它产生负返回值,表示如要保持数组的排序

 

状态次目标元素所应该插入的位置。这个负值的计算方式是:

 

-(插入点)-1

 

插入点值第一个大于查找对象的元素在数组中的位置,如果数组中所有的元素都小于要查找的对象。"插入点"就等于

 

a.size().

 

public class AlphabeticSearch {
  public static void main(String[] args) {
    String[] sa = Generated.array(new String[30],
      new RandomGenerator.String(5));
  
  Arrays.sort(sa, String.CASE_INSENSITIVE_ORDER);
    System.out.println(Arrays.toString(sa));
    int index = Arrays.binarySearch(sa, sa[10],
      String.CASE_INSENSITIVE_ORDER);
    System.out.println("Index: "+ index + "\n"+ sa[index]);
  }
} /* Output:

分享到:
评论

相关推荐

    <<JAVA学习笔记>>实例源代码

    &lt;&lt;java 学习笔记&gt;&gt;的实例源代码 后面还有SWF文件

    corejava<java核心技术>重点笔记

    java核心技术 corejava 笔记

    java编程思想学习笔记

    Java是一种面相对象的编程语言。计算机语言分成两种,第一种是面向机器结构的语言,构建数据模型是基于机器的结构。第二种是面向待解决问题结构的语言,构建数据模型是基于问题的结构。Java提供了更丰富的工具来描述...

    雨痕的<>高清完整版

    《Python学习笔记》。是一个名为:雨痕的前辈写的。虽然是未完成版,但是读起来很顺畅,于是周末两天,除了逛街就是在读这本书。不到200页的电子书,很快可以读完。 书分为三个部分:Python语言,Python标准库,...

    Java 学习笔记-手机书 Rev.3 (080603)

    &lt;br&gt;&lt;br&gt;此为第三版Java Study Note Rev.3 (080603)&lt;br&gt;&lt;br&gt;1).增加了学习笔记下半部。&lt;br&gt;&lt;br&gt;在转换的过程中可能存在其他失误,请见谅,如果有好的见解请登陆我的博客:&lt;br&gt;&lt;br&gt;...

    Java学习笔记学习笔记

    Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...

    java编程思想读书笔记

    java编程思想读书笔记,114页,压缩文件才39K。

    Java 学习笔记Java学习笔记

    Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记

    Java编程思想(第4版)读书笔记by CZF

    Java编程思想(第4版)读书笔记by CZFJava编程思想(第4版)读书笔记by CZFJava编程思想(第4版)读书笔记by CZF

    JAVA 数组中方法(笔记)

    有关JAVA数组中方法的讲解,此教程为文档教程,此文档为JAVA中数组的上半部分。

    Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)

    jive.chm

    1 应用Struts的网站建设 &lt;br&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;Java基础&lt;br&gt; 1 20个Java基础Tips &lt;br&gt; 2 abstract,static,final修饰符 &lt;br&gt; 3 ChinaUnix.net Java精华贴 &lt;br&gt; 4 ANT学习笔记 &lt;br&gt; 5 极度性能调整 &lt;br&gt;&lt;br&gt; &lt;br&gt;FAQs&lt;br&gt;...

    Java编程思想读书笔记.doc

    Java编程思想读书笔记 doc doc

    java文集

    &lt;br&gt;ext学习笔记一&lt;br&gt;小试iBatis&lt;br&gt;RIA(Rich Internet Application)的现状和未来&lt;br&gt;Java应用中域名解析不过期的解决方法&lt;br&gt;Java编程那些事儿45—数组使用示例1&lt;br&gt;一步步熟悉OFBiz&lt;br&gt;用Java做客户端调用.NET写...

    java编程思想笔记

    java编程思想笔记,建议与书本结合使用。。。。。。。。。。。

    《java编程思想》之学习笔记

    java编程思想的笔记。是别人的学习笔记。

    Java编程思想-笔记.docx

    《java编程思想》学习笔记

    Java并发编程学习笔记.rar

    Java并发编程学习笔记

Global site tag (gtag.js) - Google Analytics