[笔记] Java基础(4)-基础类与字符串

170 阅读8分钟

1. Object类

  • Object类:java.lang.Object
  • Object类为所有类的父类
  • int HashCode():返回对象的哈希码值
  • Class<?> getClass():返回对象的运行时类(字节码文件),可以用getName()方法获取字节码文件的类名
  • String toString():返回对象的字符表示;打印对象时自动调用对象的toString()方法;若不重写,默认使用ObjecttoString()方法,返回格式:类名@hashcode
  • boolean equals(Object obj): 判断两对象是否相等,默认Objectequals()方法比较对象的地址值(底层使用==),可进行重写比较对象属性;String类的equals()方法比较字符串内容;==比较基本数据类型时,比较的是值;==比较引用数据类型时,比较的是地址值

2. System类

  • System类:java.lang.System
  • System类所有方法都为静态
  • System.err:标准错误输出流
  • System.in:标准输入流,为InputStream类型;可通过System.setIn()修改
  • System.out:标准输出流,为PrintStream类型;可通过System.setOut()修改
  • static void gc():运行垃圾回收器,只是提醒系统进行垃圾回收,不一定会立即调用
    • 回收时会调用对象的finalize()方法,该方法继承于Object
  • static void exit(int status):终止当前的java虚拟机
    • 0表示正常终止,非0表示非正常终止
  • static long currentTimeMillis():获取以毫秒为单位的当前时间
  • static void arraycopy(Object src, int srcPos, Object dest, int desPos, int length):从src中的srcPos位置开始复制length个元素到dest中的desPos位置

