第3章 Java的基本程序设计结构

本章内容:

  • 一个简单的Java应用程序
  • 字符串
  • 注释
  • 输入输出
  • 数据类型
  • 控制流
  • 变量
  • 大数值
  • 运算符
  • 数组

本章主要讲述程序设计相关的基本概念(如数据类型、分支以及循环)在Java中的实现方式。

3.1 一个简单的Java应用程序

  1. Java对大小写敏感。
  2. Java定义类名规则:名字必须以字母开头,后面可以跟字母和数字的任意组合。长度基本上没有限制。但是不能使用Java保留字作为类名。
  3. 标准的命名规则为:类名是以大写字母开头的名词。如果名字由多个单词组成,每个单词的第一个字母都应该大写。

3.2 注释

  1. 在Java中,//注释不能嵌套。也就是说,如果代码本身包含了一个/,就不能用/和*/将注释括起来。

3.3 数据类型

  1. 在Java中,一共有8中基本类型(primitive type),其中有4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和一种用于表示真值的boolean类型。

3.3.1 整型

  1. 整型用于表示没有小数部分的数值,它允许是负数。

    类型 存储需求 取值范围
    int 4字节 -2147483648~2147483647(正好超过20亿)
    short 2字节 -32768~32767
    long 8字节 -9223372036854775808~9223372036854775807
    byte 1字节 -128~127
  2. 在Java中,整型的范围与运行Java代码的机器无关。

  3. 长整型数值有一个后缀L,十六进制数值有一个前缀0x。八进制有一个前缀0。从Java7开始,加上前缀0b就可以写二进制数。从Java 7开始,还可以为数字字面量加下划线,如用1_000_000表示一百万。这些下划线只是为了让人更易读。Java编译器会去除这些下划线。

3.3.2 浮点类型

  1. 浮点类型用于表示有小数部分的数值。

    类型 存储需求 取值范围
    float 4字节 大约±3.40282347E+38F(有效位数为6~7位)
    double 8字节 大约±1.79769313486231570E+308(有效位数为15位)
  2. double表示这种类型的数值精度是float类型的两倍。绝大部分应用程序都采用double类型。float类型的数值有一个后缀F。没有后缀F的浮点数值默认为double类型。也可以在浮点数值后面添加后缀D。
  3. 在JDK5.0中,可以使用十六进制表示浮点数值。例如,0.125可以表示成0x1.0p-3。在十六进制表示法中,使用p表示指数,而不是e。注意,尾数采用十六进制,指数采用十进制。指数的基数是2,而不是10。
  4. 用于表示溢出和出错情况的三个特殊的浮点数值:正无穷大、负无穷大、NaN(不是一个数字)。常量Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN分别表示这三个特殊的值。判断一个特定值是否等于Double.NaN使用Double.isNaN方法。
  5. 浮点数值不适用于禁止出现摄入误差的金融计算中。如果需要在数值计算中不含有任何舍入误差,就应该使用BigDecimal类。

3.3.3 char类型

  1. char类型用于表示单个字符。通常用来表示字符常量。Unicode编码单元可以表示为十六进制值,其范围从\u0000到\uffff。
  2. 除了可以采用转义序列符\u表示Unicode代码单元的编码之外,还有一些用于表示特殊字符的转义序列符。所有这些转义序列符都可以出现在字符常量或字符串的引号内。例如,’\u2122’或”Hello\n”。转义序列符\u还可以出现在字符常量或字符串的引号之外(而其他所有转义序列不可以)。例如:public static void main(String\u005B\u005D args),这种形式完全符合语法规则,\u005B和\u005D是[和]的编码。
    转义序列 名称 Unicode值   转义序列 名称 Unicode值
    \b 退格 \u0008   \” 双引号 \u0022
    \t 制表 \u0009   \’ 单引号 \u0027
    \n 换行 \u000a   \ 反斜杠 \u005c
    \r 回车 \u000d          
  3. UTF-16编码采用不同长度的编码表示所有Unicode代码点。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元(code unit);而辅助字符采用一对连续的代码单元进行编码。这样构成的编码值一定落入基本的语言级别中空闲的2048字节码,通常被称为替代区域(surrogate area)。
  4. 在Java中,char类型用UTF-16编码描述一个代码单元。
  5. 强烈建议不要在程序中使用char类型,除非确实需要对UTF-16代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示。

