常用API
通过API文档学习一个类:
- 看类的说明文字
- 看构造方法
- 方法
Object
Object类的成员方法
-
hashCode()作用:获取该对象的哈希码值(散列码值),是整数型。c++写的
-
getClass():返回此对象的运行时(的)真实类型,Class类型
Class
-
toString()***最重要 返回该对象的字符串表示, 结果应是一个简明但易于读懂的信息表达式。每个子类都重写吧
直接输出对象时,默认会调用它的 toString() 方法
-
equals(Object obj) ***最重要
判断str.equals("字符串") 很常用
对象1不能是 NULL. 不然会发生空指针异常
重写目的: 实际上我们追求的是逻辑上的相等。
-
finalize() 作用:可以释放系统资源, 但是不及时。
-
clone() 创建并返回此对象的一个副本返回该对象的一个克隆
重写equals方法:
重写equals的设计原则:
重写3点
-
自反性
-
排他性+排空性
-
都是自己人,强转父类引用后,
同一个类的不同实例的属性相互比较。
-
既然逻辑上判定了两个对象相等,也得让两者hashCode值也一样
如果逻辑上判定不相等,hashCode值无所谓等不等。
补充 :equals方法在非空对象引用上实现相等关系的协定:
A.自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
B.对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回true 时,x.equals(y) 才应返回 true。
C.传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
D.一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
E.非空性:对于任何非空引用值 x,x.equals(null) 都应返回 false。a.当此方法被重写时,通常有必要重写 hashCode 方法,以维护
hashCode 方法的常规协定。
Instanceof运算符:
格式:引用 instanceof 类
意义:该引用所指对象是不是该类的实例?
== 和 equals()的区别
(1).== :
1.如果比较是基本数据类型, 判断他们的值是否相等
2.如果比较是引用数据类型, 判断他们是否是同一个对象(地址是否相
等)
(2).equals():
1.不能比较基本数据类型
2.比较引用数据类型, 如果没有重写Object的equals(),默认判断是否是
同一个对象。
3.如果重写了,
一般是根据该对象的值进行判断
浮点数类型比较问题:
精度问题
compare()方法解决
用BIgDecimal类将小数实例化,用方法做运算。
clone问题
克隆的条件
- 子类中重写clone 访问权限问题,
- 需要实现Cloneable接口(空接口),否则抛出异常
克隆原则:
1.地址不同
2.重写equals后 对象相同
3.同一个类的实例
注意:
克隆不会调用构造器
返回是一个Object对象
浅拷贝与深拷贝:
注意点:
当一个类中有引用类型的成员变量,默认的clone 方法浅拷贝,拷贝的是引用,所以需要深拷贝。
深拷贝的步骤
先实现浅拷贝:
类:
- 首先类中重写clone 访问权限问题,super。clone()不改
- 需要实现Cloneable接口(空接口),否则抛出异常
引用类型的成员变量
- 同样需要先实现浅拷贝
再实现深拷贝
- 浅拷贝返回的对象向下转型。
- 调用引用类型的成员变量的clone的,fangh
String类:
注意: 导包问题,默认第一个导入一个不知道哪儿的包
String对象得的底层就是char类型的数组
而该数组的引用在源码的中定义为final修饰
该引用又在String类的对象中。
String对象做+等操作,实际上原先对象中的数组引用所指的数组元素并没有改变,而是新建了一个对象存储新的数组引用,新的数组引用指向了常量池中新拼接的串。
构造方法:
- String() 构造空字符串
- String(byte[] bytes) 把byte数组转为字符串
- String(byte[] bytes,int offset,int length) byte数组偏
移后转为字符串 - ....... 查api文档就行了
特点:
字符串对象常量,引用变量可以改
字符串对象在内存中究竟有没有发生变化呢?
没有变化
判断功能方法:
equals(Object obj) 判断两个字符串的数值是否相等。
equalsIgnoreCase(String str)
不分大小写判断两个字符串是否相等
contains(String str)
判断大串是否包含小串,必须是连续的小字符串。并且任意一个非空
(非null)字符串都包含空串" "
startsWith(String str)
判断字符串是否从指定字符开始
endsWith(String str)
判断字符串是否到指定字符结束
isEmpty()
判断是否是空串,即是否长度为0 ,不是空串,也不是null
获取功能:
int length()
获取字符串的长度
charAt(int index)
获取指定索引位置的字符 ,和数组一样的索引,从0开始
indexOf(int ch)
获取指定字符第一次在字符串出现的位置,没有就返回-1
t indexOf(String str)
获取子串在字符串第一次出现的位置,如果没有出现,就返回-1
indexOf(int ch,int fromIndex)
从指定的fromindex位置开始搜索,获取指定字符的位置
indexOf(String str,int fromIndex)
从指定的fromindex位置开始搜索,获取指定字符串的位置
substring(int start)从指定的位置开始截取字符串,
一直到末尾结束
String substring(int start,int end)
指定开头和结尾来截取字符串,包左不包右,即左闭右开
转换
byte[] --> String
String --> byte[]
char[] --> String
byte[] getBytes()
字符串转为字节数组
String valueOf(int i)
把一个整数转为字符串
toLowerCase()
把字符串中的字符全部转为小写形式
toUpperCase()
把字符串中的字符全部转为大写形式
concat(String str)
字符串连接,
一般用加号代替,和+功能相同
但是参与运算的两个字符串本身不会发生变化。原理同之前的常量池
替换功能
replace(char old,char new)
替换某个字符
replace(String old,String new)替换其中某段字符串
去除字符串两端的空格
›String trim()
按字典顺序比较两个字符串 (从小到大排序)
›int compareTo(String str)
compareToIgnoreCase(String str)
比较时不管大小写
String[] split(String regex)
分割字符串,把字符串分割为n个小字符串,返回类型是一个字符串数
组
tring,StringBuffer,StringBuilder的区别
String: 不可变的字符序列
StringBuffer: 可变的字符序列,线程安全的,效率低。
StringBuilder: 可变的字符序列,线程不安全的,效率高。
总结
1、在字符串不经常发生变化的业务场景优先使用String(代码更清晰简
洁)。如常量的声明,少量的字符串操作(拼接,删除等)。
2 、 在 单 线 程 情 况 下 , 如 有 大 量 的 字 符 串 操 作 情 况 , 应 该 使 用
StringBuilder来操作字符串。不能使用String"+"来拼接而是使用,避免产生
大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量
时间)。如JSON的封装等。
3 、 在 多 线 程 情 况 下 , 如 有 大 量 的 字 符 串 操 作 情 况 , 应 该 使 用
StringBuffer。如HTTP参数解析和封装等。