3基础知识
Java是一个完整的平台,拥有庞大的库。
简单、面向对象、网络技能、健壮、安全、可移植、易解释、高性能、多线程、动态。
3.3数据类型
.1整型
- int 4字节 +-20亿
- short 2字节 -32768~32767
- long 8字节 好大好大 (后缀L)
- byte 1字节 -128~127
- 二进制前缀(0b) 十六进制前缀(0x)
.2浮点类型
- float 4字节 6~7位有效数字
- double 8字节 15位有效数字
- 正负无穷大、NaN 检测x是否为“非数值”————>Double.isNaN(X)
.3char类型
- 单个字符,通常用来表示字符常量
- Unicode编码表
- 强烈建议不要使用
.4boolean类型
- false/true
- 和整型不能相互转换
3.4变量
- 字母开头,数字字母构成
- 判断是否为字母:isJavaIdentifierStart/isJavaIdentifierPart
- 大小写敏感
.1变量初始化
- 变量的声明尽量靠近变量第一次使用的地方
- java中不区分变量的声明和定义
.2常量
- final关键字,只能被赋值一次,之后无法更改
- static final,类常量,类中的方法可以使用;声明为public,则其他类中也可以使用
3.5运算符
- 整数除0出异常,浮点数除0出无穷大/NaN
- 浮点计算的精度问题
.1自增/自减运算符
- ++/--咯
.2关系/boolean
- == < > <= >= && || !
- x==y?x:y
.3位运算符
- | ^ ~ &
.4数学函数和常量
- 三角函数、指数函数/对数函数、PI、E
.5数值类型之间的转换
- 合法转换/丢失精度(int到float;long到float/double)
- 两个数值进行二元操作时,有double/float/long,则另一个也会转换为对应类型。否则两个操作数将都被转换为int
.6强制类型转换
- 截断小数部分来取整
- 想要进行舍入运算(得到最接近的整数),需使用Math.round方法
double x=9.97;
int nx = (int)Math.round(x);//round返回long
.7括号和运算符级别
.8枚举类型
- 变量的取值只在一个有限的集合内
enmu Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE}
Size s = Size.MEDIUM
3.6字符串
- unicode字符序列
- Java没有内置字符串类型,而是在标准Java类库中提供一个预定义类,叫做String
- 每个用双括号括起来的字符串都是String类的一个实例
.1子串
String greeting = "Hello";
String s = greeting.substring(0, 3);//"Hel"
- 第二个参数是不想复制的第一个位置,容易计算子串的长度。
.2拼接
- +号拼接字符串
int age = 13;
String rating = "PG" + age;//"PG13"
.3不可变字符串
- 不能修改其中的任何一个字符
.4检测是否相等
- .equals()
- .equalsIgnoreCase()//不区分大小写
.5空串与null
- 空串“”,长度为0
- if(str != null && str.length() != 0)
.6代码点与代码单元
.length(),返回unicode字符数量
想要得到实际长度,即代码点的数量(从0开始):
int cpCount = greeting.codePointCount(0, greeting.length())得到第i个代码点:
int index = greeting.offsetBytePoints(0, i);
int cp = greeting.codePointAt(idnex);要遍历一个字符串:
int cp = sentence.codePoint(i);
if (Character.isSupplementaryCodePoint(cp)) i += 2;
else i++;
.7字符串API
- 好多好多个,熟记才能活用
.8构造字符串
- 传统方法效率低,浪费空间
- 字符串构造器:
StringBuilder builder = new StringBuilder();
builder.append(ch);//添加单个字符
builder.append(str);//添加字符串
String completedString = builder.toString();
3.7输入输出
.1读取输入
- 标准输出流;标准输入流:
Scanner in = new Scanner(System.in);
System.out.print("What is your name?");
String name = in.nextLine();//in.next(); in.nextInt(); - Scanner是可见的,不适合读取密码,密码用ole类实现:
Console cons = System.console();
String userName = cons.readLine("User name:");
char[] passwd = cons.readPassword("Password:");
.2格式化输出
- System.out.printf();沿用了C语言的语法,定长、定精度(转换符表P57,标志符表P58)
- 日期和时间转换符表P58:
System.out.printf(" %1$s %2$tB %2$te, %2$tY", "Due date:", new Date());
Due date: December 25,2016 - 图3-6 格式说明符语法(O——O 不是很懂啊。 )
.3文件输入与输出
- 需要用File对象构造一个Scanner对象:
Scanner in = new Scanner(Paths.get("mufile.txt"));
PrintWriter out = new PrintWriter("myfile.txt"); - 不同编译环境(命令行或IDE)下的启动路径不同,需要定位。若觉繁琐,可以使用绝对路径
- IOException,FileNotFoundException
可以利用重定向将任意文件捆绑到System.in和System.out:
java MyProg<myfile.txt> output.txt
避免FileNotFoundException
3.8控制流程
- 循环控制和多值检测
.1块作用域
- block,可嵌套,不可在两个块中声明同名的变量
.2条件语句
if (condition) statement
- 块语句(block statement)
if (condition) statement1 else statement2
if (condition1) statement1 else if (condition2) statement2 else statement3
.3循环
while (condition) statement
do statement while (condition)
.4确定循环
for (计数器变量初始化, 检测, 更新)
- 检测两个浮点数是否相等要格外小心。由于舍入误差,最终无法得到精确值,可能会一直处于循环
.5多重选择语:switch语句
.6中断控制流程语句
- goto为保留字,但是并不可以使用
- break跳出当前循环体,带标签的break语句用于跳出多重循环
- continue语句将控制转移到最内层循环的首部
- 可选语句,即使不使用也能表达出相应的逻辑含义
3.9大数值
- 已有变量类型不满足精度要求,可使用java.math中包含的两个类:BigInteger和BigDecimal
- BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算
- 使用valueOf方法可以将普通的数值转换为大数值:
BigInteger a = BigInteger.valueOf(100)
- 无法用算术运算符处理大数。使用add和multiply方法:
BigInteger c = a.add(b);//c = a+b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2)));//d = c*(b+2)
- API要熟记
3.10数组
- 用来存储同一类型值的集合的数据结构,通过整型下标访问其中的值
type[] name;
- 数字数组初始化为0,boolean数组初始化为false,对象数组初始化为null
- 获得元素个数,使用array.length
- 一旦被创建,不能改变它的大小
.1for each循环
for (variable : collection) statement
- 会遍历数组中的每个元素,而不需要使用下标值
- 快速打印一维数组:
Sysytem.out.println(Array.toString(a))
.2数组初始化以及匿名数组
int[] smallPrimes = {2,3,5,7,11,13};
new int[] {17,19,23,29,31,37};//匿名数组
smallPrimes = new int[] {17, 19, 23, 31};
int[] anonymous = {17, 19, 23};
smallPrimes = anonymous;
数组长度可以为0,长度为0和null不同
.3数组拷贝
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length)
- 多余的数值型将被赋值为0,布尔型将被赋值为false
- 小于原始数组长度,只拷贝最前面的数据元素
.4命令行参数
public static void main(String[] args)
- 如果使用:
java Message -g cruel world
运行程序。那么arg数组中将包含以下内容:
args[0]: "-g"
args[1]: "cruel"
args[2]: "world"
.5数组排序
int a = new int[1000];
...
Arrays.sort(a);//快排
.6多维数组
- for each不能自动处理二维数组的每一个元素,它按照行,也就是一维数组处理。想访问二维数组的所有元素,需要两个嵌套的循环:
for (double[] row : a)
for (double value : row)
do something with value - 快速打印一个二维数组:
System.out.println(Array.deepToString(a))
.7不规则数组
- 只存在数组的数组