Java的基本程序设计结构《Java核心技术 SE8》
一个简单的Java应用程序
关键字:public class static void
public class FirstSample{
public static void main(String[] args){
System.out.println("Hello,World!");
}
}
Java区分大小写;
关键字class表明类是构建java应用程序的构建块,Java程序中的全部内容都包含在类中。
分号作为语句的结束,{}划分程序块。
类名首字母大写,驼峰命名;
方法名首字母小写,驼峰命名;
.用于调用方法;
源文件的文件名必须与公共类的名字相同。
运行编译号的程序时,Java虚拟机将从指定类中的main方法开始执行。
注释
/**
* JavaDoc文档注释
*/
public class FirstSample{
/*
长注释
*/
public static void main(String[] args){
// 行注释
System.out.println("Hello,World!");
}
}
数据类型
Java是一种强类型语言,必须为每一个变量声明一种类型。
Java一共有8种基本类型,4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型。
整型
整型允许是负数,一般int最常用。长整型long数值有一个后缀L,十六进制数值有一个前缀0X,八进制数值有一个前缀0,二进制前缀0B。可以为数字字面量加下划线,Java编译器会去除这些下划线(1_000_000,0B1111_0100)。
| 类型 | 存储需求 | 取值范围 |
|---|---|---|
| long | 8字节 | 正负2的64次方/2 |
| int | 4字节 | 正负2的32次方/2 |
| short | 2字节 | 正负2的16次方/2 |
| byte | 1字节 | 正负2的8次方/2 |
浮点类型
浮点类型表示小数,常用double,float类型的数值需要添加后缀F。
| 类型 | 存储需求 | 取值范围 |
|---|---|---|
| float | 4字节 | 大约±3.402 823 47E+38F有效位数6-7位 |
| double | 8字节 | 大约±1.797 693 134 862 315 70E+308有效位数15位 |
正整数除以0的结果是正无穷大Double.POSITIVE_INFINITY;
负整数除以0的结果是负无穷大Double.NEGATIVE_INFINITY;
计算0/0或者负数的平方根结果是Double.NaN,判断使用Double.isNaN(x)。
char类型
char类型(2字节)描述了UTF-16编码中的一个代码单元,除非必须使用UTF-16代码单元,不然使用字符串替代。
有些Unicode使用一个char值描述,有些Unicode使用两个char值描述。
字面量值使用单引号括起来,'A'是编码值为65的字符常量,char类型的值可以表示成十六进制从\u0000到\Uffff。
- \u03C0表示希腊字母π;
- '表示单引号
- \u005B\u005D表示的是[和]。
码点是指与一个编码表中的某个字符对应的代码值,在Unicode标准中,码点采用十六进制书写,前缀U+,例如U+0041就是拉丁字母A的码点。
Unicode的码点可以分为17个代码级别,第一个代码级别称为基本的多语言级别,码点从U+0000到U+FFFF,其中包含经典的Unicode代码,其余的16个级别码点从U+10000到U+10FFFF,包括一些辅助字符。
UTF-16编码采用不同长度的编码表示所有Unicode码点,在基本的多语言基本中,每个字符用16位表示,通常被称为代码单元。而辅助字符采用一对连续的代码单元进行编码。
UTF8可变长编码,1-4字节,UTF-16是固定的2字节或4字节。
应用场景
因为历史遗留问题,MySQL 中的 utf8 编码并不是真正的 UTF-8,而是阉割版的,最长只有3个字节。当遇到占4个字节的 UTF-8 编码,例如 emoji 字符或者复杂的汉字,会导致存储异常。从 5.5.3 开始,MySQL 开始用 utf8mb4 编码来实现完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4个字节。
排序规则选择常用的有utf8_general_ci , utf8_unicode_ci
utf8_unicode_ci 是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序 , 准确性比较好 , 但是性能相对比较低。utf8_general_ci 没有实现Unicode排序规则,在遇到某些特殊语言或字符是,排序结果可能不是所期望的。所以utf8_general_ci 的准确性较低 ,但是性能比较好。通常情况下 utf8_general_ci的准确性就够我们用的了。
布尔类型
boolean(布尔)类型有两个值:true和false,用来判断逻辑关系;
整型和布尔值之间不能进行相关转换。

强制类型转换通过截断小数部分将浮点值转换为整型。
double x = 9.97;
int nx = (int) x;//9
// 四舍五入
long lx = Math.round(x);//10
nx = (long) lx;//10
变量
声明变量后,必须进行赋值初始化。
变量的声明尽可能地靠近第一次使用的地方。
final修饰的变量为常量,只能被赋值一次,习惯上使用全大写,类常量常与static一起使用。
参与/运算的两个操作数都是整数时,表示整数除法(向下取整),否则是浮点除法,整数/0抛异常。
整数求余(取模)用%表示。
++n前缀先完成加1,n++会先使用变量原来的值
& | 逻辑运算,&& || 短路逻辑运算
位运算
& and
| or
^ 异或,不同是1,相同是0
~ 取反
>> << 位模式右移、左移
>>>用0填充高位
字符串
字符串是Unicode字符序列。
String greeting = "Hello";
// Hel
String sub = greeting.substring(0,3);
//www.baidu.com
String baidu = String.join(".","www","baidu","com");
// 返回采用UTF-16编码表示的代码单元数量,因为辅助字符需要一对代码单元表示
int length = greeting.length();
//得到字符的实际长度,即码点数量
int cpCount = greeting.codePointCount(0,greeting.length());
// 生成int流,每个int值对应一个码点
int[] codePoints = str.codePoints().toArray();
// 返回的是代码单元的index
int index = str.indexOf("o");
char char = str.charAt(4);
// 返回的是码点
char codePoint = str.codePointAt(4);
字符串常量是虚拟机共享的,对于+或substring等操作产生的结果并不共享。
不可变字符串的优势:编译器可以让字符串共享。
JDK8中字符串是char数组,但在JDK11中字符串是byte数组。
构建字符串
避免每次连接字符串都构建一个新的String对象,耗时也浪费空间。
StringBuilder线程不安全;StringBuffer线程安全。
输入输出
打印到控制台窗口(标准输出流):System.out.println
读取控制台输入(标准输入流):构造Scanner对象,并与标准输入流System.in关联。
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
System.out.println(scanner.nextLine());
}
// 密码安全,一次只能读一行
Console console = System.console();
String username = console.readLine("Username:");
char[] passwd = console.readPassword("Password:");
格式化输出
用于System.out.printf和String.format,每一个以%字符开始得格式说明符都用响应得参数替换。
// 8个字符宽度,保留两位小数
System.out.printf("%8.2f",1000.0/3);
//00001,000
System.out.printf("%,08d",1000);
//f表示浮点数,s表示字符串,d表示十进制整数,b是布尔值
文件输入与输出
文件名包含反斜杠\,就在每个反斜杠前增加一个反斜杠。
读取文件,不指定编码得话,就会使用当前机器得默认编码
Scanner in = new Scanner(Paths.get("c:\\lenovo\\myfile.txt"),"UTF-8");
写入文件,文件不存在会创建文件
PrintWriter out = new PrintWriter("c:\\lenovo\\myfile.txt","UTF-8");
控制语句
boolean flag = false;
do{
System.out.println("do...");
}while (flag);
for是确定循环,不确定循环while,至少一次dowhile。
swith-case标签可以说基本类型常量、枚举常量、字符串。
带标签的break(continue)语句,用于跳出多重嵌套的循环语句,标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号。
early_end:
while(...){
for(int i = 0, i < 100, i++){
...
if(...){
break early_end;
...
}
...
}
}
增强for循环(for each):循环每一个元素。
for (variable : collection) statement
定义一个变量暂存集合中的每一个元素,并执行相应语句;collection集合必须是一个数组或者实现了Iterable接口的类对象。
大数值
当基本的整数和浮点数不能满足需求,可以使用java.math包中的BigInteger和BigDecimal类,这两个类可以处理包含任意长度数字序列的数值。
//使用静态方法转换
BigInteger a = BigInteger.valueOf(100);
BigInteger b = BigInteger.valueOf(200);
// 不能使用+-*/来处理大数值,应调用其方法处理
BigInteger c = a.add(b);
数组
数组是一种长度固定的数据结构,用来存储同一类型值得集合,通过一个整型下标可以访问、修改数组中的每个值。
// 指定长度
int[] ints = new int[5];
ints[0] = 1;
// 初始化
int[] ints = new int[]{1,2,3};
int a = ints[10];
//数组打印
System.out.println(Arrays.toString(ints));
//数组拷贝
Arrays.copyOf(ints, 2*ints.length);
//数组排序:使用的是优化的快速排序算法
Arrays.sort(ints);
// 多维数组
public static void main(String[] args) {
final int MAX = 10;
int[][] odds = new int[MAX][];
for (int i = 0; i < MAX; i++) {
odds[i] = new int[i + 1];
}
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < odds[i].length; j++) {
int lott = 1;
for (int k = 1; k <= j; k++) {
lott = lott * (i - k + 1) / k;
}
odds[i][j] = lott;
}
}
for (int[] odd : odds) {
for (int i : odd) {
System.out.printf("%4d", i);
}
System.out.println();
}
}
命令行参数
javac Hello.java
// 对应main方法String[]参数 args[0]的是-Xms64M
java Hello -Xms64M -Xmx256M

浙公网安备 33010602011771号