Java核心技术-Java的基本程序设计结构
1.一个简单的Java应用程序
public class FirstSample { public static void main(String[] args) { System.out.pringln("We will not use 'Hello,World!'"); } }
这个程序虽然简单,但所有的Java应用程序都具有这种结构:
首先,Java区分大小写(如将main写成Main程序将无法运行)
下面逐行分析这段代码:
public关键字称为访问修饰符,用于控制程序的其它部分对这段代码的访问级别。
class关键字表明Java程序中的全部内容都包含在类中。
类名紧跟在class关键字后面,名字必须以字母开头,后面可以跟字母和数字的任意组合,不能使用Java关键字
static关键字修饰的方法称为类方法
void关键字表示无返回类型
标准的命名规范——骆驼命名法
源代码的文件名必须与类名相同
2.注释
1.// 最常用的注释方式,其注释内容从//开始到本行结尾
2./*和*/ 用于长篇注释,将注释内容放在/*和*/中间
3./**和*/用来生成自动文档,将注释内容放在/**和*/中间
3.数据类型
Java是一种强类型语言,必须为每一个变量声明一种类型。
基本数据类型:4种整型、2种浮点型、1种字符型、一种布尔型
3.1 整型
从Java7开始,加上前缀0b或0B就可以写二进制数。(0b1001表示9)
从Java7开始,还可以为数字字面量加下划线(1_000_000表示100万)
3.2 浮点类型
三种特殊的浮点数值:正无穷大(一个正整数除以0)、负无穷大、NaN(不是一个数字,如0/0或者负数的平方根)
不能用x==Double.NaN检测x是否等于Double.NaN,可以使用Double.isNaN(x)检测
2.0-1.1将打印出0.899999999999,如果数值在计算中不允许有任何误差,就应该用BigDecimal类
3.3 char类型
char类型的字面量要用单引号括起来
有些Unicode字符可以用一个char值描述,另外一些Unicode字符则需要两个char值
3.4 boolean类型
用来判定逻辑条件:true/false
4.变量
4.1 变量
变量名必须是一个以字母开头并由字母(包括”_“、"$")或数字构成的序列.
声明一个变量后,必须用赋值语句对变量进行显式的初始化。
变量的声明尽可能地靠近变量第一次使用的地方是一种良好的编程风格
4.2 常量
final关键字用于指示常量(习惯上常量名使用全大写)
static final设置一个类常量
5.运算符
strictfp关键字标记的方法必须使用严格的浮点计算来生成可再生的结果(有可能产生溢出)
5.1数学函数
floorMod方法是解决整数求余的问题
在Math类中,为了达到最快的性能,所有方法都使用计算机浮点单元中的例程,如果得到一个完全可预测的结果比运算速度更重要的话,应该使用StrictMath类。
5.2 数值类型之间的转换
转换顺序:double->float->long->int
int转float失效原因(https://blog.csdn.net/m1n_love/article/details/55224990)
5.3 强制类型转换
对浮点数进行舍入运算:Math.round
5.4 结合赋值和运算符
x+=4;
5.5 自增与自减运算符
5.6 关系和boolean运算符
==、!=、&&、||(短路)、x<y?x:y;
5.7 位运算符
&、|(不短路)、^、~、>>、<<(移位操作要进行模32操作或64)
5.8 括号与运算符级别
5.9 枚举类型
enum Size{ SMALL,MEDIUM,LARGE,EXTRA_LARGE}
Size s=Size.MEDIUM
6 字符串
Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫做String
6.1 子串
String类的substring方法
6.2 拼接
1.使用+号连接:当一个字符串与一个非字符串拼接时,后者会被转换成字符串(任何一个Java对象都能被转换成字符串)
2.如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法:String.join("/","S","M","L","XL");
6.3 不可变字符串
String类没有提供修改字符串的方法,因此Java文档中将String类对象称为不可变字符串。
不可变字符串有一个优点:编译器可以让字符串共享
Java设计者认为共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率
6.4 检测字符串是否相等
使用equals而不要使用==
如果虚拟机始终将相同的字符串共享,就可以使用==运算符检测是否相等。但实际上只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的,当使用==运算符测试字符串相等时,从表面上看,这种bug很像随机产生的间歇性错误。
6.5 空串与null串
if(str != null && str.length != 0) 首先检查str不为null
6.6 码点与代码单元
不要使用char数据类型(代码单元)来保存从字符串中取出的码点
6.7 构建字符串
构建字符串时如果采用字符串连接的方式,每次连接字符串都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类可以避免这个问题发生(单线程)。
StringBuffer类较StringBuilder类效率稍低,但允许在多线程中使用。
7 输入输出
7.1 读取输入
输入可见:Scanner in=new Scanner(System.in);
输入不可见:Console cons=System.console();
String username=cons.readLine("User name:");
char[] passwd=cons.readPassword("Password:");——每次只能读取一行输入,而没有能读取一个单词或一个数值的方法
7.2 格式化输出
System.printf("Hello,%s. Next year,you'll be %d",name,age);
每一个以%开始的格式说明符都用相应的参数替换
String date=String.format("%1$s %2$tB %2$te,%2$tY","Due date:",new Date());
格式说明符的语法图:
7.3 文件输入与输出
如果文件名中包含反斜杠符号,就要记住在每个反斜杠前加一个额外的反斜杠:"c:\\mydirectory\\myfile.txt"
查找文件路径:String dir=System.getProperty("user.dir");
8 控制流程
Java使用条件语句和循环结构确定控制流程
8.1 块作用域
块是指由一对大括号括起来的若干条简单的Java语句,块确定了变量的作用域。
8.2 条件语句
if/else
8.3 循环语句
while/do-while
8.4 确定循环
在循环中,检测两个浮点数是否相等需要格外小心:
for(double x=0;x!=10;x+=0.1) 因为0.1无法精确的使用二进制表示,所以循环可能永远无法结束
8.5 多重选择
switch
8.6 中断控制流程语句
Java中增加了一条带标签的break,用于跳出多重循环。
对于任何使用break语句的代码都需要检测循环是正常结束还是由break跳出。
9 大数值
大数值可以处理包含任意长度数字序列的数值
BigInteger(任意精度整数)和BigDecimal(任意精度浮点数)
lotterOdds=lotterOdds.multiply(BigInteger.valueOf(n-i+1).divide(BigInteger.valueOf(i));
10 数组
数组是一种数据结构,用来存储同一类型值得集合。
数字数组所有元素初始化为0;Boolean数组元素会初始化为false;对象数组得元素会初始化为null。
获得数组中的元素个数:array.length
一旦创建了数组,就不能改变它的大小。如果经常需要在运行中扩展数组的大小,就应该使用数组列表(ArrayList)。
要打印数组可以使用Arrays.toString(a);
10.1 增强for循环
for each循环可以用来依次处理数组中的每个元素(无需使用下标)
10.2 数组初始化以及匿名数组
数组的初始化:
int[] smallPrimes={2,3,5,6,11};
使用匿名数组可以在不创建新变量的情况下重新初始化一个数组。
smallPrimes=new int[]{17,18,23,29,31};
10.3 数组拷贝
一个数组变量拷贝给另一个数组变量:这时两个变量将引用同一个数组。
int[] luckyNumbers=smallPrimes;
一个数组的值拷贝给另一个数组:使用Arrays.copyOf方法:
int[] copiedLuckyNumbers=Arrays.copyOf(luckyNumbers,2*luckyNumbers.length);
10.4 命令行参数
10.5 数组排序
对数值型数组进行排序可以使用Arrays类中的sort方法,这个方法使用了优化的快速排序算法。
10.6 二维数组
多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式。
遍历二维数组:
for(int i=0;i<balances.length;i++)
{
for(int j=0;j<balances[i].length;j++)
{ ... }
}
for each循环语句不能自动处理二维数组的每一个元素,需要使用两个嵌套循环
要想快速打印一个二维数组的数据元素列表,可以调用:Arrays.deepToString(a));
10.6 不规则数组
Java实际上没有多维数组,只有一维数组,多维数组被解释为“数组的数组”