Java笔记(二)--Java的基本程序设计结构(二)
- 字符串
- 输入输出
- 控制流程
- 大数值
- 数组
字符串
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包中的BigInteger和BigDecimal。
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}
};