3. Scanner类

  • Scanner类:java.util.Scanner
  • int nextInt():读取下一个int
  • boolean hasNextInt():判断下一个值是否可以转为int数;类似有Double等或hasNext()`判断是否还有字符串
  • String nextLine():读取输入的字符串到回车换行为止;若上一次调用nextInt()方法,则nextLine()会取到空字符串,因为nextLine()会遇到数字后的\r\n,此时终止

4. 异常

  • Throwable类:java.lang.Throwable
  • String getMessage():获取异常信息
  • String toString():获取异常类名和信息
  • void printStrackTrace():打印异常信息及位置
  • 所有异常都是由Throwble类派生
    • Error:错误
    • Exception:异常,又分为运行时异常与编译时异常
      • RuntimeException:运行时异常
      • 编译时异常:java程序必须显示处理,否则报错无法通过编译
  • JVM默认异常处理方式:打印异常信息,同时停止程序运行
  • try...catch语句形式
    • try...catch
    • try...catch...finally
    • try...finally
  • 多个异常可以使用多个catch语句;JDK7后多个异常可以在类型之间使用|隔开
  • throw关键字可以抛出异常;如果throw的异常不是RuntimeException则必须在方法上用throws声明,表示抛出的异常由调用者处理;throw只能抛出一个异常对象,throws后面可声明多个异常
  • finally语句一定会执行,除非执行前JVM退出(System.exit()),可以用于释放资源
  • 自定义异常:继承ExceptionRuntimeException(如果需要传入异常信息,则要重写子类的构造方法),然后用throw抛出
  • 子类重写父类的方法是,只能抛出与父类相同的异常或异常的子类;父类方法有多个异常抛出时,子类不能抛出父类没有的异常;父类方法没有抛异常,则子类重写的方法也不能抛异常
  • try后程序会继续执行;throw后程序会停止执行后面的语句,将异常抛给调用者处理

5. Arrays类

  • Arrays类:java.util.Arrays
  • 用于处理数组,方法都为静态
  • static String toString(int[] arr):数组转成字符串;类似有booleancharlong
  • static void sort(int[] arr):从小到大排序;类似有bytechardouble
  • static int binarySearch(int[] a, int key):使用二分法查找key;若元素无序,则返回(-插入点-1)

6. String类

  • String类:java.lang.String
  • 字符串字面值(如:"abc")都是该类的实例
  • String():空参构造
  • String(byte[] bytes):将字节数组转成字符串;类似有char[]参数
  • String(byte[] bytes,int index,int length):将字节数组的一部分转成字符串;类似有char[]参数
  • String(String original):将字面值转成字符串
  • boolean equals(Object obj):比较字符串内容
    • 通常用常量作为调用对象,防止空指针异常
    • 字面值常量存放在常量池,若两个字符串变量的初始化常量相同,则这两个地址指向常量池中同一个对象
    • java常量优化:将初始化时的常量先进行运算再编译
    • 字符串串联底层通过StringBufferStringBuilder实现,串联后再调用toString()方法
  • boolean equalsIgnoreCase(String str):比较字符串内容,忽略大小写
  • boolean contains(String str):判断是否包含str
  • boolean startsWith(String str):判断是否以str开头
  • boolean endsWith(String str):判断是否以str开头
  • boolean isEmpty():判断是否为空
    • ""String对象
    • null是空常量,可以给任何引用类型对象赋值
    • null不能调用对象的方法,否则会出现空指针异常
  • int length():获取长度
  • char charAt(int index):获取指定索引的字符
  • int indexOf(int ch):获取字符在该字符串中第一次出现的索引,若没有则返回-1;类似有String参数
  • int indexOf(int ch,int fromIndex):从指定位置开始,获取字符在该字符串中第一次出现的索引,若没有则返回-1;类似有String参数
  • String subString(int start):获取从指定位置开始到结尾的子串;调用subString()方法会返回一个新的字符串,不会改变原有字符串
  • String subString(int start, int end):获取从[start,end)的子串
  • int lastIndexOf(int ch):从后向前,获取字符串中第一次出现的索引,若没有则返回-1
  • int lastIndexOf(int ch,int fromIndex):从指定位置开始向前,获取字符串中第一次出现的索引,若没有则返回-1
  • String toLowerCase():将字符串转成小写
  • String toUpperCase():将字符串转成大写
  • String concat(String str):拼接字符串
  • byte[] getBytes():将字符串转成字节数组
  • char[] getCharArray():将字符串转成字符数组
  • static String valueOf(Char[] chs):将字符数组转成字符串
  • static String valueOf(int i):将int转成字符串
  • String replace(char old,char new):使用new替换old字符,返回新字符串
  • String trim():去除字符串首尾空字符,包含:\r\n\t
  • int compareTo(String str):按顺序比较字符串;长度一致时比较字符值;长度不一致时比较长度值
  • int compareToIgnoreCase(String str):按顺序比较字符串,不区分大小写

7. StringBuffer类

  • StringBuffer类:java.lang.StringBuffer
  • StringBuffer是线程安全的可变字符序列
  • StringBuffer():空参构造,初始容量为16个字符
  • StringBuffer(CharSequence seq):构造内容为seq的缓冲区,容量为seq的长度加16
  • StringBuffer(int capacity):构造容量为cepacity的缓冲区
  • int capacity():获取缓冲区当前容量
  • int lenght():获取缓冲区的字符数量
  • StringBuffer append(String str):将str添加到缓冲区,返回缓冲区本身;类似有charlongboolean参数
    • 调用方法添加或修改时,不会创建新的StringBuffer对象,直接修改原有对象
  • StringBuffer insert(int offset, String str):将str插入到offset位置,返回缓冲区本身;类似有charlongboolean参数
    • 删除或插入式,若没有索引,会引起索引越界异常
  • StringBuffer deleteCharAt(int index):删除指定位置字符,返回缓冲区本身
  • StringBuffer delete(int start, int end):删除从startend的字符
    • 清空:delete(0, sb.length())
  • StringBuffer replace(int start, int end, String str):将[start,end)的字符用str替换
  • StringBuffer reverse():将字符串反转,返回缓冲区本身
  • String subString(int start):从start到末尾截取字符串,返回新的字符串
  • String subString(int start, int end):截取[start,end)的字符,返回新的字符串
  • String作为参数传递时,修改后不影响之前的值,因为修改后会产生一个新的String对象;StringBuffer作为参数传递时,修改后影响之前的值,因为修改是对原对象进行的

8. StringBuilder类

  • StringBuilder类:java.lang.StringBuilder
  • 方法与StringBuffer基本一致
  • 区别:StringBuffer为线程安全的,效率低;StringBuilder为线程不安全的,效率高

9. 正则表达式

  • 用来描述或匹配字符串语法规则的字符串

  • 基本语法

    • [abc]:单个字符,abc中的其中一个
    • [^abc]:单个字符,除abc之外
    • [a-zA-Z]:单个字符,可为a~zA~Z
    • [a-d[m-p]]:单个字符,可为a~dm~p;等价于[a-dm-p]
    • [a-z&&[def]]:单个字符,def中的其中一个
    • [a-z&&[^bc]]:单个字符,可为ad~z;等价于[ad-z]
    • [a-z&&[^m-p]]:单个字符,可为a~lq~z;等价于[a-lq-z]
  • 预定义字符

    • .:任意字符;如果要匹配.,正则表达式使用\.,则Java中需要写为\\.(Java转义一次变为\.,正则转义一次)
    • \d:数字,等价于[0-9]
    • \D:非数字,等价于[^0-9]
    • \s:空白字符,等价于[\t\n\x0b\f\r]
    • \S:非空白字符,等价于[^\s]
    • \w:单词字符,等价于[a-zA-Z_0-9]
    • \W:单词字符,等价于[^\w]
  • 数量词

    • X?:零次或一次
    • X*:零次或多次
    • X+:一次或多次
    • X{n}n
    • X{n,}:至少n
    • X{n,m}:至少n次,不超过m
  • 捕获组:从左到右按括号编号,0组表示整个表达式,\n表示第n个捕获组

    • 如:((A)(B(C)))
      • 1组:((A)(B(C)))
      • 2组:(A)
      • 3组:(B(C))
      • 4组:(C)
    • replaceAll()方法中第二个参数可用$n获取第一个参数中的第n个捕获组
  • String类中的split()replaceAll()replaceFirst()matches()方法使用正则表达式

  • Pattern类与Matcher类典型使用

    /* 应用一:判断字符串是否满足正则表达式规则 */
    Pattern p = Pattern.compile("a*b");	//编译正则表达式
    Matcher m = p.matcher("aaaab");	//创建匹配器
    boolean b = m.matches();	//匹配整个区域
    /* 以上代码功能与以下代码相同 */
    boolean b = "aaaab".matches("a*b");
    
    /* 应用二:查找匹配的子序列 */
    Pattern p = Pattern.compile("a*b");	//编译正则表达式
    Matcher m = p.matcher("aaaab");	//创建匹配器
    boolean b = m.find();	//匹配整个区域
    if (b) String s = m.group();	//返回上次find()匹配的子序列