Java笔记(二)--Java的基本程序设计结构(二)

Author Avatar
Zhu Yuexin Mar 24, 2017
  • 字符串
  • 输入输出
  • 控制流程
  • 大数值
  • 数组

字符串

Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类:String。

字串

String类的substring方法可以用于提取字串:

String greeting = "Hello";
String s = greeting.substring(0, 3);

拼接

Java使用+号拼接两个字符串

如果需要把多个字符串放在一起,用一个界定符分隔,可以使用静态join方法:

String all = String.join("/", "S", "M", "L", "XL");    //all is the string "S/M/L/XL"

不可变字符串

String类中没有提供用于修改字符串的方法,在Java文档中将String类对象称为不可变字符串。

检测字符串是否相等

使用equals方法检测两个字符串是否相等:

s.equals(t);
"Hello".equalsIgnoreCase("Hello"); //不区分大小写

注意:不要使用 == 运算符检测两个字符串是否相等,这个运算符只能够确定两个字符串是否放置在同一个位置上。

空串与Null串

空串“”是长度为0的字符串。可以用以下代码检查一个字符串是否为空:

if(str.length() == 0)

if(str.equals(""))

注意:空串是一个Java对象,有自己的串长度(0)和内容(空)。

String变量还可以存放一个特殊值,null。这表示目前没有任何对象与该变量关联。

检测字符串是否为null:

if(str == null)

输入输出

标准输入流

读取“标准输入流”System.in,需要先构造一个Scanner对象,并与“标准输入流”System.in关联

Scanner in = new Scanner(System.in);

Console类: 适用于从控制台读取密码

Console cons = System.console();
String username = cons.readLine("User name: ");
//安全起见,返回密码存放在一维字符数组中。对密码进行处理后,马上用一个填充值覆盖数组元素
char[] passwd = cons.readPassword("Password: ");

格式化输出

Java SE 5.0 沿用了C语言库函数中的printf方法。例如,调用:

System.out.printf("%8.2f", x);

可以用8个字符的宽度和小数点后两个字符的精度打印x。例如:

3333.33

在printf中,每一个以%字符开始的格式说明符都用相应的参数替换。格式说明符尾部的转换符将指示被格式化的数值类型。例如:

System.out.printf("Hello, %s. Next year, you'll be %d", name, age);

用于printf的转换符

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

文件输入与输出

读取文件

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

Scanner in = new Scanner(Paths.get("myFile.txt"), "UTF-8");

如果文件名中包含反斜杠符号,就要在每个反斜杠之前再加一个额外的反斜杠:

“c:\\mydirectory\\myFile.txt”

写入文件

写入文件需要构造一个PrintWriter对象。在构造器中,提供文件名:

PrintWriter out = new PrintWriter("myFile.txt", "UTF-8");

如果该文件不存在,则会创建该文件。可以像输出到System.out一样使用print, println 以及 printf 命令。

控制流程

if, while, for….

带标签break语句:

Scanner in = new Scanner(System.in);
int n;
read_data: //这是标签,放在需要跳出的循环的最外层
while(...){
    ...
    for(...){
      System.out.print("Enter a number >= 0:");
      n = in.nextInt();
      if(n<0){
        break read_data; //跳出循环
      }
    }
}

大数值

如果基本的整数和浮点数的精度不能够满足需求,则可以使用java.math包中的BigIntegerBigDecimal

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

可以使用静态的valueOf方法将普通的数值转换为大数值:

BigInteger a = BigInteger.valueOf(100);

不能使用算术运算符(+,-,*,/)处理大数值。需要使用大数值类中的add,multiply方法等:

BigInteger c = a.add(b);
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); //d=c*(b+2)

API java.math.BigInteger 1.1

  • BigInteger add(BigInteger other)

  • BigInteger substract(BigInteger other)

  • BigInteger multiply(BigInteger other)

  • BigInteger divide(BigInteger other)

  • BigInteger mod(BigInteger other)

    返回这个大整数和另一个大整数other的和、差、积、商以及余数

  • int compareTo(BigInteger other)

    如果这个大整数与另一个大整数other相等,返回0;小于,返回复数;大于,返回正数

  • static BigInteger valueOf(long x)

    返回值等于x的大整数

API java.math.BigDecimal 1.1

  • BigDecimal add(BigDecimal other)

  • BigDecimal substract(BigDecimal other)

  • BigDecimal multiply(BigDecimal other)

  • BigDecimal divide(BIgDecimal other, RoundingMode mode)

    返回这个大实数与另一个大实数的和、差、积、商。要想计算商,必须给出舍入方式(rounding mode)。RoundingMode.HALF_UP是四舍五入方式。

  • int compareTo(BigDecimal other)

    如果这个大实数与另一个大实数other相等,返回0;小于,返回复数;大于,返回正数

  • static BigDecimal valueOf(long x)

  • static BigDecimal valueOf(long x, int s)

    返回值为x或$x/10^s$的一个大实数

数组

声明数组:

int[] a;

创建数组:

int[] a = new int[100];

创建一个数字数组时,所有元素都初始化为0;boolean数组的元素会初始化为false;对象数组的元素会初始化为特殊值null,表示这些元素还未存放任何对象。

for each循环

增强for循环:

for (variable : collection) statement

collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象(例如ArrayList)

int[] a = new int[100];
...
for (int element : a){
  System.out.println(element);
}

数组初始化及匿名数组

创建数组对象并同时赋予初始值:

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

初始化一个匿名数组:

new int[] { 17, 19, 21, 27};

这种语法可以在不创建新的变量的情况下重新初始化一个数组:

smallPrimes = new int[] { 17, 19, 21, 27};

数组拷贝

将一个数组变量拷贝给另一个数组变量,两个变量将引用同一个数组。

如果希望将一个数组的所有值拷贝到一个新的数组中去,使用Arrays类的copyOf方法:

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

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

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

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

API java.util.Arrays 1.2

  • static String toString(type[] a)

    返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔。如:

    [2, 3, 4, 5, 6]

  • static type copyOf(type[] a, int length)

  • static type copyOfRange(type[] a, int start, int end)

    返回与a类型相同的一个数组,长度为length或者end-start,数组元素为a的值

  • static void sort(type[] a)

    采用优化的快速排序算法对数组进行排序

  • static int binarySearch(type[] a, type v)

  • static int binarySearch(type[] a, int start, int end, type v)

    采用二分搜索算法查找值v。如果查找成功,则返回相应的下标值;否则,返回一个复数值r。

  • static void fill(type[] a, type v)

    将数组的所有数据元素值设置为v

  • static boolean equals(type[] a, type[] b)

    如果两个数组大小相同,并且下标相同的元素都对应相等,返回true

多维数组

声明:

double[][] balances;

初始化:

balances = new double[NYEARS][NRATES];
int[][] magicSquare =
{
  {16, 18, 2, 13},
  {28, 12, 32, 12}
};

快速打印二维数组元素列表,使用Arrays.deepToString()方法:

System.out.println(Arrays.deepToString(a));

不规则数组

java实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”。

int[][] odds =
{
  {1},
  {1, 2},
  {1, 2, 3}
};