Java核心编程_vol1_Chap3

[toc]

3.3 数据类型

  1. p31java没有无符号 unsigned 类型,但是可以把有符号整数值当成无符号计算。只要不溢出,加、减、乘都能正常计算。对于其他运算,需要调用 Byte.toUnsignedInt() 方法来得到一个 0~255int 值。

  2. P31:可以使用16进制表示浮点数,如:0.125 = 0x1.0p-3。p表示指数,基数是2,尾数采用16进制,指数采用十进制。

  3. p32char 类型的值可以表示为十六进制,范围 \u0000 - \uFFFFUnicode 转义序列会在解析代码之前被处理。
    "\u0022+\u0022" 会变成 ""+""
    // \u000A is a newline 会报错,因为 \u000A 是换行符。
    // look inside c:\users 也会报错,因为 \u 后面没有跟着4个16进制数。

3.4 变量与常量

  1. p34:变量名以字母开头,由字母和数字组成。“字母”可以是 Unicode 中任何外语“字母”;“数字”可以是 Unicode 中任何外语“数字”。判断一个 Unicode 字符是不是字母,可以用 Character.isJavaIdentifierStart()Character isJavaIdentifierPart() 方法来检查。

3.5 运算符

  1. p38:类方法 Math.floorMod(int a, int b) 进行求模运算,当被除数 a 是负数时,余数总为非负数。当除数 b 为负数,返回值为负。

  2. p39StrictMath 类实现了“可自由分发的数学库”的算法,确保在所有平台上得到相同的结果(有些处理器支持扩展的精度,普通的算术运算符,在不同机器上的运算结果精度不同)。

  3. p40Math 类有一些方法,使整数运算更安全。Math.multiplyExact() addExact subtractExact incrementExact decrementExact negateExact 都能正确处理 intlong 参数。当运算溢出或参数不对时会抛异常。可以捕获这个异常,而不是允许它给出一个错误的结果,然后继续运行。

  4. p41:强制类型转换会把数截断,例如:

    double x = 9.997;
    int nx = (int) x;   //nx的值为9
    nx= (int) Math.round(x);   //nx为10,round方法返回long
    byte b = (byte) 300;  //b的值为44
    
  5. p43:移位运算符的右操作数会进行取模,左操作数是 int 就模 32,左操作数是 long 就模 64。例如 1<<35 等于 1<<3

  6. p43:位运算符 >>> 会用 0 填充高位,而 >>符号位填充高位。

3.6 字符串

  1. p49boolean Character.isSurrogate(char) 检测一个 char 值(代码单元)是否在代理区(surrogate)。
    boolean Character.isSupplementaryCodePoint(int) 检测一个 int 值是否辅助字符码点。

  2. p54:构建字符串。

    StringBuilder builder = new StringBuilder();
    

    StringBuilder API

