通过API文档学习一个类:
hashCode()作用:获取该对象的哈希码值(散列码值),是整数型。c++写的
getClass():返回此对象的运行时(的)真实类型,Class类型
Class
toString()***最重要 返回该对象的字符串表示, 结果应是一个简明但易于读懂的信息表达式。每个子类都重写吧
直接输出对象时,默认会调用它的 toString() 方法
equals(Object obj) ***最重要
判断str.equals("字符串") 很常用
对象1不能是 NULL. 不然会发生空指针异常
重写目的: 实际上我们追求的是逻辑上的相等。
finalize() 作用:可以释放系统资源, 但是不及时。
clone() 创建并返回此对象的一个副本返回该对象的一个克隆
重写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 类
意义:该引用所指对象是不是该类的实例?
(1).== :
1.如果比较是基本数据类型, 判断他们的值是否相等
2.如果比较是引用数据类型, 判断他们是否是同一个对象(地址是否相
等)
(2).equals():
1.不能比较基本数据类型
2.比较引用数据类型, 如果没有重写Object的equals(),默认判断是否是
同一个对象。
3.如果重写了,
一般是根据该对象的值进行判断
浮点数类型比较问题:
精度问题
compare()方法解决
用BIgDecimal类将小数实例化,用方法做运算。
克隆的条件
克隆原则:
1.地址不同
2.重写equals后 对象相同
3.同一个类的实例
注意:
克隆不会调用构造器
返回是一个Object对象
注意点:
当一个类中有引用类型的成员变量,默认的clone 方法浅拷贝,拷贝的是引用,所以需要深拷贝。
深拷贝的步骤
先实现浅拷贝:
类:
引用类型的成员变量
再实现深拷贝
注意: 导包问题,默认第一个导入一个不知道哪儿的包
String对象得的底层就是char类型的数组
而该数组的引用在源码的中定义为final修饰
该引用又在String类的对象中。
String对象做+等操作,实际上原先对象中的数组引用所指的数组元素并没有改变,而是新建了一个对象存储新的数组引用,新的数组引用指向了常量池中新拼接的串。
特点:
字符串对象常量,引用变量可以改
字符串对象在内存中究竟有没有发生变化呢?
没有变化
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个小字符串,返回类型是一个字符串数
组
String: 不可变的字符序列
StringBuffer: 可变的字符序列,线程安全的,效率低。
StringBuilder: 可变的字符序列,线程不安全的,效率高。
1、在字符串不经常发生变化的业务场景优先使用String(代码更清晰简
洁)。如常量的声明,少量的字符串操作(拼接,删除等)。
2 、 在 单 线 程 情 况 下 , 如 有 大 量 的 字 符 串 操 作 情 况 , 应 该 使 用
StringBuilder来操作字符串。不能使用String"+"来拼接而是使用,避免产生
大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量
时间)。如JSON的封装等。
3 、 在 多 线 程 情 况 下 , 如 有 大 量 的 字 符 串 操 作 情 况 , 应 该 使 用
StringBuffer。如HTTP参数解析和封装等。
原文:https://www.cnblogs.com/xiongzk/p/14289643.html