1-书写规范
首字必须是字母大写,后面可以数字和下划线
2-方法名首字母必须是小写
3-Java入口程序规定的方法必须是静态方法,方法名必须为main,括号内的参数必须是String数组。
4-以/*开头,以/结束的多行注释这种特殊的多行注释需要写在类和方法的定义处,可以用于自动创建文档。
5-Eclipse IDE提供了快捷键Ctrl+Shift+F(macOS是⌘+⇧+F)帮助我们快速格式化代码的功能
6-java字节存储
计算机内存的最小存储单元是字节(byte),一个字节就是一个8位二进制数,即8个bit。它的二进制表示范围从0000000011111111,换算成十进制是0255,换算成十六进制是00~ff。
内存单元从0开始编号,称为内存地址。每个内存单元可以看作一间房间,内存地址就是门牌号。一个字节是1byte,1024字节是1K,1024K是1M。
7-ASCII和UNICODE
ASCII的定义:是用来表示英文字符的一种编码规范。每个ASCII字符占用1 个字节,是用来表示英文字符的一种编码规范。每个ASCII字符占用1 个字节
UNICODE的定义:Unicode与ASCII一样也是一种字符编码方法,它占用两个字节容纳65536 个字符,这完全可以容纳全世界所有语言文字的编码。在Unicode 里,所有的字符都按一个字符来处理, 它们都有一个唯一的Unicode 码。
8-字符类型
char表示一个字符。Java的char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符.
9-常量书写规范
根据习惯,常量名通常全部大写。定义变量的时候,如果加上final修饰符,这个变量就变成了常量:
final double PI = 3.14; // PI是一个常量
double r = 5.0;
double area = PI * r * r;
PI = 300; // compile error!
常量在定义时进行初始化后就不可再次赋值,再次赋值会导致编译错误。
10-基本数据类型
基本数据类型是CPU可以直接进行运算的类型。Java定义了以下几种基本数据类型:
整数类型:byte,short,int,long
浮点数类型:float,double
字符类型:char
布尔类型:boolean
11-整数
运算的结果永远是精确的;
int x = 12345 / 67; // 184
int y = 12345 % 67; // 12345÷67的余数是17
特别注意:整数的除法对于除数为0时运行时将报错,但编译不会报错。
运算结果会自动提升;
可以强制转型,但超出范围的强制转型会得到错误的结果;
应该选择合适范围的整型(int或long),没有必要为了节省内存而使用byte和short进行整数运算。
整数具备位运算和移位运算的能力,位运算是按位进行与、或、非和异或的运算。
与运算:两个数同时为1,结果才为1
n = 0 & 1; 为0
n = 1 & 1; 为1
或运算:同理任意一个为1结果则为1
n = 0 | 1; 结果为1
12-浮点数
float和double都是浮点型
浮点数常常无法精确表示,并且浮点数的运算结果可能有误差;
浮点数0.1在计算机中就无法精确表示,因为十进制的0.1换算成二进制是一个无限循环小数,很显然,无论使用float还是double,都只能存储一个0.1的近似值.
由于浮点数存在运算误差,所以比较两个浮点数是否相等常常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数
// 比较x和y是否相等,先计算其差的绝对值:
double r = Math.abs(x - y);
// 再判断绝对值是否足够小:
if (r < 0.00001) {
// 可以认为相等
} else {
// 不相等
}
整型和浮点型运算时,整型会自动提升为浮点型;
可以将浮点型强制转为整型,但超出范围后将始终返回整型的最大值。
在java中进行小数点的运算的时候,采用BigDecimal,尽量不要用浮点型,如果是以后的浮点型变量,要先将浮点型转换成小数位的String类型,然后再转换成BigDecimal类型进行运算.
13-布尔类型
对于布尔类型boolean,永远只有true和false两个值.
或运算,一方为true结果为true
与运算:一方为false,结果就为false
布尔运算的一个重要特点是短路运算,看下面的例子,由于b的结果为true,在与运算中,
(5 / 0 > 0)就不进行运算了,结果直接是true,如果布尔运算没有短路运算,后面5/0会报错.短路运算能提高结果的运行速度.
boolean b = 5 < 3;
boolean result = b && (5 / 0 > 0);
14-字符和字符串
(1)字符类型char是基本数据类型,一个char保存一个Unicode字符,因为Java在内存中 总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节,用二进制可以表示2^16种字符,中文和英文字母足够了.
(2)查看"中"汉子是用什么哪个数字表示的:
int n2 = ‘中’; // 汉字“中”的Unicode编码是20013
转换成十进制就是20013,转换成二进制呢?自己算哈哈,所以说只是人为的规定了,中文汉子对应的二进制或者十进制-十六进制是多少
(3)常见的字符串转义字符
常见的转义字符包括:
" 表示字符"
’ 表示字符’
\ 表示字符
\n 表示换行符
\r 表示回车符
\t 表示Tab
\u#### 表示一个Unicode编码的字符
例如:
String s = “ABC\n\u4e2d\u6587”; // 包含6个字符: A, B, C, 换行符, 中, 文
14-数组
1-数组是同一数据类型的集合,数组一旦创建后,大小就不可变;
2-可以通过索引访问数组元素,但索引超出范围将报错;
3-数组元素可以是值类型(如int)或引用类型(如String),但数组本身是引用类型;
4-引用类型的实质是先创建一个指针地址,然后由指针再指向某一块地址区域
5-通过下面例子说明引用类型在内存中是如何赋值的
字符串是引用类型,因此我们先定义一个字符串数组: String[] names = {
“ABC”, “XYZ”, “zoo” };
这里注意到原来names[1]指向的字符串"XYZ"并没有改变,仅仅是将names[1]的引用从指向"XYZ"改成了指向"cat",其结果是字符串"XYZ"再也无法通过names[1]访问到了。
public class Main {
public static void main(String[] args) {
String[] names = {“ABC”, “XYZ”, “zoo”};
String s = names[1]; //s引用指向到了字符串是XYZ的内存地址
names[1] = “cat”;//names[1]从新指向了cat的内存地址
System.out.println(s); // 输出XYZ
System.out.println(s);//输出cat
}
}
14-输入输出
Java提供的输出包括:System.out.println() / print() / printf(),其中printf()可以格式化输出;
Java提供Scanner对象来方便输入,读取对应的类型可以使用:scanner.nextLine() / nextInt() / nextDouble() / …
如果要把数据显示成我们期望的格式,就需要使用格式化输出的功能。格式化输出使用System.out.printf(),通过使用占位符%?,printf()可以把后面的参数格式化成指定格式:
public class Main {
public static void main(String[] args) {
double d = 3.1415926;
System.out.printf("%.2f\n", d); // 显示两位小数3.14
System.out.printf("%.4f\n", d); // 显示4位小数3.1416
}
我们先看一个从控制台读取一个字符串和一个整数的例子:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
System.out.print("Input your name: "); // 打印提示
String name = scanner.nextLine(); // 读取一行输入并获取字符串
System.out.print("Input your age: "); // 打印提示
int age = scanner.nextInt(); // 读取一行输入并获取整数
System.out.printf("Hi, %s, you are %d\n", name, age); // 格式化输出
}
}
15-数组
1-for each形式输出数组
int[] ns = {1,5,9,3}
for( int n:ns){
sysout.system.printIn(n)//n就是每次遍历数组得到的值
}
//使用下面方法可以快速拿到整个数组,输出[1,5,9,3]
System.out.println(Arrays.toString(ns));
说明:for each形式比for循环形式简洁,for each除了能够遍历数组,还能遍历Map集合,有一个缺点是不能拿到数组的索引.
2-数组排序
常用的排序算法有冒泡排序、插入排序和快速排序等;
其中冒泡算法的原理是每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。
可以直接使用Java标准库提供的Arrays.sort()进行排序;
冒泡举例
public class Main {
public static void main(String[] args) {
int[] ns = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
// 排序前:
System.out.println(Arrays.toString(ns));
for (int i = 0; i < ns.length - 1; i++) {
for (int j = 0; j < ns.length - i - 1; j++) {
if (ns[j] > ns[j+1]) {
// 交换ns[j]和ns[j+1]:
int tmp = ns[j];
ns[j] = ns[j+1];
ns[j+1] = tmp;
}
}
}
// 排序后:
System.out.println(Arrays.toString(ns));
}
}
3-多维数组
//打印多为数组用Arrays.deepToString
int[][] array= {{1,2},{3,4},{5,6}};
System.out.println(Arrays.deepToString(array));//结果[[1,2],[3,4],[5,6]]