计算机系统中的主要硬件组件:
主存用于保存正在被CPU执行的程序,辅存(e.g. 硬盘,USB闪存)则以永久保存的方式存储软件
对于很多计算机来说,每一个主存单元保存1字节(Byte)。保存的数据超过1B时,将由多个且连续的主存单元保存
主存是不稳定的,仅当有电力供应时,数据和信息才得以保存
辅助存储器通常是稳定的,在断电后依然可以保存下来
高速缓存(cache)用于减少CPU访问指令和数据的平均时间,是一个访问速度很快的小存储区,其中保存了主存访问最频繁的信息。现代CPU同时具有一个加速指令获取速度的指令缓存,和一个加速数据访问的数据缓存
磁盘是磁性介质,每个数据位在磁性介质中都以磁化粒子表示。读写磁头通过在旋转的磁盘片上移动,从而按需要读取或写入信息。一个磁盘通常包含有许多层磁盘片,全部固定在同一个轴上,每一层磁盘都有自己的读写磁头
磁盘是直接存取设备,其读写磁头可以在磁盘上移动,直接移动到所需信息的位置
USB闪存也是直接存取设备,但不需要机械移动
“直接存取”和“随机存取”这两个术语有事可以互换使用
在磁盘变得流行之前,磁带曾作为辅助存储设备使用
只有当磁带中的信息经过磁头时,才可以读写数据,而不是由磁头直接到达指定的读写位置
由于磁带必须经过快速倒带或者快进才能使得相应信息达到磁头位置,因此被认为是顺序存取设备
RAM和主存储器一般可以互换称谓,它们是存储动态程序和数据的设备
ROM是嵌入在计算机主板上的芯片或便携式存储器(e.g. 光盘)
BIOS就是用ROM存的
CD-ROM = Compact Disc,read-only memory
新型CD技术,如CD-R,可以使用户进行一次性的数据烧录,一经烧录无法更改
CD是用模子刻出来的,而CD-R是用激光烧录的
DVD = Digital Video Disc / Digital Versatile Disc,比CD有着更高密度的压缩格式
Moore's Law:每隔18个月,存储设备的容量增加一倍。しかし、当存储容量接近绝对物理极限时,这种增长速度将逐步降低
println
等方法并不定义在程序中,而是定义在System.out
对象中,which 属于Java标准类库println
等方法并不是Java语言的组成部分,但是可以在任何Java程序中使用/*
后面紧跟着第二个星号,则可以使用Javadoc自动将该段注释生成为程序的外部注释文档""
并不是null
,也不是"\0"
print
和println
方法System.out
对象表示一个输出设备或文件。Particularly speaking,这里的对象名为out
,保存在System
类中byte
, short
, int
, long
),2种浮点(float
, double
),字符及布尔类型 | 存储空间(bit) | 最小值 | 最大值 |
---|---|---|---|
byte | 8 | -128 | 127 |
short | 16 | -32768 | 32767 |
int | 32 | -2147483648 | 2147483647 |
long | 64 | -9223372036854775808 | 9223372036854775807 |
float | 32 | 约为-3.4E+38,7位有效数字 | 约为3.4E+38,7位有效数字 |
double | 64 | 约为-1.7E+308,15位有效数字 | 约为1.7E+308,15位有效数字 |
模的返回值的符号和被除数符号一致,如-20 % 3 == -2
如果有一个或两个操作数是浮点型,那么结果就是浮点型
如果两个数都是整数,那么”/“就完成整除,如果有浮点数,那么就完成浮点除法
优先级 | 运算符 | 结合性 |
---|---|---|
1 | [](数组索引),.(对象成员引用),后缀++,后缀-- | 从左到右 |
2 | 前缀++,前缀--,前缀+,前缀-,~(按位not),!(逻辑not) | 从右到左 |
3 | new(实例化对象),(TYPENAME)(强制类型转换) | 从右到左 |
4 | *,/,% | 从左到右 |
5 | +,- | 从左到右 |
6 | <<,>>,>>>(带0右移) | 从左到右 |
7 | <,>,<=,>=,instanceof(类型比较) | 从左到右 |
8 | ==,!= | 从左到右 |
9 | &(按位and 以及 布尔and) | 从左到右 |
10 | ^(按位xor 以及 布尔xor) | 从左到右 |
11 | |(按位or 以及 布尔or) | 从左到右 |
12 | &&(逻辑and) | 从左到右 |
13 | ||(逻辑or) | 从左到右 |
14 | ?:(三目条件运算符) | 从右到左 |
15 | =(赋值),+=,-=,*=,/=,%=,<<=,>>=,>>>=,&=,^=,|= | 从右到左 |
16 | ->(lambda表达式) | 从右到左 |
a++
的结果不能作为左值,而++a
可以
表达式a++
的值是一个临时变量,所以不能给临时变量赋值(因为它们马上就消失了)
表达式++a
的值是 a,不是临时变量;因为没有创建临时变量,++a
的效率比a++
更高(在没有编译器优化的条件下)
println
为例:这一方法是标准输入输出流System.out
对象提供的服务。更确切地说,标识符out
是一个对象变量,保存在System
类中System
类是java标准类库中的预定义类,直接使用即可null
表示该变量不指向任何对象方法 | 介绍 |
---|---|
String(String str) |
构造 |
char charAt(int index) |
下标读取 |
int compareTo(String str) |
正值,0,负值分别表示本对象的字符串按字典序先于、等于、后于str对象的字符串 |
String concat(String str) |
返回一个本对象字符串和str对象字符串拼接后的新字符串 |
boolean equals(String str) |
如果本对象字符串和str的相同,返回true,否则为false |
boolean equalsIgnoreCase(String str) |
忽略大小写的比较 |
int length() |
返回字符个数 |
String replace(char oldChar, char newChar) |
将本对象字符串中的oldChar用newChar替换后,构成新字符串对象返回,必须同时为字符串或者字符 |
String substring(int offset, int endIndex) |
返回从offset开始到endIndex-1为止的子串 |
String toLowerCase() |
串中所有大写转小写 |
String toUpperCase() |
串中所有小写转大写 |
String的索引从0开始
import
声明java.util.Scanner
,即写出所属的包名和类名,或者先import
再写Scanner
,import后只需要写类名方法 | 介绍 |
---|---|
Random() |
构造 |
float nextFloat() |
返回一个分布在[0.0,1.0)的浮点随机数 |
int nextInt() |
返回随机整数,取值分布在整个int的区间 |
int nextInt(int num) |
返回一个随机整数,取值分布在0 ~(num - 1) |
ordinal
方法可以返回枚举值在enum中的序数值name
方法返回枚举值的名称,which和定义该枚举值的标识符相同new Integer()
构造Integer了(在IDEA中甚至会直接报错);官方推荐使用Integer.valueOf()
构造,或者也可以直接赋值,或者parseIntMIN_VALUE
和MAX_VALUE
等常用的静态常量p107-119的GUI开发部分,同上暂且略去
&&
和 ||
的一个重要特点就是“短路”。当左操作数以足以确定整个运算的布尔结果,那么右操作数就不会再参与运算if
语句if
语句else
子句和它前面最近的没有匹配项的if
语句相匹配==
比较浮点数时,只有所有的二进制位都相等时才相等用==
比较对象时,实际上是判断两个引用变量是否互为别名
字符串常量提供了一种方便性,实际上是一种创建字符串对象的快捷技术
java在需要时只会为多次使用的一个字符串常量创建一个对象。比如,如果字符串常量“Hi”在某个方法中多次被使用,java只会创建一个String对象来代表它。因此下面两个if语句的布尔表达式都为true:
String str = "software";
if(str == "software") { do sth. }
if(str.equals("software")) { do sth. }
在上述代码中,后面每次使用字符串常量“software”,都会引用其原始对象
用compareTo
方法来知道两个字符串的相对字典序
compareTo
先逐字比较字符大小,最后才考虑长度
以下是一个无限循环的例子:
double num = 1.0;
while(num != 0.0){
num = num - 0.1;
}
Iterator
接口来定义的hasNext
方法,以及一个next
方法,用来取得集合中下一个要处理的元素fileScan = new Scanner(new File("filename"));
urlScan = new Scanner(str);
sc.useDelimiter()
方法设定分隔符,比如读取url时可以:urlScan.useDelimiter("/")
toString
方法输出所有元素P148-157 讲GUI,暂略去
char
,byte
,short
,int
,枚举类型,jdk7以后也可以是String。但是,不能为boolean
或者float
?:
在效率上不会比if-else
更快。效率是否相等取决于编译器是否会进行优化for
语句for-each
循环for-each
的写法示例:for(int i:arr) ...do something...
,其中arr是一个可以遍历的对象,代码中假定每个元素均为int
hasNext
和next
方法,可以处理一个集合中的各元素项for-each
的前提是对象实现了Iterable
接口P173-180,GUI,略
静态变量有时也被称为类变量
static 变量由所有的class实例共享
对于一个class的所有object,只存在一个static变量试题。因此,在一个object中改变static变量的值将会直接影响其他所有对象
用final
声明的常量,也常使用static
修饰
String
是非常基础的类,以至于在UML中经常将它作为primitive类型来描述hasNext
和next
,前者返回布尔值,后者返回对象,均没有参数next
方法以什么样的顺序返回下一个处理对象,取决于Iterator接口实现类的设计者next
并不会删除基本集合中的下一个对象,而是仅仅返回下一个对象的引用p217-223,GUI,略
isUpperCase
和isLowerCase
可以用int a[]
不被推荐String[] args
参数代表命令行实参,在调用解释器时将提供给程序public double average(int ... list){}
,省略号表示该方法接收的参数个数是可变的,在方法内可以按正常的数组处理参数p249-256,GUI,略
可见性修饰符用于控制对类成员的访问,这种可控制也延伸到继承的过程中
父类的private方法或变量不能在子类中访问,或者通过子类对象访问
当一个变量或方法用protected修饰时,子类就可以引用它,并且使父类保持了一定的封装性
protected的可见性介于private和public之间
Specifically,声明为protected的变量和方法,除了可被子类引用,还可以由同一个包内的任何类引用
关于可见性修饰符
修饰符 | 类和接口 | 方法和变量 |
---|---|---|
无(默认) | 所有包中可见 | 同一包中任何类和子类可见 |
public | 任何地方可见 | 任何地方可见 |
protected | 仅应用于内部类;包内和子类可见 | 同一包内的任何类和子类可见 |
private | 仅应用于内部类;仅在外围类中可见 | 对其它类都不可见 |
UML中protected成员前加“#”
子类继承所有的的方法和变量,即使是private的
子类不能按名引用父类的private成员
但是,构造方法作为一种特殊的方法不会被继承
super()
调用p276-284,GUI,略
p310-317,GUI,略