Java核心技术:卷I基础知识,第三章读书笔记

以下是我一章的读书笔记,描述的可能会很多,但是读完肯定会收获很多!加油!

关系和boolean运算符

Java沿用了C++的做法,使用&&表示逻辑“与”运算符,使用||表示逻辑“或”运算符。
从!=运算符可以想到,感叹号!就是逻辑非运算符。&&和||运算符是按照“短路”方式来求值的:如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了。
如果用&&运算符合并两个表达式。
而且已经计算得到第一个表达式的真值为false,那么结果就不可能为true。
因此,第二个表达式就不必计算了。可以利用这一点来避免错误。

位运算符

应用在布尔值上时,&和|运算符也会得到一个布尔值。这些运算符与&&和||运算符很类似,不过&和|运算符不采用“短路”方式来求值,也就是说,得到计算结果之前两个操作数都需要计算。

括号与运算符级别

&&的优先级比||的优先级高

子串

substring的工作方式有一个优点:容易计算子串的长度。字符串s.substring(a, b)的长度为b-a。例如,子串“Hel”的长度为3-0=3。

拼接

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

检测字符串是否相等

可以使用equals方法检测两个字符串是否相等。
如果字符串s与字符串t相等,则返回true;否则,返回false。需要注意,s与t可以是字符串变量,也可以是字符串字面量。
一定不要使用运算符检测两个字符串是否相等这个运算符只能够确定两个字符串是否放置在同一个位置上。当然,如果字符串放置在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。
如果虚拟机始终将相同的字符串共享,就可以使用运算符检测是否相等。
但实际上只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的。因此,千万不要使用运算符测试字符串的相等性,以免在程序中出现糟糕的bug。
从表面上看,这种bug很像随机产生的间歇性错误。

构建字符串

采用字符串连接的方式达到此目的效率比较低。每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类就可以避免这个问题的发生。如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行。首先,构建一个空的字符串构建器:

StringBuilder builder = new StringBuilder();
//当每次需要添加一部分内容是,就调用append方法。
builder.append(ch);//appends a single character
builder.append(str);//appends a string 

在需要构建字符串时就调用toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列。

String completedString = builder.toString();

注释在JDK5.0中引入StringBuilder类。这个类的前身是StringBuffer,其效率稍有些低,但允许采用多线程的方式执行添加或删除字符的操作。如果所有字符串在一个单线程中编辑(通常都是这样),则应该用StringBuilder替代它。这两个类的API是相同的。

读取输入

前面已经看到,打印输出到“标准输出流”(即控制台窗口)是一件非常容易的事情,只要调用System.out.println即可。然而,读取“标准输入流”System.in就没有那么简单了。要想通过控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联。

Scanner in = new Scanner(System.in);
//现在,就可以使用Scanner类的各种方法实现输入操作了。例如,nextLine方法将输入一行。
System.out.print("What is your name?")
String name = in.nextLine();
//在这里,使用nextLine方法是因为在输入行中有可能包含空格。要想读取一个单词(以空白符作为分隔符),就调用
String firstName = in.next();
//要想读取一个整数,就调用nextInt方法。
System.out.print("How old are you?);
int age = in.nextInt();
//最后,在程序的最开始添加上一行:
import java.util.*;

Scanner类定义在java.util包中。当使用的类不是定义在基本java.lang包中时,一定要使用import指示字将相应的包加载进来。

格式化输出

表3-7 日期和时间的转换符
在这里插入图片描述
从表3-7可以看到,某些格式只给出了指定日期的部分信息。例如,只有日期或月份。如果需要多次对日期操作才能实现对每一部分进行格式化的目的就太笨拙了。为此,可以采用一个格式化的字符串指出要被格式化的参数索引。索引必须紧跟在%后面,并以$终止。例如,

System.out.printf("%1$s %2$tB %2$te, %2$tY","Due date:",new Date());

打印。
注意:参数索引值从1开始,而不是从0开始,%1$….对第1个参数格式化。这就避免了与0标志混淆。
当采用命令行方式启动一个程序时,可以利用Shell的重定向语法将任意文件关联到System.in和System.out:

java MyProg <myfile.txt>output.txt
//这样就不必担心处理IOException异常了。

块作用域

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

for each 循环

for each循环语句的循环变量将会遍历数组中的每个元素,而不需要使用下标值。
有个更加简单的方式打印数组中的所有值,即利用Arrays类的toString方法。调用Arrays.toString(a),返回一个包含数组元素的字符串,这些元素被放置在括号内,并用逗号分隔,例如,“[2,3,5,7,11,13]”。要想打印数组,可以调用

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

数组初始化以及匿名数组

在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写形式。下面是一个例子:

int[] smallPrimes = {2, 3, 5, 7, 11, 13};
//请注意,在使用这种语句时,不需要调用new。甚至还可以初始化一个匿名的数组:
new int[] {17, 19, 23, 29, 31, 37}

这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数。使用这种语法形式可以在不创建新变量的情况下重新初始化一个数组.例如:

smallPrimes = new int[] {17,19,23,29,31,37};

这是下列语句的简写形式:

int[] anonymous = {17,19,23,29,31,37};
samllPrimes = anonymous;

在Java中,允许数组长度为0。在编写一个结果为数组的方法时,如果碰巧结果为空,则这种语法形式就显得非常有用。此时可以创建一个长度为0的数组:

new elementType[0]
//注意,数组长度为0与null不同。

这篇文章有点长,这些都是我从非常厚的书中选取的我认为更重要的东西!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值