3.7 输入与输出

  1. p55:通过控制台输入,首先要构造一个与"标准输入流" System.in 关联的 Scanner 对象。Scannerjava.util 包中。

    Scanner in = new Scanner(System.in);
    

    因为输入是可见的,所以 Scanner 类不适用于从控制台读取密码。Java 6 特别引入了 Console 类来实现这个目的。为安全起见,返回的密码放在 char 数组中,而不是字符串中。处理完密码后,应该马上修改数组元素的值。
    java Console con = System.console(); String name = cons.readLine("User name:"); char[] passwd = cons.readPassword("Password:");

    Scanner & Console API

  2. p58:格式化输出 System.out.printf
    格式转换符 Conversions for printf


    标志 flags for printf

  3. p59:也可以用类方法 String.format 创建一个格式化字符串,而不打印输出。

    String str = String.format("Hello, %s. Next year, you'll be %d", name, age);
    
  4. p59:用 printf 方法输出格式化的日期与时间。这个转换符包括两个字母,以 t 开始,以下表中的任意字母结束。例如:

    System.out.printf("%tc", new Date());
    //将输出以下字符
    Mon Feb 09 18:05:19 PST 2015
    

    日期和时间的转换符

  5. p60:可以按参数索引来格式化,索引必须紧跟在 % 后面,并以 $ 终止。或选用 < 标志,它指示前面格式说明符中的参数将被再次使用。

    System.out.printf("%1$s %2$tB %2$te, %2$tY", "Due date:", new Date());
    System.out.printf("%s %tb %
  6. p60:printf 格式说明符的语法图

  7. p61读取一个文件,需要构造 Scanner 对象,例如:

    Scanner in = new Scanner(Path.of("myfile.txt"), StandardCharsets.UTF_8);
    //文件名中的反斜杠前面,必须再加一个反斜杠,例如:"C:\\users\\myfile.txt"。
    

    写入一个文件,需要构造 PrintWriter 对象,例如:

    PrintWriter out = new PrintWriter("myfile.txt", StandardCharsets.UTF_8);
    //如果文件不存在,将创建该文件
    

    当使用一个相对文件名时,文件位于相对于 Java 虚拟机启动目录的位置。如果使用 IDE ,可以使用下面的方法找到当前目录的位置:

    String dir = System.getProperty("user.dir");
    

    如果构造 Scanner 对象时,文件不存在,或者构造 PrintWriter 对象时,文件名无法创建,都会产生 IOException 异常。

3.8 控制流程

  1. p72:针对 switch 语句,如果在 case 分支的末尾没有 break ,这种情况相当危险。可以在编译时加上编译选项,让编译器检查这种错误:

    javac -Xlint:fallthrough Test.java
    

    如果确实想用这种行为,可以为其外围方法加一个注解:

    @SuppressWarnings("fallthrough")
    

    这样就不会生成警告。

  2. p73switch 可以处理 char byte short int 常量表达式 枚举常量 字符串字面量(从Java7开始)

  3. p75break 语句可以带标签,可以将标签应用到任何语句(包括语句块)。
    break label; 语句将会跳转到带标签的语句块的末尾。

  4. p76:在 for 循环中,continue 语句会跳转到 for 循环的变量“更新”部分。continue 语句也可以带标签。

3.9 大数

  1. p76java.math 包中有两个很有用的类 BigIntegerBigDecimal。可以处理任意长度的数字,进行任意精度的整数或浮点数运算。
    //可以用构造函数,把一个字符串转换为大数
    BigInteger reallyBig = new BigInteger("22223224478962942044557979");
    //把下面这条语句改写为使用大数
    m = m * (n - k) / i;
    //变为
    m = m.multiply(BigInteger.valueOf(n - k)).divide(BigInteger.valueOf(i));
    
    Big number API

3.10 数组

  1. p79:数组的长度可以为0。

    int[] a= new int[n];   //声明一个数组
    int[] prime={2,3,5,};   //声明并初始化。最后一个值后面允许有逗号。
    //可以声明匿名数组,用来给另一个数组赋值
    prime = new int[] {17, 19, 23};
    
  2. p81for each 可以依次处理数组中每个元素:

    for(var : collection)
        statements
    

    其中 var 是一个临时变量,collection 这一表达式可以是任何实现了 Iterable 接口的类对象。

    for(int element : a)
        System.out.println(element);
    
  3. p81:类方法 Arrays.toString 返回一个包含数组元素的字符串,这些元素包围在中括号内并用逗号分隔,就像 "[2,3,5,7]"。要想打印一个数组,只需要调用:

    System.out.println(Arrays.toString(a));
    
  4. p82:如果希望传递数组的值,而不是引用,可以使用类方法 Arrays.copyOf。假设 num 是一个数组,下面这条语句复制了 num 的所有元素,并返回了一个新的数组对象,长度是原始数组的两倍。

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

    2 个参数表示长度;额外的元素将被赋值为 0 falsenull。如果第 2 个参数比原始数组短,则只拷贝前面的值。

  5. p83:类方法 Arrays.sort 可以对数值型数组进行排序,这个方法采用了优化的快速排序算法。

  6. p85常用 Arrays API

你可能感兴趣的:(Java核心编程_vol1_Chap3)