常用API
Object
所有类都继承Object
getClass
返回调用此方法的运行时类的Class对象
toString
如果不重写的话返回的就是一个地址值
equals
默认是比较两个对象是否是同一个对象,即只有自身与自身比较才会返回true
1.如果是不同类型的对象,直接返回false
2.如果是相同类型的对象,比较成员变量的取值
自反性:自己和自己相比是相等的
if (this == obj) return true;
排他性:使用getClass是只有完全是同一个类型是才会返回true,使用instanceof是
if (obj == null || this.getClass() != obj.getClass()) return false;
对称性
一致性
Student target = (Student) obj; if (target.id != this.id) return false; if (target.age != this.age) return false;
hashcode
返回该对象的哈希值,一般是用来判断是否是同一个对象,每个对象都有唯一的哈希值
finalize
用于通知GC回收垃圾,但基本没啥用
Clone
a.要解决访问权限问题,需要在子类中重写clone方法的访问权限
b.(选做,非必须)重写方法的返回值类型为自身类型
c.一个类想要做克隆操作,必须要先实现一个接口java.lang.Cloneable,表示该类允许进行克隆
如果该类没有实现接口,又要克隆操作,就会抛出异常:CloneNotSupportedException
d.以上步骤完成,就可以克隆一个对象了
上述的过程是一个浅克隆,如果克隆的对象中有引用数据类型,克隆后的对象和原对象中的引用数据类型变量指向的是同一个对象,就会造成相互影响
深度克隆的方法:
a.将引用指向的对象,再克隆一份
b.然后让克隆后的引用指向它
String
String对象不可变
某个String对象创建完成后,就不能再改变它对象的状态,要注意是对象不可变并不是引用的指向不可变
底层是用final修饰的char数组
字符串常量池
每当创建字符串常量对象时,JVM会首先检查字符串常量池,如果该字符串对象已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串对象不存在于常量池中,就会实例化该字符串并且将其放到常量池中。
一旦在堆上创建对象做字符串拼接,都会在堆上创建新的对象
- 当参与字符串拼接的两个字符串中,至少有一个是以引用变量的形式出现时必然会在堆上创建新的字符串对象
- 原因是变量参与了运算,无法在编译时期确定其值,就不能在编译时期加入常量池
- 只有参与字符串拼接运算的两个字符串,都是字符串字面值常量的时候
- 此时不会在堆上创建新的字符串对象,而是在常量池中直接拼接创建对象
- 如果已存在,则不创建新的对象
String API
最常用的:
equals, equalsIgnoreCase,contains,startsWith, endsWith,isEmpty
length,charAt,substring,getBytes,valueOf
比较器
String类当中compareTo方法实现:
该方法实际上是返回两个字符串第一位不相同字符的编码值之差,如果字符在比较中都相同,就返回长度之差
Comparable接口
实现此接口的类,其对象数组(array)或对象容器(collection)
就可以通过**Arrays.sort()或Collections.sort()**进行自动排序
对于实现该接口的A类来说,其对象a1.compareTo(a2)方法返回值
- 小于0,表示a1对象小于a2,在自然排序中处于前面的位置
- 大于0,表示a1对象大于a2,在自然排序中处于后面的位置
- 等于0,表示a1对象等于a2
具体需要升序排列还是降序排列,只需要在重写方法的时候调整返回值的顺序就行了;
即,比较器只根据返回值是多少来进行排序,而并不关心里面是怎么来写返回规则的,所以如果要升序就是a1-a2,降序就是a2-a1
Comparator接口
是一个功能接口,重写里面的Comparable方法即可调用,一般配合Arrays.sort使用,可以直接在形参列表中传入一个lambda表达式,排序的规则和Comparable一致
可变字符串
StringBuffer
扩容机制:
- 无参构造默认大小为 16
- 调用int单参数构造方法,初始化大小为指定的int值
- 调用 String 类型的构造方法,初始化大小为:字符串的长度 + 16
- 扩容机制每次扩容大小为:原数组大小 * 2 + 2
常用的功能
获取功能:
public int capacity() 返回当前容量,数组的长度,理论值
public int length() 返回长度(字符的个数),实际值
添加功能:
public StringBuffer append(String s) 将指定的字符串(其他类型有重载方法)追加到此字符序列的尾部
删除功能:
public StringBuffer deleteCharAt(int index):删除指定位置的字符
public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容
替换功能:
public StringBuffer replace(int start,int end,String str)
反转功能:
public StringBuffer reverse():将此字符序列用其反转形式取代,返回对象本身
截取功能:
public String substring(int start):返回一个新的String,开头到结束
public String substring(int start,int end):返回一个新的String,指定区间
StringBuilder和StringBuffer的功能基本无差别,但StringBuffer是线程安全的,效率较慢,StringBuilder是线程不安全的,效率较快
Java日期类
Date类
构造方法:
Date() 该构造函数使用当前日期和时间来初始化对象
Date(long millisec)接收一个参数,该参数是从1970年1月1日起的毫秒数
SimpleDateFormat
构造方法:
public SimpleDateFormat(String pattern)
以传入的字符串格式进行解析或者格式化日期,即创建一个模板
成员方法:
将传入的Date对象按照pattern格式,格式化成一个字符串
public final String format(Date date)
将传入的字符串按照pattern格式,解析成一个Date对象
public Date parse(String source)
异常
Exception
在继承层次上是编译时异常和运行时异常的父类
从使用上来说,一般作为编译时异常被使用
并且在自定义异常时,Exception是作为编译时异常的父类而存在的,所有直接继承Exception的类都是编译时异常
RuntimeException
运行时异常,只有在程序运行时期才可能被抛出,
异常默认处理机制:
程序抛出运行时异常,最终会抛给JVM,然后JVM终止程序执行,在控制台打印报错信息
发生异常之前的语句正常执行,但是之后的语句都不执行了
try…catch
* try { * //可能出现异常的,正常的代码逻辑 * } catch(要捕捉的异常对象) { * //每一个catch分支对应一个异常处理器 * //在catch分支中处理具体类型的代码异常 * }finally{ //最后一定会执行的代码块 }
当捕获异常失败时,相当于没有做处理,仍然会默认抛给jvm然后程序终止,如果try中没有异常抛出,不会执行catch中的语句,
try代码块要么不产生异常,要么至多产生一个异常,因为一旦某行产生异常,后面的代码都不会执行了,所以即使匹配多个异常,也只需一个对象名
单分支的try…catch也是可以同时处理多个异常类型的:
* catch(异常类型名1 | 异常类型名2 | ... 异常对象名){ * }
try…catch也可以用于捕获和处理编译时异常,如果catch一个编译时异常,只有在try中会抛出该异常时才能够这么做,而运行时异常可以任意捕获
throws
* 语法: * 方法名(形参列表) throws 异常列表{ * }
该声明仅仅表示方法可能会抛出异常,具体到底抛不抛出,要看方法体中代码的执行结果
列表中出现的异常如果有父子关系,那么编译器只会强制要求处理父类
throw
throw关键字用于方法体中,用于明确的抛出一个异常对象,并且后面也只能跟一个对象
throw+编译时异常对象,表示在方法中明确抛出一个编译时异常
这时需要配合throws进行抛出,因为需要编译时显式处理
throw+异常对象抛给方法的调用者后,后面的代码都不能执行了,当然它的后面也无法写代码
* - try代码块如果有return * - 程序会先执行完finally代码块,回过头执行try中的return * * - catch代码块中如果有return,并且catch正常捕获异常执行 * - 程序会先执行完finally代码块后,再回去执行catch中return,从catch代码块中结束方法 * * - finally代码中有return * - 不会影响finally代码块执行 * * - 如果finally和catch中都有return * - 程序会直接从finally代码块中的return结束方法 * * - 如果try中的异常不能正常捕获,但是finally中有return * - **注意此时程序会跳过这个异常,不会抛出异常给JVM报错**
自定义异常
写一个类继承RuntimeException,得到一个运行时异常;继承Exception得到一个编译时异常
File类
使用"…/"表示上级目录,在idea中,相对路径默认是当前project中第一个创建的module的绝对路径
常用功能:
//删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除 public boolean delete() //判断File对象是否表示的是一个文件 public boolean isFile() //判断File对象是否表示的是一个目录 public boolean isDirectory() //判断File对象表示的文件或目录,是否真实存在 public boolean exists() //获取File对象表示的抽象文件的绝对路径 public File getAbsolutePath() //获取File对象表示的抽象路径名的字符串,简单来说,创建的时候给的是什么就输出什么 public String getPath() //获取File对象表示的文件或者目录的文件名 public String getName() //返回由此抽象路径名表示的文件的所占硬盘空间大小,以字节为单位 //但是需要注意的是,这个方法只能获取文件的大小,不能获取目录大小 public long length() //返回一个字符串数组,这些字符串包括,此抽象的路径名表示的目录中的所有文件和文件夹的名字 //如果File对象表示的是一个文件,则返回null //只能获取当前目录的下一层,并不是获取所有层级 //如果是一个空目录,返回一个长度为0的数组,而不是null public String[] list() //返回指定File目录下的文件和文件夹的绝对路径形式的File对象数组 //如果File对象表示的是一个文件,则返回null //只能获取当前目录的下一层,并不是获取所有层级 //如果是一个空目录,返回一个长度为0的数组,而不是null public File[] listFiles() //获取这个文件夹下,满足filter过滤器的条件的文件,需要重写过滤器 File[] listFiles(FileFilter filter)