JAVA核心技术卷I(基本程序设计结构)
一、数据类型
1.1 整形
分类
类型 | 存储需求 | 取值范围 |
---|---|---|
int | 4字节 | -2 147 483 648 ~ 2 147 483 647(10位,刚刚超过20亿) |
short | 2字节 | -32 768 ~ 32 767 |
long | 8字节 | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807(19位) |
byte | 1字节 | -128 ~ 127 |
其中byte和short主要用于特定场合(如,底层文件处理,或者存储空间宝贵时的大数组)
长整型数值有一个后缀L或l
十六进制:0x开头
八进制:0开头(最好不要用,会混淆)
二进制:0b开头(JAVA7之后)
1.2 浮点类型
分类
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | 大约±3.402 823 47E+38F(有效位数6~7位) |
double | 8字节 | 大约±1.797 693 134 862 315 70E+308(有效位数15位) |
- float类型数值有一个后缀F或f,没有的默认为double
- NaN:不是一个数字。可以用如下方式判断
if (Double.isNaN(x))
- 浮点数不适合用于无法接受舍入误差的金融计算,可以用
BigDecimal
1.3 char 类型
char 在java中是2个字节。java采用unicode,2个字节(16位)来表示一个字符。
强烈建议不要再程序中使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理。P48
1.4 boolean 类型
占1字节。
整型值和布尔值不能互转。
二、变量与常量
- final 定义常量
三、运算符
3.1 四则运算
整数被0除会产生一个
异常
,浮点数被0除会得到无穷大
或NaN
求余操作
java-3 % 2 // 结果-1
Math.floorMod(-3 , 2) // 结果为1
3.2 位运算
>>>
高位补0,没有<<<
操作符- 位移运算右操作数要模32运算(long类型64),比如
1 >> 35
等同于1 >> 3
四、字符串
4.1 子串
java
String str = "Hello"; |
4.2 拼接
除了常规的 +
操作,还可以使用:
java
// 方式一 |
如果需要频繁拼接小字段字符串的话,使用 StringBuilder
(常用API):
- length()
- append(char c)
- append(String str)
- setCharAt(int i, char c)
- insert(int offset, String str)
- insert(int offset, char c)
- delete(int starIndex, int endIndex):左闭右开
- toString()
4.3 不可变字符串 及 比较
String没有提供修改字符串中某个字符的方法。
字符串的值将被放到一个共享池中,如果需要的字符串存在池中,就直接引用。当没有变量引用的时候,则自动回收:
java
String s1 = "hello"; |
4.4 常用API
- char charAt(int index):返回指定下标的字符
- int compareTo(String other):字典顺序,比较大小
- boolean equals(String other):比较值是否相等
- boolean equalsIgnoreCase(String other):不区分大小写比较
- boolean startWith(String prefix)
- boolean endWith(String suffix):是否以prefix开头,或以suffix结尾
- int indexOf(String str)
- int indexOf(String str, int fromIndex):匹配字符串,从fromIndex开始。没有找到返回-1
- int lastIndexOf(String str)
- int lastIndexOf(String str, int fromIndex):匹配最后一个,从fromIndex开始
- int length():字符串长度
- String replace(CharSquence oldString, CharSquence newString):用newString,替换字符串中所有的oldString。
- String substring(int beginIndex):获取子串,从下标开始
- String substring(int beginIndex, int endIndex):子串,左闭右开
- String toLowerCase()
- String toUpperCase():所有字符转为小写/大写
- String trim():删除字符串中头尾的空格
五、输入输出
5.1 控制台
输入
Scanner常用API:
- Scanner(InputStream in)
- nextLine()
- next():以空格分隔的单词
- nextInt()
- nextDouble()
- hasNext():是否存在下一个单词。(当输入流是文件?时候就有用了)
- hasNextInt()
- hasNextDouble()
格式化输出
沿用了C语言的printf风格:
java
System.out.printf("%s %8.2d", str, 3); |
注意:对于%s,如果该对象实现了 Formattable
接口的 fotmatTo
方法,那么调用该方法。否则调用 toString
方法
如果你不想输出,只想得到一个格式化字符串,可以使用静态方法:String.format
5.2 文件
java
public static void main(String[] args) throws Exception { |
六、流程控制
6.1 循环
有时候循环嵌套太深,可以用一个标签直接退出最外层循环
java
public void testBreak() { |
七、大数
BigInteger
- BigInteger add(BigInteger other):+
- BigInteger subtract(BigInteger other):-
- BigInteger multiply(BigInteger other):*
- BigInteger divide(BigInteger other):/
- BigInteger mod(BigInteger other):%
- sqrt():开方
java9
- int compareTo(BigInteger other):比较大小
- BigInteger.valueOf(long x):转为大数
BigDecimal
和上面的操作基本一样,不过:
divide(/):如果是无限循环小数,会抛出异常。这时候就需要用:
BigDecimal divide(BigDecimal other, RoundingMode mode):mode可以是 RoundingMode.HALF_UP
四舍五入
八、数组
静态类Arrays,常用API:
- copyOf(xxx[] a, int newLength):拷贝数组a,长度为newLength。如果end比原数组小,就截取;如果大,多的赋0初值,或者false。
- copyOfRange(xxx[] a, int start, int end):范围拷贝(左闭右开),少截取,多补0/false
- sort(xxx[] a):优化后的快排
- int binarySearch(xxx[] a, xxx v):二分查找
- int binarySearch(xxx[] a, int start, int end, xxx v):指定范围的二分查找
- fill(xxx[]a, xxx v):用v填充数组
- equals(xxx[] a, xxx[] b):比较两数组是否相等(大小+元素)