目录
二、Java程序设计环境

三、Java的基本程序设计结构
3.1 一个简单的java应用程序
使用System.out对象并调用的它的println方法。注意:点号 . 用于调用方法
3.2 数据类型
十六进制数值有一个前缀0x;八进制有一个前缀0;二进制有一个前缀0b;
Unicode编码单元可以表示为十六进制值,其范围从\u0000到\Uffff
3.3 标识符命名规范
①包名:多个单词组成时所有字母都小写:aaa.bbb.ccc
②类名、接口名:多个单词组成时,所有单词的首字母大写:XxxYyyZzz
③变量名、方法名:多个单词组成时,第一个单词的首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz【驼峰法】
④常量名:所有字母都大写,多单词时每个单词用下划线连接:XXX_YYY_ZZZ
3.4 运算符
对于使用strictfp关键字标记的方法必须使用严格的浮点计算来产生理想的结果。
例如:可以把main方法标记为
public static strictfp void main([String[] args])
于是,在main方法中的所有指令都将使用严格的浮点计算。
3.4.1 位运算符
>>和<<运算符将二进制位进行右移或左移
>>>运算符将用0填充高位,>>运算符用符号位填充高位。没有<<<运算符
3.4.2 数学函数与常量
在Java中没有幂运算,因此需要借助Math类的pow方法
double y = Math.pow(x,a);
//将y的值设置为x的a次幂。pow方法有两个double类型的参数,其返回结果也为double类型
3.4.3 强制类型转换
如果想对浮点数进行四舍五入运算,需要使用Math.round方法
double x = 9.997;
int nx =(int) Math.round(x); //现在变量nx的值为10
当调用round的时候,仍然需要使用强制类型转换(int)。其原因是round方法返回的结果为long类型,由于存在信息丢失的可能性,所以只能使用显式的强制类型转换才能将long转为int类型
3.5 字符串
3.5.1 子串
String的substring方法可以从一个较大的字符串提取出一个子串
String greeting = "Hello";
String s = greeting.substring(0,3); //创建了一个由字符Hel组成的字符串
substring方法的第二个参数是不包含这个数。即前闭后开。
3.5.2 不可变字符串
String类没有提供用于修改字符串的方法。如果想要修改greet为Help!,不能直接将greeting的最后两个位置的字符串修改为p和!。想修改首先提取需要的字符串,其次再拼接上替换的字符串
greeting = "Hello";
greeting = greeting.substring(0,3) + "p!"; //结果为Help!
3.5.3 检测字符串是否相等
使用equals方法检测两个字符串是否相等
想要检测两个字符串是否相等并且不区分大小写,可以使用equalsIgnoreCase方法
"Hello".equalsIgnoreCase("hello");
3.6 输入输出
3.6.1 读取输入
想通过控制台进行输入,首先要构造一个Scanner对象,并与“标准输入流”System.in关联
Scanner in = new Scanner(System.in);
现在就可以使用Scanner类的各种方法实现输入操作了
System.out.printli("What is your name?");
String name = in.nextLine(); //nextLine方法将输入一行
在这里使用nextLint方法是因为在输入行中有可能包含空格
3.7 控制流程
3.7.1 块作用域
不能在嵌套的两个块中声明同名的变量
3.7.2 for循环
如果在for语句内部定义一个变量,这个变量就不能在循环体之外使用。因此,如果希望在for循环体之外使用循环计数器的最终值,就要确保这个变量在循环语句的前面且在外部声明
3.8 数组
3.8.1 数组拷贝
如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length);
第二个参数是新数组的长度。这个方法通常用来增加数组的大小
3.8.2 数组排序
想要对数值型数组进行排序,可以使用Arrays类中的sort方法
int[] a = new int[10000];
.....
Arrays.sort(a)
四、对象与类
4.1 面向对象程序设计概述
4.1.1 类
由类构造对象的过程称为创建类的实例
对象中的数据称为实例域;操纵数据的过程称为方法
实现封装的关键在于绝对不能让类中的方法直接地访问其它类的实例域
4.1.2 类之间的关系
- 依赖:如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类
- 聚合:聚合关系意味着类A的对象包含类B的对象
- 继承:如果类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能
4.2 方法参数
按值调用表示方法接收的是调用者提供的值,而按引用调用表示方法接收的是调用者提供的变量地址
4.3 文档注释
4.3.1 方法注释
- param 变量描述:这个标记将对当前方法的param(参数)部分添加一个条目
- return描述:这个标记将对当前方法添加return(返回)部分。这个描述可以跨越多行
- throws类描述:这个标记将添加一个注释,用于表示这个方法有可能抛出异常
4.3.2 通用注释
@see引用:这个标记将在"see also"部分增加一个超级链接
如果@see标记后面有一个<符号,就需要指定一个超链接。可以超链接到任何URL
五、继承
5.1 泛型数组列表
size()方法用于返回数组列表中包含的实际元素数目,它等价于数组a的a.length
一旦能够确认数组列表的大小不再发生变化,就可以调用trimToSize方法。这个方法将存储区域的大小调整为当前元素数量所需要的存储空间数目
5.2 对象包装器与自动装箱
对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器类还是final,因此不能定义它们的子类
==运算符也可以应用于对象包装器对象,只不过检测的是对象是否指向同一个存储区域。
5.3 枚举
在比较两个枚举类型的值时,永远不需要调用equals,而直接使用"=='就可以了
toString的逆方法是静态方法valueOf
每个枚举类型都有一个静态的values方法,它将返回一个包含全部枚举值的数组
5.4 反射
能够分析类能力的程序称为反射
5.4.1 Class类
一个Class对象将表示一个特定类的属性
newInstance()方法可以用来快速地创建一个类的实例。newInstance方法调用默认的构造器初始化新创建的对象
5.4.2 捕获异常
异常有两种状态:未检查异常和已检查异常
5.4.3 利用反射分析类的能力
在java.lang.reflect包中有三个类Field、Method、和Constructor分别用于描述类的域、方法和构造器
Class类中的getFields、getMethods和getConstructors方法将分别返回类提供的public域、方法和构造器数组,其中包括超累的公有成员。
Class类中的getDeclareFields、getDeclareMethods和getDeclaredConstructors方法将分别返回类中声明的全部域、方法和构造器,其中包括私有和受保护成员,但不包括超类的成员
5.4.4 调用任意方法
在Mehtod类中有一个invoke()方法,它允许第哦啊用包装在当前Method对象中的方法
六、接口与内部类
6.1 内部类
使用内部类的主要原因有以下三点
①内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据
②内部类可以对同一个包中的其他类隐藏起来
③当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
七、集合
7.1 开发中如何选择集合实现类
1. 先判断存储的类型(一组对象[单列]或一组键值对[双列])
2. 一组对象[单列]:Collection接口
允许重复:List
增删多:LinkedList【底层维护了一个双向链表】
改查多:ArrayList【底层维护Object类型的可变数组】
不允许重复:Set
无序:HashSet【底层是HashMap,维护了一个哈希表,即(数组+链表+红黑树)】
排序:TreeSet
插入和取出顺序一致:LinkedHashSet,维护数组+双向链表
3.一组键值对[双列]:Map
键无序:HashMap【底层是哈希表,在jdk7里底层是数组+链表,jdk8里是数组+链表+红黑树】
键排序:TreeMap
键插入和取出顺序一致:LinkedHashMap
读取文件:Properties
4.需要线程同步安全时,使用Vector
八、多线程
8.1 线程的基本使用
1. 继承Thread类,重写run方法
2. 实现Runnable接口,重写run方法 (java是单继承机制,推荐使用Runnable)
8.2 常用方法
① setName:设置线程名称,使之与参数name相同
② getName:返回该线程的名称
③ start:使该线程开始执行;Java虚拟机底层调用该线程的start0方法
④ run:调用线程对象的run方法
⑤ setPriority:更改线程的优先级
⑥ getPriority:获取线程的优先级
⑦ sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
⑧ interrupt:中断线程
⑨ yield:线程的礼让。让出cpu,让其它线程执行,但礼让的时间不确定,所以也不一定礼让成功
⑩ join:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务
8.3 线程的状态
- New:新创建的线程,尚未执行;
- Runnable:运行中的线程,正在执行run()方法的Java代码;
- Blocked:运行中的线程,因为某些操作被阻塞而挂起;
- Waiting:运行中的线程,因为某些操作在等待中;
- Timed Waiting:运行中的线程,因为执行sleep()方法正在计时等待;
- Terminated:线程已终止,因为
run()方法执行完毕。

线程启动后,可以在Runnable、Blocked、Waiting、Timed Waiting这几个状态来回切换,直到最后变成Terminated状态。线程停止
九、常用类
9.1 String、StringBuffer和StringBuilder
1.如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder
2.如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder
3.如果字符串存在大量的修改操作,并存在多线程的情况,使用StringBuffer
4.如果字符串很少修改,并且被多个对象引用,使用String,比如配置信息等