3.3.4 boolean类型

  1. boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。

3.4 变量

  1. 在Java中,每一个变量属于一种类型(type)。
  2. 变量名必须是一个以字母开头的由字母或数字构成的序列。变量名中所有的字符都是由意义的,并且大小写敏感。变量名的长度没有限制。
  3. 如果想要知道哪些Unicode字符属于Java中的“字母”,可以使用Character类的isJavaIdentifierStart和isJavaIdentifierPart方法进行检测。
  4. 尽管$是一个合法的Java字符,但不要在自己的代码中使用这个字符。他只用在Java编译器或其他工具生成的名字中。

3.4.1 变量初始化

  1. 在Java中,变量的声明尽可能地靠近变量第一次使用的地方,这是一种良好的程序编写风格。

3.4.2 常量

  1. 在Java中,利用关键字final指示常量。
  2. 关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上,常量名使用全大写。
  3. 在Java中,经常希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量。可以使用关键字static final 设置一个类常量。

3.5 运算符

  1. 在Java中,使用算数运算符+、-、*、/表示加、减、乘、除运算。当参数/运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。整数的求余操作(取模)用%表示。
  2. 整除被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果。
  3. 在默认情况下,虚拟机设计者允许将中间计算结果采用扩展的精度。但是,对于使用strictfp关键字表示的方法必须使用严格的浮点计算来产生理想的结果。如果将一个类标记为strictfp,这个类中的所有方法都要使用严格的浮点计算。

3.5.1 自增运算符与自减运算符

3.5.2 关系运算符与boolean运算符

3.5.3 位运算符

  1. 位运算符&(“与”)、|(“或”)、^(“异或”)、~(“非”)这些运算符在位模式下工作。
  2. “>>”和”<<”运算符将二进制位进行右移或左移操作。>>>运算符将用0填充高位;>>运算符用符号位填充高位。没有<<<运算符。
  3. 对以为运算符右侧的参数需要进行模32的运算(除非左边的操作数是long类型,在这种情况下需对右侧操作数模64)。如,1左移35与1<<3或8是相同的。

3.5.4 数学函数与常量

  1. 数值的平方根,使用sqrt方法。
  2. 幂运算,使用pow方法,Math.pow(x,a)表示x的a次幂。pow方法有两个double类型的参数,其但会结果也为double类型。
  3. 在Math类中,为了达到最快的性能,所有的方法都使用计算机浮点单元中的例程,如果得到一个完全可预测的结果比运行速度更重要的话,那么就应该使用StrictMath类。他使用“自由发布的Math库”(fdlibm)实现算法,一确保在所有平台上得到相同的结果。

3.5.5 数值类型之间的转换

  1. 数值类型之间的合法转换

实心箭头,表示无信息丢失的转换,虚箭头,表示可能有精度损失的转换。

  1. 当使用两个数值进行二元操作时,先要将两个操作数转换为同一种类型,然后再进行计算。

    • 如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型。
    • 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型。
    • 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
    • 否则,两个操作数都将转换为int类型。

3.5.6 强制类型转换

  1. double转int,强制类型转换通过截断小数部分将浮点值转换为整型。如果想对浮点数进行舍入运算,以便得到最接近的整数,那就需要使用Math.round方法。当调用round的时候,仍然需要使用强制类型转换(int)。其原因是round方法返回的结果为long类型,由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能够将long类型转换成int类型。
  2. 如果试图将一个数值从一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte)300的实际值为44。

