Java笔记 常用对象
1.Object类
Object类是Java所有类的父类,也称为根类,任何类包括自己创建的类都是默认继承Object类的。
Object类的构造方法只有一个,且是无参构造,所有子类默认访问的是父类的无参构造;
通过查看API,我们可以知道Object类包含以下主要方法:
- clone() 创建并返回此对象的副本;它可以将对象的成员变量值与方法一同复制过来称为一个独立的拷贝对象,clone方法默认走的是浅复制,如果复制的对象中有引用类型的,那么拷贝对象就会与原对象产生联系,对引用型变量的更改也会影响到原对象;这时可以重写clone方法实现深复制;
- equals(Object obj) 比较两个对象是否相同,默认是比较地址值;但一般情况下这样比较是没有什么太大意义,因此一般会在类中覆盖重写这个方法;
- finalize() 用于垃圾回收,当GC(垃圾收集器)确定不再有该对象的引用时,由垃圾回收器在对象本身上调用这个方法,可以重写;GC的回收时机是不确定的;
- getClass() 返回此对象的运行时类,反射中用,不可以重写;
- hashCode() 返回该对象的哈希码值,可以重写;一般需要和equals一起重写,常用在具有哈希功能的Collection集合中;
- toString() 返回此对象的字符串表现形式,可以重写,建议重写;
- wait() 让当前线程对象等待,直到被另一个线程对象调用该对象的 notify()方法或 notifyAll()方法。
- wait(long timeout) 导致当前线程等待,直到另一个线程调用 notify()方法或该对象的 notifyAll()方法,或者指定的时间已过。
- wait(long timeout, int nanos) 导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法,或者某些其他线程中断当前线程,或一定量的实时时间。
- notify() 唤醒正在等待对象监视器的单个线程。
- notifyAll() 唤醒正在等待对象监视器的所有线程。
注意的问题:
直接输出一个对象名称,默认调用的是该对象的toString方法;
"=="和"equals"的不同:
双等于对于基本类型比较的是值,引用对象比较的是地址值;
equals只能比较引用类型,不重写和双等于一样,重写后可以根据需求比较对象的其他方面;
2.Scanner类
Scanner类是JDK5以后出现的用于键盘录入数据的扫描器类;
它的构造方法有很多,可以传递文件类型,也可以传递流类型等,我们比较常用的是传递一个标准输入流(System.in),System.in是System类下的一个字段(成员变量),它其实是一个InputStream类的标准输入流;
通过这个构造方法,我们可以创建出一个键盘录入对象,接下来列举一些我们常用的Scanner类方法:
- nextInt() 将输入的下一个标记扫描为 int ,可以用于接收int类型的数据;
- nextLine() 将此扫描仪推进到当前行并返回跳过的输入。返回String类型数据,一次可以接收一行数据;
其他方法可以通过查看API使用;
在使用Scanner类对象时,先接收数字再接收字符串会出现些小问题,这时可通过重新创建一个Scanner对象或者所有数据都用字符串接收的方式解决;字符串类型数据后面可以通过包装类的方法完成到其他类型的数据类型转换;
3.String类
String类在java中代表字符串,任何诸如“acb”之类的字面值字符串都作为此类的实例实现,它是不可变类;
在String源码中,String的值被一个final类型的char数组存储(jdk9以后变为byte数组),由此可以看出String类创建的对象的值是不能被改变的,一旦值改变就会产生一个新的String类对象;
String类常用的创建字符串对象形式有如下两种:
String s = “abc”;
String ss = new String(“abc”);
第一种是通过字面值创建String对象,先在栈中创建变量s,然后去找“abc”这个字面值是否已在字符串常量池(一种由String类维护的私有内存区域)中存在,如果存在,就将这个字面值的引用返回给变量s;如果不存在这个字面值,则先在堆中创建String对象,然后将这个对象的引用存在常量池中并创建这个字面值赋值给这个引用,然后把引用返回给s变量;这样后面在创建相同字面值的String变量时它们所指向的对象就都是相同的,前提是用字面值创建的方式;
第二种可以分解成两步1、String object = “abc”; 2、String ss = new String(object); 它和第一种的区别是第二步,不管这个值是否已存在常量池都会在堆中创建一个新的String对象,ss变量所指向的引用也永远是这个新创建的对象;
String类方法(全部方法请参考API):
char charAt(int index) 返回char类型指定索引处的值。
int compareTo(String anotherString) 按字典顺序比较两个字符串。
String concat(String str) 将指定的字符串连接到该字符串的末尾。
boolean contains(CharSequence s) 当且仅当此字符串包含指定的char值序列时才返回true。
boolean contains(String str) 是否包含指定的字符串
boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结尾。
boolean equals(Object anObject) 将此字符串与指定对象进行比较。
byte[] getBytes(Charset charset) 使用给定的charset将该String编码为字节序列,将结果存储到新的字节数组中。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将此字符串中的字符复制到目标字符数组中。
boolean isEmpty() 当 length()为 0,返回true。
int hashCode() 返回此字符串的哈希码。
int indexOf(int ch) 返回指定字符第一次出现的字符串内的索引。
int indexOf(int ch, int fromIndex) 返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。
int indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引。
int indexOf(String str, int fromIndex) 返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。
int length() 返回此字符串的长度。
boolean matches(String regex) 告诉这个字符串是否匹配给定的正则表达式 。
String replace(char oldChar, char newChar) 返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。
String replaceAll(String regex, String replacement) 用给定的字符串替换与给定的正则匹配的此字符串的每个子字符串。
String[] split(String regex) 将此字符串分割为给定的 regular expression的匹配。
boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开头。
String substring(int beginIndex) 从给定的索引处截取字符串
String String substring(int beginIndex, int endIndex) 从指定索引处开始,指定索引处结束截取字符串;
char[] toCharArray() 将此字符串转换为新的字符数组。
String toLowerCase() 将所有在此字符 String使用默认语言环境的规则,以小写。
String toUpperCase() 将所有在此字符 String使用默认语言环境的规则大写。
String trim() 返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。