知识点
关键字public 称为访问修饰符(access modifier):用于控制程序的其他部分对这段代码的访问级别;
关键字class 表明Java程序中的全部内容都包含在类中;类是构建所有Java应用程序和applet的构建块。
类名:驼峰命名法;
源代码的文件名必须与公共类的名字相同,并用.java作为扩展名。
运行已编译的程序时,Java虚拟机将从指定类中的main方法开始执行;
根据Java语言规范,main方法必须声明为public
java中任何方法的代码都用“{”开始,用“}”结束;
关于打印字符串的语句:System.out对象并调用了它的println方法;
注释
// 单行
/* … */ 多行注释
/**… */ 文档注释,可用于自动生成文档。
数据类型
Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共有8种基本类型(primitive type),其中有4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char(请参见论述char类型的章节)和1种用于表示真值的boolean类型。
1、整形
byte 是 整形变量!!
byte a = 17; System.out.println("a = " + a); a = -127; System.out.println("a = " + a); a = 127; System.out.println("a = " + a); a = 128; // 报错
byte和short类型主要用于特定的应用场合,例如,底层的文件处理或者需要控制占用存储空间量的大数组。
在Java中,整型的范围与运行Java代码的机器无关。
长整型数值有一个后缀L或l(如4000000000L)。十六进制数值有一个前缀0x或0X(如0xCAFE)。八进制有一个前缀0,例如,010对应八进制中的8。
int x = 0x12; //18 System.out.println("x = " + x); byte y = 010; // 8 System.out.println("y = " + y);
2、浮点类型
绝大部分应用程序都采用double类型。
float类型的数值有一个后缀F或f(例如,3.14F)。没有后缀F的浮点数值(如3.14)默认为double类型。
可以使用十六进制表示浮点数值;其中尾数采用十六进制,指数采用十进制;
所有的浮点数值计算都遵循IEEE 754规范。
常量Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN(以及相应的Float类型的常量)分别表示这三个特殊的值;
System.out.println(Double.POSITIVE_INFINITY); // Infinity System.out.println(Double.NaN); // NaN System.out.println(Double.NEGATIVE_INFINITY); // -Infinity
所有“非数值”的值都认为是不相同的 —》 使用Double.isNaN(x)来检查x是否为一个数。
浮点数值不适用于无法接受舍入误差的金融计算中,如果希望数值计算中不允许有任何误差,就可以使用BigDecimal
类。
3、char类型
Unicode字符可以用一个char值描述,另外一些Unicode字符则需要两个char值;
char类型的字面量值要用单引号括起来。
char类型的值可以表示为十六进制值,其范围从\u0000
到\uffff
。
\u表示转义序列,可以出现在加引号的字符字面量中或字符串中,其他表示在特殊字符的转义序列如下:
特殊: 转义序列\u还可以出现在加引号的字符常量或字符串之外;
警告: Unicode转义序列会在解析代码之前得到处理!!!
Unicode和char类型:
Unicode1.0设置16位的Unicode字符集,但不能满足描述所有Unicode字符的需要;
在Java中,char类型描述了UTF-16编码中的一个代码单元。
最好不要在程序中使用char类型,最好将字符串作为抽象数据类型处理;
4、boolean类型
boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。
note:整型值和布尔值之间不能进行相互转换。
变量
变量名必须是一个以字母开头并由字母或数字构成的序列;
不能使用一个未初始化的变量;
在java中,不区分变量的声明与定义;
常量
利用关键字final指示常量;关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。
常量名习惯上使用大写。
类常量:希望某个常量可以在一个类中的多个方法中使用。关键字 static final
用来设置类常量;
类常量的定义位于main方法的外部。在同一个类的其他方法中也可以使用这个常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。
在Math类中,包含了各种各样的数学函数;
求余数时,当被除数为负数时,余数为负数,可以采用((position+adjustment)% 12+12)%12方法来使得余数恒定为正数,其中12表示除数;
被除数为正时,余数恒为正;
import static java.lang.Math.* // 导入包,直接使用Math的静态函数,不需要在方法名和常量名加“math"前缀
在Math类中,为了达到最快的性能,所有的方法都使用计算机浮点单元中的例程。如果可预测的结果更加重要的话,fdlibm用来实现算法,保证在所有平台上得到相同的结果。
将boolean类型和数值类型进行转换时:使用条件表达式b?1:0;
Note: 位运算符应用在布尔值上,也会得到一个布尔值。这些运算符与&&和||运算符很类似,不过&和|运算符不采用“短路”方式来求值,也就是说,得到计算结果之前两个操作数都需要计算。
算术运算符:>> 和 <<
逻辑运算符:>>> 和<<<
枚举类型
变量的取值只在一个有限的集合内,可以自定义枚举类型。枚举类型包括有限个命名的值。
字符串
从概念上讲,Java字符串就是Unicode字符序列。
Java没有内置的字符串类型,而是在标准Java类中提供了一个预定义类,很自然地叫做String。
每个用双引号括起来的字符串都是String类的一个实例。
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串;
String.join
使用分隔符连接多个字符串。
不可变字符串:
由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如同数字3永远是数字3一样,字符串“Hello”永远包含字符H、e、l、l和o的代码单元序列,而不能修改其中的任何一个字符。
”可变字符串“:当然,可以修改字符串变量greeting,让它引用另外一个字符串,这就如同可以将存放3的数值变量改成存放4一样。
可变的方式通过拼接效率不高,但是不可变字符串可以使得:编译器可以让字符串共享(各种字符串存放在公共的存储池中)。
如果将字符串变量赋予另外一个字符串常量,不会产生内存泄漏,原始字符串放在堆中,垃圾回收机制会将不适用的内存进行回收。
只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的;
空串与Null串:
检查空串:if (str.length() == 0)
或者 if (str.equals(“”))
String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联;
检查一个字符串既不是null也不为空串: if (str != null && str.length != 0)
,首先要检查str不为null;
码点与代码单元
在Java中,char类型描述了UTF-16编码中的一个代码单元。
码点(code point)是指与一个编码表中的某个字符对应的代码值。
UTF-16编码采用不同长度的编码表示所有Unicode码点。在基本的多语言级别中.每个字符用16位表示,通常被称为代码单元(code unit);而辅助字符采用一对连续的代码单元进行编码。
char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
length()
方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量。
想得到实际的长度,即码点数量,使用codePointCount方法。
返回位置n的代码单元, s.charAt(n)。
返回第i个码点,greeting.codePointAt(index)
码点数组和字符串可相互转换!
String API
查看文档。
创建字符串:
String API
查看文档。
创建字符串:
输入输出
获取输入:要想通过控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联。
当使用的类不是定义在基本java.lang
包中时,一定要使用import指示字将相应的包加载进来。
因为输入是可见的,所以Scanner类不适用于从控制台读取密码;
读取密码使用Console类实现;
使用printf格式化输出;
可以使用s转换符格式化任意的对象。对于任意实现了Formattable接口的对象都将调用formatTo方法;否则将调用toString
方法,它可以将对象转换为字符串。
以使用静态的String.format
方法创建一个格式化的字符串;
时间转换格式符,查表。
文件输入与输出:
以使用静态的String.format方法创建一个格式化的字符串
要想对文件进行读取,就需要一个用File对象构造一个Scanner
对象;读取一个文本文件时,要知道它的字符编码;类似从控制台输入
要想写入文件,就需要构造一个PrintWrite
r对象。
当采用命令行方式启动一个程序时,可以利用Shell的重定向语法将任意文件关联到System.in和System.out:
java Myprog < myfile.txt > output.txt
根据给定的路径名构造一个Path: Paths.get(“文件uri”);
> 大数值 如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。 Java语言的设计者确实为字符串的连接重载了**+运算符**,但**没有重载其他的运算符**,也没有给Java程序员在自己的类中重载运算符的机会。
数组
数组是一种数据结构,用来存储同一类型值的集合。
一旦创建了数组,就不能再改变它的大小(尽管可以改变每一个数组元素);
for each循环:Java有一种功能很强的循环结构,可以用来依次处理数组中的每个元素;
for (var : collection) statement;
collection
这一集合表达式必须是一个数组或者是一个实现了iterable接口的类对象(例如ArrayList)。
如果不希望遍历集合中的每个元素,或者在循环内部需要使用下标值,还是需要使用传统的方法。
利用Arrays类的toString方法,调用Arrays.toString(a),返回一个包含数组元素的字符串;
数组初始化以及匿名数组:
在Java中,允许数组长度为0。在编写一个结果为数组的方法时,如果碰巧结果为空,则这种语法形式就显得非常有用。
拷贝所有值:Arrays.copyOf(), 这个方法通常用来增加数组的大小,用来扩容!!
命令行参数
带String arg[]参数,表示main方法,接受一个字符串数组,命令行中,每个字符串用空格分隔开。
在Java应用程序的main方法中,程序名并没有存储在args数组中。
数组排序:Arrays.sort(), 数组原地排序。
Arrays API 包含很多对数组操作的函数。
多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式;
不规则数组: