HelloWorld
一个简单的示例
public class FirstSample
{
public static void main(String[] args)
{
System.out.println("Hello world");
}
}
基本语言规范
命名规则
区分大小写
组成:字母、数字、_ 、$、某种语言中表示字母的任何Unicode字符
必须以字母开头,类名以大写字母开头
不能使用单独的 _
$ 仅用在有编译器生成的名字中
源代码文件名与公共类名相同
骆驼命名法
main方法
虚拟机从main方法的代码开始执行
类的源文件必须包含一个main方法
main方法必须声明为public static
main方法正常退出,则程序的退出码为0(使用System.exit方法返回其他的退出码)
main方法接受一个String数组类型的命令行参数,在控制台输入 java FirstSample 命令行以接收
注释
//这是一个注释,直到本行结尾
/*
这是一个注释
*/
/**
这是一个注释,同时自动生成文档
*/
添加任意多的注释,不必担心可执行代码膨胀
其他
使用 {}划分代码块
所有语句以 ;结束
Java的全部内容必须放置在类中
所有函数都是某个类的方法
数据类型
java是一种强类型语言,每个变量声明一种类型
数据类型的范围与运行Java代码的机器无关
Java没有任何无符号数据类型
基本数据类型
整型
类型 | 字节大小 | 取值范围 | 数值表示 |
---|---|---|---|
byte | 1 | -128~127 | |
short | 2 | -32768~32767 | |
int | 4 | -2147483648~2147483647 | |
long | 8 | -9223372036854775808~9223372036854775807 | 数值L |
进制 | 数值表示 |
---|---|
二进制 | 0B数值 |
十进制 | |
八进制 | 0数值 |
十六进制 | 0X数值 |
浮点型
类型 | 字节大小 | 取值范围 | 数值表示 |
---|---|---|---|
float | 4 | ±3.40282347E+38F | 数值F |
double | 8 | ±1.79769313486231570E+308 | 数值D |
进制 | 数值表示 |
---|---|
二进制 | 0B基数p指数 |
十进制 | 基数p指数 |
八进制 | 0基数p指数 |
十六进制 | 0X基数e指数 |
浮点数值计算遵循 IEEE 754 规范
常量Double.POSITIVE_INFINITY(正无穷大)、Double.NEGATIVE_INFINITY(负无穷大)、Double.POSITIVE_NaN(不是一个数)
任何数不等于NaN,提供Double.isNaN(x)判断一个数x是否为NaN
使用浮点型计算会有舍入误差,使用BigDecimal类避免
char类型
表示方法’字面量值’或十六进制值\u0000 – \uFFFF
转义序列 | 名称 | Unicode值 |
---|---|---|
\u (可出现在引号外) | ||
\b | 退格 | \u0008 |
\t | 制表 | \u0009 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\" | 双引号 | \u0022 |
\’ | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
字符编码 | |
---|---|
Unicode | 码点长度固定,分为17个代码平面,1个基本多语言平面码点为U+0000U+FFFF,其余16个平面码点为U+10000U+10FFFF并包括辅助字符 |
UTF-16 | 采用不同长度的编码,基本多语言平面中由16位表示的字符作为代码单元,一个码点编码为多个代码单元 |
char类型描述了UTF-16编码中的一个代码单元
变量与常量
变量声明
类名 变量名1,变量名2,...;
变量初始化
必须用赋值语句对变量进行显式初始化
不能使用未初始化的变量
可将变量的声明和初始化放在同一行,同时可用var代替可由初始化语句推断出的类型
变量名=值;
类名 变量名=值;
var 变量名=值;
常量
使用关键字final定义一个常量
使用static final定义一个类常量,定义在main方法的外部,可在一个类的多个方法中使用
使用public static final定义的常量可在其他类的方法中使用
枚举类型
使用enum关键字自定义枚举类型 ,将变量的取值限定在一个有限的集合内,否则为null
enum 枚举类名 {枚举值1,枚举值2,枚举值3};\\自定义枚举类型
枚举类名 变量名=枚举类名.枚举值1;\\定义一个值为枚举值的枚举变量
运算符
算数运算符
+ :加
- :减
* :乘
/ :除 ,当两个操作数为整数是表示整数除法,否则表示浮点除法
%:取余,符号与第一个操作数保持一致
没有幂运算符
对于浮点数的算术运算,实现可移植性相当困难
允许不同的浮点寄存器对中间过程采用不同的计算精度拓展指数,但不允许拓展尾数,不会产生溢出
使用strictfp关键字标记的方法或类必须使用严格的浮点计算,会产生溢出
数学函数与常量
Math类
-
幂运算:pow方法
-
模运算:floormod方法,符号与第二个操作数保持一致
-
三角函数:sin方法、cos方法、tan方法、atan方法、atan2方法
-
指数运算:exp方法、log方法、log10方法
-
舍入运算:round方法
-
安全的运算:mutiplyExact方法、addExact方法、subtractExact方法、incrementExact方法、decrementExact方法、negateExact方法,可以正确地处理int或long参数,否则生成一个异常
-
数学常量:Math.PI、Math.E
对于严格的浮点计算,使用StrictMath类
数值之间的转换
当用一个二元运算符连接两个基本数据类型的值时,先要将两个操作数转换为同一类型
一个为double,另一个转为double
否则,一个为float,另一个转为float
否则,一个为long,另一个转为long
否则,两个都转为int
强制类型转换
可能会损失信息,产生截断
(目标类型)变量名;
结合赋值运算符
变量 += 值 ;
变量 -= 值 ;
变量 *= 值 ;
变量 /= 值 ;
变量 %= 值 ;
自增与自减运算符
前缀形式:++变量 、- - 变量 ,先自增或自减,再进行其他运算
后缀形式:变量++ 、变量 - - ,先进行其他运算,再自增或自减
关系和boolean运算符
关系运算符:== != > < >=<=
布尔运算符:&& ||
三元运算符:条件 ? 表达式 : 表达式
位运算符
与:&,或:| ,异或:^ ,非:~
算术左移:>> (使用符号为填充高位)、逻辑左移>>> (使用0填充高位)、右移:<<
移位运算的有操作符要先完成模32运算,除非左操作数为long要完成模64运算
括号与运算符级别
运算符 | 结合性 |
---|---|
[] . () | |
! ~ ++ – - () new | 右到左 |
* / % | |
+ - | |
<< >> >>> | |
< <= > >= instanceof | |
== != | |
& | |
^ | |
| | |
&& | |
|| | |
?: | 右到左 |
= += *= /= %= |= ^= <<= >>= >>>= | 右到左 |
字符串
子串
substring方法
拼接
+ 自动调用toString方法,将两个Java对象转换为字符串,然后拼接在一起
静态join方法
repeat方法(Java11)
字符串特性
String不是内置的基本类型,而是在标准Java库中定义的一个类
字符串是不可变的,可以通过操作子串,再重新赋值,以达到修改的效果
字符串字面量是共享的,存放在公共的存储池中,引用相同字符串的String变量指向存储池的同一地址
通过+或substring等操作得到的字符串并不共享
检测字符串是否相等
equals方法
equalsIgnoreCase方法
==只能检测指向同一共享存储池地址的字符串
空串与Null串
空串:"" ,即长度为0的字符串
null串:表示目前没有任何对象与该String变量关联
注意先检查不为null,以免在一个null值上调用方法
码点与代码单元
length方法:返回代码单元数量
charAt方法:返回指定索引处的代码单元的值
codePointCount方法:返回码点数量
offsetByCodePoints方法:返回指定索引处码点所在的代码单元的索引
codePointAt方法:返回指定代码单元索引处的码点的值
codePoints方法:返回一个int值的流,每个int值对应一个码点。
再通过对codePoints方法的返回值调用toArray方法转换成一个数组。反之可以将这个数组交给String的构造器构造一个字符串
构建字符串
对于使用较短的字符串构建字符串的情况,如果使用String类拼接每次都会构建一个String对象
Stringbuilder类可以避免对短字符串拼接时的资源浪费,它通过append方法添加字符串。再通过toString方法得到String对象
输入与输出
读取输入
System.in是一个标准输入流
通过Scanner构造器将一个Scanner对象与System.in关联,就可以使用Scanner类的方法读取标准输入流中的输入
Scanner类定义在Java.util包中
nextLine方法:读取一行字符串
next方法:读取一个单词
nextInt方法:读取一个整数
Java6中引入的Console类有专门用于从控制台读取密码的readPassword方法,它将输入放于一个数组中,处理完成后可以方面将这个数组覆盖掉
格式化输出
使用标准输出流的print方法进行输出
沿用了C语言的printf方法,可以进行格式化输出
也可使用String类的format方法创建一个格式化字符串,再进行输出
文件输入与输出
文件的读取同样需要一个Scanner对象,需要在构造函数中提供文件的路径(路径可由Path类的of方法将包含路径的字符串转换为Path对象)和编码方式(如StandardCharsets.UTF_8),如果只提供字符串将会把它解释为数据而不是文件名
想要写入或创建文件需要一个PrintWriter对象,提供包含文件路径的字符串和编码方式
控制流程
块作用域
{}表示块的范围,块确定了变量的作用域
块可嵌套在另一块中,但不能在嵌套的两个块中声明同名的变量
条件语句
if(条件1){表达式1;}
else if(条件2){表达式2;}
else {表达式3;}
循环
while(条件){表达式;}
do{表达式;}while(条件)
确定循环
for(定义迭代变量;条件;更新迭代变量){表达式;}
switch语句
switch(变量)
{
case 值1:表达式;
case 值2:表达式;
default:表达式;
}
将从与选项值匹配的case标签开始执行,直到switch语句结束。可以在匹配的case标签后使用break语句跳出switch语句
case标签可以是char、byte、short、int、枚举常量、字符串字面量(Java7)
中断控制流程的语句
break;//用于跳出循环
标签: //标签必须在希望跳出的循环之前
while()
{
...
break 标签;//用于跳出多层嵌套的循环语句,跳到与标签匹配的循环的尾部
...
}
continue;//跳过循环体的剩余部分
标签: //标签必须在希望跳出的循环之前
while()
{
...
continue 标签;//用于跳出多层嵌套的循环语句,跳到与标签匹配的循环的首部
...
}
大数
BigInteger类、BigDecimal类:用于处理包含任意长度采用任意精度的数字序列的数值
包含于java.math包中
使用valueOf方法将普通的数值转换为大数
对于更大的数可以将字符串传递给大数的构造器
包含了常量:BigInteger.ZERO、BigInteger.ONE、BigInteger.TEN
使用add方法、subtract方法、mutiply方法、divide方法、compareTo方法处理大数
数组
声明数组
元素类型[] 变量名;
元素类型[] 变量名=new 元素类型[元素个数];
元素类型[] 变量名={值1,值2,值3};
new 元素类型[]{值1,值2,值3};
可以声明长度为0的数组
访问数组元素
通过索引访问,索引从0~元素个数-1
不能通过对数组变量+1访问下一个元素,因为Java没有指针运算
数字数组元素默认初始化为0,boolean数组元素默认初始化为false,对象数组元素默认初始化为null
array.length是数组元素个数
for each循环
for(声明变量:数组或集合)表达式;\\变量用于暂是引用集合中的每一个元素,对每个元素应用表达式
使用迭代器遍历整个集合,因此必须实现Iterable接口
数组拷贝
Arrays类的copyOf方法,可以将一个数组的所有值拷贝到一个新的指定大小的数组中,能达到增加数组大小的功能
数组排序
Arrays类的sort方法,使用快速排序法排序
多维数组
元素类型[][] 变量名;
元素类型[][] 变量名=new 元素类型[一维元素个数][二维元素个数];
元素类型[] 变量名={{值1,值2,值3},{值1,值2,值3},{值1,值2,值3}};
for each循环不能自动处理二维数组的每一个元素
Arrays类的deepToString方法返回一个字符串,传递给print方法,打印出每一个元素
不规则数组
Java实际上没有多维数组,多维数组被解释为一维数组的元素是一个数组,而存放在不同元素中的数组大小可以不同
只需为一个一维数组的每个元素单独使用构造器
元素类型[][] 变量名=new 元素类型[元素个数][];
for (int i=0;i<MAX;i++)
{变量名[i]=new 元素类型[元素个数];}