java的11个特性:简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释性、高性能、多线程、多态性。
在使用命令行工具来来运行java程序时,先要用终端进入文件目录.然后使用java xxx.java;javac xxx即可。
关键字public private等称为访问修饰符(access modifier)
类名是以大写字母开头名词。如果名字由多个名词组成,每个单词的第一个字母都应该大写。这种命名法为骆驼命名法(camel case)。
java中共有8种基本类型(primitive type),其中共有4种整型、2种浮点类型、一种字符类型char、和boolean类型。
整形有4种类型
类型 | 存储需求 |
---|---|
int | 4字节 |
short | 2字节 |
long | 8字节 |
byte | 1字节 |
java程序必须保证在所有机器上都能够得到相同的运行结果,所以各种数据类型的取值范围必须固定。
长整型数值有一个L或l(如40000000000L)。十六进制有一个前缀0x或0X。八进制前缀为0,例如010代表8。加前缀0b或0B可以写二进制数。用下划线1_000_000只是为了让人容易读,编译器会去除。
System.out.println(010);
以上述程序为例,输出为8。
java没有任何无符号(unsigned)形式的int,long,short,byte类型。
Byte.unsignedInt(b)可以得到一个0-255的int值。Integer和Long类都提供了处理无符号除法和余数的方法。
浮点类型有两种
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | 有效位数6-7位 |
double | 8字节 | 有效位数15位 |
float类型的数值有一个后缀F或f。没有后缀的浮点数总是默认为double类型。也可以在浮点数值后加后缀D或d。
16进制表示浮点数值时,0.125=2^-3可以表示位0x1.0p-3。在十六进制表示法中,使用p表示指数。尾数采用16进制,指数采用十进制。指数的基数为2。
所有的浮点数值都遵循IEEE754规范。常量Double.POSITIVE_INFINITY,DOUBLE.NEGATIVE_INFINITY,DOUBLE.NAN分别表示正无穷大、负无穷大、不是一个数字。判断一个特定值是否是Double.NAN时,不能用==。而是判断if Double.isNaN(x)。
浮点运算不适用于无法接受舍入误差的计算。这种计算应使用BigDicamal类。
\u表示转义序列。
转义序列 | 名称 | unicode值 |
---|---|---|
\b | 退格 | \u0008 |
\t | 制表 | \u0009 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
" | 双引号 | \u0022 |
' | 单引号 | \u0027 |
\ | 反斜杠 | \u005c |
unicode和char类型见书P33
使用关键字final指示常量,习惯上常量全大写。
static final设置类常量
用public修饰类变量时,其他类的方法也可以使用这个常量。如Math.PI。
枚举类型enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE},Size s=Size.MEDIUM
使用strictfp关键字标记的方法必须使用严格的浮点计算来生成可生成的结果。
取余运算在计算商值向0方向舍弃小数位
取模运算在计算商值向负无穷方向舍弃小数位
比如a=4,b=-3时,a/b = -1.3333...
此时,取余c = -1,取模c = -2(%在不同语言中有不同的意义,比如Java或者c/c++中%为取余,python中%则为取模)
java中的floorMod()为取模运算。
强制类型转换通过截断小数部分将浮点值转换为整型。对浮点数采用舍入运算需要使用Math.round()方法.round返回值为long类型
位运算符有&(and) |(or) ^(xor ) ~ (not). >> <<可以将位模式左移或右移。
String类的subString可以从较大的字符串中提取一个子串。
java允许使用+号连接两个字符串,当一个字符串和一个非字符串进行拼接时,后者会转换为字符串。
如果需要把多个字符串放在一起,可以使用静态join方法:
String all=String.join("/","s","m","l","xl");//all is the string "s/m/l/xl"
repeat方法
String repeated="Java".repeat(3);//repeated is "JavaJavaJava"
Java字符串中的单一字符不能修改,所以在Java文档中将String类对象称其为时不可变的(immutable)。
使用equals方法来比较两个字符串是否相等,采用==来判断是不正确的。想检测两个字符串是否相等而不区分大小写可以使用equalsIgnoreCase方法。
空串和null串的区别在于:空串是一个已经实例化的对象,具有内存空间。null串是没有实例化的对象,不占内存空间。空串可以调用属性、方法,null串会报错(NullPointerException)。
length方法返回的是采用UTF-16编码表示给定字符字符串所需要的代码单元数量。
得到码点数量可以调用codePointCount方法。
int count=s.codePointCount(0,s.length());
charAt方法返回位置n的代码单元。因为UTF-16编码部分字符需要两个代码单元,所以使用charAt时会出错。
使用codePointAt返回第i个码点。
要遍历一个字符串并且以此查看每一个码点
int cp=sentence.codePointAt(i); if(Character.isSupplementaryCodePoint(cp)) i+=2; else i++;
也可以将它转换为一个数组再完成遍历。
int [] codePoints=str.codePoints().toArray();
使用StringBuilder类来解决字符串多次拼接。
StringBuilder builder=new StringBuilder(); //append方法用于添加内容 builder.append(ch);//添加字符 builder.append(str);//添加字符串 String completeString=builder.toString();//最后得到完成的字符串
标准输入流System.in,标准输出流System.out。Scanner对象可关联标准输入流。
Scanner in=new Scanner(System.in);
nextLine方法用于读取一行输入。next用于读取一个单词。nextInt用于读取下一个整数。nextDouble用于读取下一个浮点数。
String s1=in.nextLine(); String s2=in.next(); int x=in.nextInt(); double y=in.nextDouble();
Scanner类定义在java.util包内、要通过import导入包。
要读取密码时
Console cons=System.console(); String username=cons.readLine("User name: "); char[] passwd=cons.readPassword("Password: ");
采用console对象来处理输入时,必须每次读取一行输入,没有能够读取单个单词或数值的方法。
printf方法和c一样,可以格式化输出。转换符见P58。
String.format方法可以创建一个格式化的字符串。转换符见P59,60。
读取一个文件时需要构造一个Scanner对象
Scanner in=new Scanner(Path.of("xxxx"),StandardCharsets.UTF_8);//XXXX为文件地址。字符编码并不是普遍适用,要具体看文本文件。
要写入一个文件需要构造一个PrintWriter对象。
PrintWriter out=new PrintWriter("xxxx",StandardCharsets)
如果文件不存在,创建该文件。
switch case标签可以是类型为char,byte,short,int的常量表达式,可以是枚举常量,可以是字符串字面量。
带标签的break语句可以跳出多重嵌套的循环语句,普通break语句只能跳出一种循环。
read_data: while(...) { ... for(...) { if(..) { break read data;//直接跳出read_data循环 } } }
标签可以应用到任何语句,包括if语句和块语句。
continue语句将控制转移到最内层循环的首部。简单来说就是跳过最内层循环的一次循环continue后的代码
使用BigInteger和BigDecimal这两个类可以处理包含任意长度数字序列的数组。
使用valueof方法可以将普通的数转换为大数
BigInteger a=BigInteger.valueof(100); BigInteger b=new BigInteger("312313516534654564531321564684");//对于更大的数,可以使用带字符串参数的构造器
BigInteger.ZERO,BigInteger.ONE等为一些常量。
使用add,multiply,divide表示+,*,/。
int [] a;只是声明一个变量,要初始化需要使用new操作符。
for each循环格式为for (variable:collection) statement。例如
for(int element:a){}
调用Arrays.toString(a)可以返回一个包含数组元素的字符串,这些元素包围在中括号内,并用逗号分隔。
使用Arrays类的CopyOf方法可以将一个数组的所有值拷贝到一个新的数组中去。
int []copiedLuckyNumbers=Arrays.copyOf(luckyNumbers,luckyNumbers.length) //第二个参数是新数组的长度 luckyNumbers=Arrays.copyOf(luckyNumbers,2*luckyNumbers.length) //该方法可用来增加数组的大小
main方法接受一个字符串数组args,也就是在命令行上的指定的参数。
Arrays.sort(a)可以对数值型数组进行排序。排序方法为优化的快速排序算法。
for each循环语句不能自动处理二维数组的每一个元素,需要使用两个嵌套的循环
for(double[] row:a) for(double value:row) do something with value
使用Arrays.deepToString(a)可以快速打印一个二维数组。
java实际上并没有多维数组只有一维数组,多维数组是数组的数组,也就是一维数组的元素为数组。