3.5.7 括号与运算符级别

  1. 同一个级别的运算符按照从左到右的次序进行计算。

    运算符 结合性
    [].()(方法调用) 从左到右
    !~++..+(一元运算)-(一元运算)()(强制类型转换)new 从右到左
    */% 从左到右
    +- 从左到右
    << >> >>> 从左到右
    < <= > >= instanceof 从左到右
    == != 从左到右
    & 从左到右
    ^ 从左到右
    或位运算符 从左到右
    &&与 从左到右
    从左到右
    ?: 从右到左
    = += -= *= /= %= &= 或等于 ^= <<== >>= >>>= 从右到左

3.5.8 枚举类型

  1. 枚举类型包括了有限个命名的值。

3.6 字符串

  1. 从概念上讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫做String。

3.6.1 子串

  1. String类的substring方法可以从一个较大的字符串提取出一个子串。

3.6.2 拼接

  1. 当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。

3.6.3 不可变字符串

  1. String类没有提供用于修改字符串的方法。由于不能修改Java字符串中的字符,所以在Java文档中奖String类对象称为不可变字符串。不可变字符串有一个优点:编译器可以让字符串共享。
  2. Java的设计者认为共享带来的高效率远远胜于提取、拼接字符串所带来的低效率。

3.6.4 检测字符串是否相等

  1. 使用equals方法检测两个字符串是否相等。想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。不能使用==运算符检测两个字符串是否相等,这个运算符只能够确定两个字符串是否放置在同一个位置上。如果虚拟机始终将相同的字符串共享,就可以使用相等运算符检测是否相等。但实际上只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的。

3.6.5 空串与Null串

  1. 空串””是长度为0的字符串。空船是一个Java对象,有自己的串长度(0)和内容(空)。
  2. String变量还可以存放一个特殊的值,名为null,表示目前没有任何对象与该变量关联。

3.6.6 代码点与代码单元

  1. Java字符串由char序列组成。char数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
  2. length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量。
  3. 要想得到实际的长度,即代码点数量,可以调用String.codePointCount(0,length)。
  4. 调用s.charAt(n)将返回位置n的代码单元,n介于0~s.length-1之间。
  5. 要想得到第i个代码点,使用下列语句:int index = s.offsetByCodePoints(0,i);int cp = s.codePointAt(index);
  6. 如果想要遍历一个字符串,并且依次查看每一个代码点,可以使用下列语句:
    int cp = sentence.codePointAt(i);
    if (Charcter.isSupplementaryCodePoint(cp)) i+=2;
    else i++;

    可以使用下列语句实现回退操作:

    i--;
    if (Charcter.isSurrogate(sentence.charAt(i))) i--;
    int cp = sentence.codePointAt(i)

