avatar

目录
JAVA核心技术卷I(基本程序设计结构)

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
  • 其中byteshort主要用于特定场合(如,底层文件处理,或者存储空间宝贵时的大数组)

  • 长整型数值有一个后缀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";
str.substring(0, 3); // 左闭右开区间

4.2 拼接

除了常规的 + 操作,还可以使用:

java
// 方式一
String.join(" / ", "1", "2", "3"); // 第一个参数是分隔符
// 方式二
String.join(" / ", new String[]{"1", "2", "3"})
// 方式三
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(String.join(" / ", list));
-----------------------------------------------------
输出:
1 / 2 / 3

如果需要频繁拼接小字段字符串的话,使用 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";
String s2 = "hello";
String s3 = new String("hello"); // 这里 new 在堆中创建
System.out.println(s1 == "hello"); // 地址一样
System.out.println(s1 == s2); // 相同的字符串值引用同一个常量池中的字符串
System.out.println(s1 == s3); // 这里的 == 是比较地址
System.out.println(s1.equals(s3)); // equals 是值比较
-------------------------------------
运行结果:
true
true
false
true

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 {
String filePath = "d:\\tmp\\myfile.txt";
// 输出内容到文件
PrintWriter pw = new PrintWriter(filePath, "UTF-8");
pw.println("hello world");
pw.print(1);
pw.print(2.3);
pw.print('c');
pw.close();
// 从文件中读取内容
Scanner scanner = new Scanner(new File(filePath), "UTF-8");
while (scanner.hasNext()) {
String word = scanner.next();
System.out.println(word);
}
}
-----------------------------------------------------------
输出结果:
hello
world
12.3c

六、流程控制

6.1 循环

有时候循环嵌套太深,可以用一个标签直接退出最外层循环

java
public void testBreak() {
int i = 0;
label_1: // 便签定义在要退出的最外层循环之上
while (true) {
while (true) {
if (i++ > 10) {
break label_1; // 退出循环到最外层
}
}
}
System.out.println("hello");
}

七、大数

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):比较两数组是否相等(大小+元素)
文章作者: IT小王
文章链接: https://wangbowen.cn/2020/05/11/JAVA%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E5%8D%B7I%EF%BC%88%E5%9F%BA%E6%9C%AC%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%BB%93%E6%9E%84%EF%BC%89/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT小王

评论