【JavaCore · I】第三章_Java 的基本程序设计结构

244 阅读5分钟

3.1_一个简单的Java应用程序

略...

3.2_注释

略..

3.3_数据类型

3.3.1_整形

类型 存储需求
byte 1字节
int 2字节
short 4字节
long 8字节
  • Java中所有数值类型所占字节数量与平台无关。
  • Java 无无符号类型(即unsigned xxx)
  • Java7 开始
    • 为方便阅读,数字可用_进行分割。1000_0000_0000。
    • 可将数字写成n进制。

3.3.2_浮点类型

  • float:4字节,float数值后有 f/F 后缀。
  • double:8字节;没有后缀的小数默认为 double 类型。
  • 注意不要用浮点型来进行金融计算,如(2.0-1.1=0.89999...),因为二进制无法精确表示1/10;尽量不要在程序中使用char类型。

Java 用于表示溢出和出错的三个特殊的浮点数值

  • Double.POSITIVE_INFINITY:正无穷大
  • Double.NEGATIVE_INFINITY:负无穷大
  • Double.NaN(x):检测x是否是一个数字。

3.3.3_char 类型

3.3.4_Unicode 和char 类型

  • Unicode 是为解决某些字符的对于不同编码方案下的字节数不一致问题而产生的一种编码机制。
  • 在 Unicode 编码机制下,一个字符占 2 字节。
  • UTF-8 一个中文字符占 3 字节。
  • 尽量不要在程序中使用char类型。除非确实要处理UTF-16代码单元。最好使用String作为抽象数据类型处理。

3.3.5_boolean 类型

在Java中,整形和布尔型不能相互转换。

3.4_变量

3.4.1_变量初始化

声明一个变量后,必须用对其进行赋值(即显式初始化)。不能使用为初始化变量。

int i;
i++;   // error;variable not initialized

3.4.2_常量

用关键字final指示常量。该变量只能被赋值一次,一但被赋值之后,就不能现更改。习惯上常量名用全部大写来表示。

c++中是使用const来声明常量的,但在java虽然是保留的关键字,但并没使用。

3.5_运算符

3.5.1_数学函数与常量

3.5.2_数值类型之前的转换

当两个数值进行二元操作时(如n+f,n为整数,f为浮点数),操作数的类型转换为:

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

3.5.9_枚举类型

  • enum Size { SMALL, MEDIUM, LARGE, Extra_Large };
  • Size s = Size.SMALL;

3.6_字符串

3.6.3_不可变字符串

String类对象称为不可变字符串,问题:似乎修改一个代码单元比创建一个新字符串更加高效?

  • 不可变字符串也有优点:编译器可让字符串共享。
    • 各种字符串存放在公共的存储池中,字符串变量指向存储池中相应的位置。相同的字符串变量共享相同的字符。
    • 修改代码单元的缺点:需要逐一比对、提取、拼接字符串。

3.6.4_检测字符串是否相等

  • equals
  • equalsIgnoreCase:不区分大小写检测两字符串是否相等。

JVM始终将字符串常量设置为共享,但请注意+或substring等操作得到的结果不是共享的。

3.6.5_空串与 Null 串

  • 空串"":长度为0的字符串,是一个Java对象,检测方法:
    • str.length() == 0
    • str.equals("")
  • null串:String变量的特殊值,表示目前没有任何对象与该变量关联,检测方法:
    • str == null
  • if(str != null && str.length() != 0):首先应检测str不为null。为什么?
    • 因为在一个null值上调用方法会出现错误。

3.6.9_构建字符串(StringBuilder)

3.6.4_检测字符串是否相等中说过:每次连接字符串都会产生一个新的String对象,这样做既耗时,又浪费空间。

3.7_输入输出

  • in.nextLine():读取一行输入数据,以回车分隔。
  • in.next():读取一个单词,以空白符作为分隔。

3.7.2_格式化输出

  • System.out.print("%8.2f", x);:用8个字符宽度和小数点后两个字符的精度打印x;
    • 33333.33
  • %:以%开始的格式说明符都用相应的参数替换。
    • print("%s %d", name, age);
  • String.format():String s = String.format("%s %d", name, age);

3.7.3_文件输入与输出

3.8_控制流程

3.8.1_块作用域

不能在嵌套的两个块中声明同名变量,例子:

void f() {
  int n;
  {
    int k;  // k只
    int n;  // error;
  }
}

3.8.5_多重选择:switch语句

  • case标签可以是:
    • char、byte、short、int
    • 枚举常量
    • Java7开始支持String

3.8.6_中断控制流程语句

带标签的break语句

void f() {
  read_data;
  while (..) {
    ...
    for (..) {
      if(..)
        break read_data;  
    }
  }
}

3.9_大数值

  • BigInteger:实现任意精度的整数运算。
  • BigDecimal:实现任意精度的浮点数运算。

3.10_数组

  • 创建数组的三种方式
    • int[] a = new int[10];
    • int[] a = {1,2,3};
    • int[] a = new int[]{1,2,3}
  • 打印数组的快捷方式:System.out.print(Arrays.toString(arr))

3.10.3_数组拷贝

int[] arr1 = { 1,2,3,4,5 };
int[] arr2 = arr1;
arr2[4] = 12;   // arr1[4] == 12

Java中,允许一个数组变量拷贝给另一个数组变量,它们引用同一个数组。

  • static type[] Arrays.copyOf(arr1, arr1.length):将一个数组的所有值拷贝到另一个数组。
    • 第二个参数length没有限制。
    • 当数组有多余空间,它们的值为0/false
  • Arrays.copyOfRange(type[] a, int start, int end)
  • Arrays.binarySearch(type[] a, int start, int end, type v):采取二分查找算法查询指定值的下标。
  • Arrays.fill(type[] a, type v):将数组的所有值设置为v。

3.10.4_命令行参数

3.10.7_不规则数组