3.6.7 字符串API

  1. 常用的API:java.lang.string 1.0
  • char charAt(int index)
    返回给定位置的代码单元。除非对底层的代码单元感兴趣,否则不需要调用这个方法。
  • int codePointAt(int index) 5.0
    返回从给定位置开始或结束的代码点。
  • int offsetByCodePoints(int startIndex,int cpCount) 5.0
    返回从startIndex代码点开始,位移cpCount后的代码点索引。
  • int compareTo(String other)
    按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0。
  • boolean endsWith(String suffix
    如果字符串以suffix结尾,返回true。
  • boolean equals(Object other)
    如果字符串与other相等,返回true。
  • boolean equalsIgnoreCase(String other)
    如果字符串与other相等(忽略大小写),返回true。
  • int indexOf(String str)
  • int indexOf(String str, int fromIndex)
  • int indexOf(int cp)
  • int indexOf(int cp, int fromIndex)
    返回与字符串str或代码点cp匹配的第一个子串的开始位置。这个位置从索引0或fromIndex开始计算。如果在原始串中不存在str,返回-1。
  • int lastIndexOf(String str)
  • int lastIndexOf(String str,int fromIndex)
  • int lastIndexOf(int cp)
  • int lastIndexOf(int cp, int fromIndex)
    返回与字符串str或代码点cp匹配的最后一个子串的开始位置。这个位置从原始串尾端或fromIndex开始计算。
  • int length()
    返回字符串的长度。
  • int codePointCount(int startIndex, int endIndex) 5.0
    返回startIndex和endIndex-1之间的代码点数量。没有配成对的代用字符将计入代码点。
  • String replace(CharSequence oldString,CharSequence newString)
    返回一个新字符串。这个字符串用newString代替原始字符串中所有的oldString。可以用String或StringBuilder对象作为CharSequence参数。
  • boolean startsWith(String prefix)
    如果字符串以prefix字符串开始,返回true。
  • String substring(int beginIndex)
  • String substring(int beginIndex, int endIndex)
    返回一个新字符串。这个字符串包含原始字符串中beginIndex到串尾或endIndex-1的所有代码单元。
  • String toLowerCase()
    返回一个新字符串。这个字符串将原始字符串中的所有大写字母改成了小写字母。
  • String toUpperCase()
    返回一个新字符串。这个字符串将原始字符串中的所有小写字母改成了大写字母。
  • String trim()
    返回一个新字符串。这个字符串将删除了原始字符串头部和尾部的空格。

3.6.7 阅读联机API文档

3.6.8 构建字符串

  1. 每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类就可以避免这个问题的发生。
  2. StringBuilder常用API:java.lang.StringBuilder 5.0
  • StringBuilder()
    构造一个空的字符串构建器。
  • int length()
    返回构建器或缓冲器中的代码单元数量。
  • StringBuilder append(String str)
    追加一个字符串并返回this。
  • StringBuilder append(char c)
    追加一个代码单元并返回this。
  • StringBuilder appendCodePoint(int cp)
    追加一个代码点,并将其转换为一个或两个代码单元并返回this。
  • void setCharAt(int i,char c)
    将第i个代码单元设置为c。
  • StringBuilder insert(int offset,String str)
    在offset位置插入一个字符串并返回this。
  • StringBuilder insert(int offset,Char c)
    在offset位置插入一个代码单元并返回this。
  • StringBuilder delete(int startIndex, int endIndex)
    删除偏移量从startIndex到endIndex-1的代码单元并返回this。
  • String toString()
    返回一个与构建器或缓冲器内容相同的字符串。

3.7 输入输出

3.7.1 读取输入

  1. 读取“标准输出流”,使用Scanner对象。

    Scanner in = new Scanner(System.in);
    System name = in.nextLine(); //读取一行
    String firstName = in.next; //读取一个单词
    int age = in.nextInt(); //读取一个整数
  2. Scanner类不适用于从控制台读取密码。Console实现读取一个密码。
    Console cons = System.console();
    String username = cons.readLine("User name:");
    char[] passwd = cons.readPassword("Password:");

    采用Console对象处理输入不如采用Scanner方便。每次只能读取一行输入,而没有能够读取一个单词或一个数值的方法。

  3. java.util.Scanner 5.0
  • Scanner(InputStream in)
    用给定的输入流创建一个Scanner对象。
  • String nextLine()
    读入输入的下一行内容。
  • String next()
    读取输入的下一个单词(以空格作为分隔符)。
  • int nextInt()
  • double nextDouble()
    读取并转换下一个表示整数或浮点数的字符序列。
  • boolean hasNext()
    检测输入中是否还有其他单词。
  • boolean hasNextInt()
  • boolean hasNextDouble()
    检测是否还有表示整数或浮点数的下一个字符序列。
  1. java.lang.System 1.0
  • static Console console() 6
    如果有可能进行交互操作,就通过控制台窗口为交互的用户返回一个Console对象,否则返回null。对于任何一个通过控制台启动的程序,都可使用Console对象。否则,其可用性将与所使用的系统有关。
  1. java.io.Console 6
  • static char[] readPassword(String prompt, Object… args)
  • static String readLine(String prompt, Object… args)
    显示字符串prompt并且读取用户输入,知道输入行结束。args参数可以用来提供输入格式。

3.7.2 格式化输出

  1. 用于printf的转换符

    转换符 类型 举例   转换符 类型 举例
    d 十进制整数 159   s 字符串 Hello
    x 十六进制整数 9f   c 字符 H
    0 八进制整数 237   b 布尔 True
    f 定点浮点数 15.9   h 散列码 42628b2
    e 指数浮点数 1.59e+01   tx 日期时间
    g 通用浮点数   % 百分号 %
    a 十六进制浮点数 0x1.fccdp3   n 与平台有关的行分割符
  2. 用于printf的标志

    标志 目的 举例
    + 打印正数和负数的符号 +3333.33
    空格 在正数之前添加空格 空格3333.33
    0 数字前面补0 003333.33
    . 左对齐 3333.33空白
    ( 将负数括在括号内 (3333.33)
    , 添加分组分割线 3,333.33
    #(对于f格式) 包括小数点 3,333.
    #(对于x或0格式) 添加前缀0x或0 0xcafc
    $ 给定被格式化的参数索引。例如.%1$d,%1$x将以十进制和十六进制格式打印第一个参数 159 9F
    < 格式化前面说明的数值。例如,%d%<x以十进制和十六进制打印同一个数值 159 9F
  3. 可以使用s转换符格式任意的对象。对于任意实现了Formattable接口的对象都将调用formatTo方法;否则将调用toString方法,它可以将对象转换为字符串。

  4. printf方法中日期与时间的格式化选项。以t开始,以下边中任意字母结束的两个字母格式打印日期时间。
    日期和时间的转换符
    转换符 类型 举例
    c 完整的日期和时间 Mon Feb 09 18:05:19 PST 2004
    F ISO 8601 日期 2004-02-09
    D 美国格式的日期(月/日/年) 02/09/2004
    T 24小时时间 18:05:19
    T 12小时时间 06:05:19pm
    R 24小时时间没有秒 18:05
    Y 4位数字的年(前面补0) 2004
    y 年的后两位数字(前面补0) 04
    C 年的前两位数字(前面补0) 20
    B 月的完整拼写 February
    b或h 月的缩写 Feb
    m 两位数字的月(前面补0) 02
    d 两位数字的日(前面补0) 09
    e 两位数字的月(前面不补0) 9
    A 星期几的完整拼写 Monday
    a 星期几的缩写 Mon
    j 三位数的年中的日子(前面补0),在001到366之间 069
    H 两位数字的小时(前面补0),在0到23之间 18
    k 两位数字的小时(前面不补0),在0到23之间 18
    I(大写的i) 两位数字的小时(前面补0),在0到12之间 06
    l(小写的L) 两位数字的小时(前面不补0),在0到12之间 6
    M 两位数字的分钟(前面补0) 05
    S 两位数字的秒(前面补0) 19
    L 三位数字的毫秒(前面补0) 047
    N 九位数字的毫秒(前面补0) 047000000
    P 上午或下午的大写标志 PM
    p 上午或下午的小写标志 pm
    z 从GMT起,RFC822数字位移 -0800
    Z 时区 PST
    s 从格林威治时间1970-01-01 00:00:00起的秒数 107884319
    Q 从格林威治时间1970-01-01 00:00:00起的毫秒数 107884319047

3.7.3 文件输入与输出

  1. 要相对文件进行读取,就需要一个用File对象构造一个Scanner对象,例如:

    Scanner in = new Scanner(Paths.get("myfile.txt"));
  2. 要想写入文件,就需要构造一个PrintWriter对象。在构造器中,只需要提供文件名:
    PrintWriter out = new PrintWriter("myfile.txt");
  3. java.util.Scanner 5.0
  • Scanner(File f)
    构造一个从给定文件读取数据的Scanner。
  • Scanner(String data)
    构造一个从给定字符串读取数据的Scanner。
  1. java.io.PrintWriter 1.1
  • PrintWriter(String fileName)
    构造一个将数据写入文件的PrintWriter。文件名由参数指定。
  1. java.nio.file.Paths 7
  • static Path get(String pathname)
    根据给定的路径名构造一个Path。

3.8 控制流程

3.8.1 块作用域

  1. 块(即复合语句)是指一对花括号括起来的若干条简单的Java语句。块确定了变量的作用域。一个块可以嵌套另一个块。不能在嵌套的两个块中声明同名的变量。

3.8.2 条件语句

  1. 条件语句的格式为

    if(condition) {
    statement1
    statement2
    ...
    }

3.8.3 循环

  1. 当条件为true时,while循环执行一条语句(也可以是一个语句块)。常用的格式为

    while(condition) statement

    如果开始循环条件的值就为false,则while循环体一次也不执行。

  2. while循环语句首先检测循环条件。因此,循环体中的代码有可能不被执行。如果希望循环体至少执行一次,则应该将检测条件放在最后。使用do/while循环语句可以实现这种操作方式。它的语法格式为:
    do statement while(condition);

3.8.4 确定循环

  1. for循环语句是支持迭代的一种通用结构,利用每次迭代之后更新的计数器或类似的变量来控制迭代次数。

3.8.5 多重选择:switch语句

  1. case标签可以是:
  • 类型为char、byte、short或int(或其包装器类Character、Byte、Short和Integer)的常量表达式。
  • 枚举常量。
  • 从Java SE 7 开始,case标签还可以是字符串字面量。

3.8.6 中断控制流程语句

  1. Java还提供了一种带标签的break语句,用于跳出多重嵌套的循环语句。

3.9 大数值

  1. 如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数学序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。
  2. 使用静态的valueOf方法可以将普通的数值转换为大数值:
    BirInteger a = BigInteger.valueOf(100);
  3. 不能使用人们熟悉的算数运算符(如:+和*)处理大数值。而需要使用大数值类中的add和multiply方法。
  4. java.math.BigInteger 1.1
  • BigInteger add(BigInteger other)
  • BigInteger subtract(BigInteger other)
  • BigInteger multiply(BigInteger other)
  • BigInteger divide(BigInteger other)
  • BigInteger mod(BigInteger other)
    返回这个大整数和另一个大整数other的和、差、积、商以及余数。
  • int compareTo(BigInteger other)
    如果这个大整数与另一个大整数other相等,返回0;如果这个大整数小于另一个大整数other,返回负数;否则,返回正数。
  • static BigInteger valueOf(long x)
    返回值等于x的大整数。
  1. java.math.BigInteger 1.1
  • BigDecimal add(BigDecimal other)
  • BigDecimal subtract(BigDecimal other)
  • BigDecimal multiply(BigDecimal other)
  • BigDecimal divide(BigDecimal other,RoundingMode mode) 5.0
    返回这个大实数与另一个大实数other的和、差、积、商。要想计算商,必须给出舍入方式(rounding mode)。RoundingMode.HALF_UP是四舍五入方式。它适用于常规的计算。
  • int compareTo(BigDecimal other)
    如果这个大实数与另一个大实数相等,返回0;如果这个大实数小于另一个大实数,返回负数;否则,返回正数。
  • static BigDecimal valueOf(long x)
  • static BigDecimal valueOf(long x,int scale)
    返回值为x或x/10^scale的一个大实数。

3.10 数组

  1. 数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个值。
  2. 创建一个数字数组时,所有元素都初始化为0。boolean数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值null,这表示这些元素未存放任何对象。

3.10.1 for each循环

  1. Java有一种功能很强的循环结构,可以用来一次处理数组中的每个元素而不必为指定下标值而分心。这种增强的for循环的语句格式为:

    for(variable:collection) statement

    定义一个变量用于暂存集合中的每一个元素,并执行相应的语句。collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象。

  2. for each循环语句的循环变量将会遍历数组中的每个元素,而不需要使用下标值。

3.10.2 数组初始化以及匿名数组

  1. 在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写形式。如:

    int[] smallPrines = {2,3,5,7,11,13};

3.10.3 数组拷贝

  1. 在Java中,允许将一个数组拷贝给另一个数组变量。这时,两个变量将引用同一个数组。如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf()方法:

    int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers,luckyNumbers.length);

    第2个参数是新数组的长度。这个方法通常用来增加数组的大小:

    luckyNumbers = Arrays.copyOf(luckyNumbers, 2*luckyNumbers.length);

    如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,则将赋值为false。相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素。

3.10.4 命令行参数

3.10.5 数组排序

  1. 要想对数值型数组进行排序,可以使用Arrays类中的sort方法:

    int[] a = new int[10000];
    ...
    Arrays.sort(a);

    这个方法使用了优化的快速排序算法。快速排序算法对于大多数数据集合来说都是效率比较高的。

  2. java.util.Arrays 1.2

  • static String toString(type[] a) 5.0
    返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔。
  • static type copyOf(type[] a, int length) 6
  • static type copyOf(type[] a,int start, int end) 6
    返回与a类型相同的一个数组,其长度为length或者end-start,数组元素为a的值。
    参数:
    a:类型为int、long、short、char、byte、boolean、float或double的数组。
    start:起始下标(包含这个值)。
    end:终止下标(不包含这个值)。这个值可能大于a.length。在这种情况下,结果为0或false。
    length:拷贝的数据元素长度。如果length值大于a.length,结果为0或false;否则,数组中只有前面length个数据元素的拷贝值。
  • static void sort(type[] a)
    采用优化的快速排序算法对数组进行排序。
    参数:a:类型为int、long、short、char、byte、boolean、float或double的数组。
  • static int binarySearch(byte[] a, type v)
  • static int binarySearch(byte[] a, int start, int end, type v) 6
    采用二分搜索算法查找值v。如果查找成功,则返回相应的下标值;否则,返回一个负数值r。-r-l是为了保持a有序v应插入的位置。
    参数:
    a:类型为int、long、short、char、byte、boolean、float或double的有序数组。
    start:起始下标(包含这个值)。
    end:终止下标(不包含这个值)。
    v:同a数据元素类型相同的值。
  • static void fill(type[] a, type v)
    将数组的所有数据元素值设置为v。
    参数:
    a:类型为int、long、short、char、byte、boolean、float或double的数组。
    v:与a数据元素类型相同的一个值。
  • static boolean equals(type[] a,type[] b)
    如果两个数组大小相同,并且下标相同的元素都对应相等,返回true。
    参数:
    a、b:类型为int、long、short、char、byte、boolean、float或double的两个数组。

3.10.6 多维数组

  1. 多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式。
  2. 要想快速地打印一个二维数组的数据元素列表,可以调用:
    System.out.println(Array.deepToString(a));

3.10.7 不规则数组

Java核心技术卷一基础知识-第3章-Java的基本程序设计结构-读书笔记的更多相关文章

  1. Java核心技术卷一基础知识-第10章-部署应用程序和applet-读书笔记

    第10章 部署应用程序和applet 本章内容: * JAR文件 * Java Web Start * applet * 应用程序首选项存储 10.1 JAR文件 一个JAR文件既可以包含类文件,也可 ...

  2. Java核心技术卷一基础知识-第2章-Java程序设计环境-读书笔记

    第2章 Java程序设计环境 本章内容: 安装Java开发工具箱 使用集成开发环境 选择开发环境 运行图形化应用程序 使用命令行工具 建立并运行applet本章主要介绍如何安装Java开发工具箱(JD ...

  3. Java核心技术卷一基础知识-第14章-多线程-读书笔记

    第 14 章 多线程 本章内容: * 什么是线程 * 中断线程 * 线程状态 * 线程属性 * 同步 * 阻塞队列 * 线程安全的集合 * Collable与Future * 执行器 * 同步器 * ...

  4. Java核心技术卷一基础知识-第11章-异常、断言、日志和调试-读书笔记

    第11章 异常.断言.日志和调试 本章内容: * 处理错误 * 捕获异常 * 使用异常机制的技巧 * 使用断言 * 日志 * 调试技巧 * GUI程序排错技巧 * 使用调试器 11.1 处理错误 如果 ...

  5. Java核心技术卷一基础知识-第5章-继承-读书笔记

    第5章 继承 本章内容: * 类.超类和子类 * Object:所有类的超类 * 泛型数组列表 * 对象包装器和自动装箱 * 参数数量可变的方法 * 枚举类 * 反射 * 继承设计的技巧 利用继承,人 ...

  6. Java核心技术卷一基础知识-第8章-事件处理-读书笔记

    第8章 事件处理 本章内容: * 事件处理基础 * 动作 * 鼠标事件 * AWT事件继承层次 8.1 事件处理基础 在AWT所知的事件范围内,完全可以控制事件从事件源(event source)例如 ...

  7. Java核心技术卷一基础知识-第12章-泛型程序设计-读书笔记

    第12章 泛型程序设计 本章内容: * 为什么要使用泛型程序设计 * 定义简单泛型类 * 泛型方法 * 类型变量的限定 * 泛型代码和虚拟机 * 约束与局限性 * 泛型类型的继承规则 * 通配符类型 ...

  8. Java核心技术卷一基础知识-第9章-Swing用户界面组件-读书笔记

    第9章 Swing用户界面组件 本章内容: * Swing与模型-视图-控制器设计模式 * 布局管理概述 * 文本输入 * 选择组件 * 菜单 * 复杂的布局管理 * 对话框 本章将介绍构造功能更加齐 ...

  9. Java核心技术卷一基础知识-第7章-图形程序设计-读书笔记

    第7章 图形程序设计 本章内容: * Swing概述 * 创建框架 * 框架定位 * 在组件中显示信息 * 处理2D图形 * 使用颜色 * 文本使用特殊字体 * 显示图像 本章主要讲述如何编写定义屏幕 ...

随机推荐

  1. 从xampp到phpmyadmin

    目录 xampp的安装和配置 尝试运行Example11_1(图形化管理工具的可视化界面) 参考博文 xampp的安装和配置 主要参考博文Intellj IDEA 简易教程 1.下载并安装xampp ...

  2. css fixed 失效问题解法

    https://stackoverflow.com/questions/11258877/fixed-element-disappears-in-chrome 开启css硬件加速,transform: ...

  3. 在MyEclipse中使用spring-boot+mybatis+freemarker实现基本的增删改查

    一.基本环境 二.创建实体类 1.User.java package bjredcross.rainbowplans.model; import bjredcross.rainbowplans.com ...

  4. python json.dumps()函数输出json格式,使用ensure_ascii参数对中文输入的支持

    在python使用过程中,输入中文,不能正常的输出,可以使用ensure_ascii参数来解决不能输入中文的问题 代码块: import json friends={"name": ...

  5. Python之路(第三十七篇)并发编程:进程、multiprocess模块、创建进程方式、join()、守护进程

    一.在python程序中的进程操作 之前已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序 ...

  6. 关于Hbuild引用mui常用代码块以及部分控件.

    MUI-最接近原生APP体验的高性能前端框架, 追求性能体验,是我们开始启动MUI项目的首要目标,轻量必然是重要特征: MUI不依赖任何第三方JS库,压缩后的JS和CSS文件仅有100+K和60+K, ...

  7. Lambda根据属性名字选择或筛选

    using System; using System.Linq.Expressions; internal class LambdaHelper { /// <summary> /// 指 ...

  8. 关于python-flask框架中的几个文件的理解

    项目名.py— config.py—配置文件.一般数据库配置还有DEBUG的配置之类的卸载这个py文件中 models.py—模型文件.一般在这里面存储建立数据库的类. exts.py—过渡文件.因为 ...

  9. 第四范式涂威威:AutoML技术现状与未来展望

    以下内容是对AutoML技术现状与未来展望讲座的总结. 1.机器学习定义 <西瓜书>中的直观定义是:利用经验来改善系统的性能.(这里的经验一般是指数据) Mitchell在<Mach ...

  10. php final

    final:如果父类中的方法被声明为final,则子类无法覆盖该方法.如果一个类被声明为final,则不能被继承. 方法示例: <?phpclass BaseClass {   public f ...