e^nx

导航

常用API-Object+String

常用API

通过API文档学习一个类:

  1. 看类的说明文字
  2. 看构造方法
  3. 方法

Object

Object类的成员方法

  • hashCode()作用:获取该对象的哈希码值(散列码值),是整数型。c++写的

  • getClass():返回此对象的运行时(的)真实类型,Class类型

    Class

  • toString()***最重要 返回该对象的字符串表示, 结果应是一个简明但易于读懂的信息表达式。每个子类都重写吧

    直接输出对象时,默认会调用它的 toString() 方法

  • equals(Object obj) ***最重要

    判断str.equals("字符串") 很常用

    对象1不能是 NULL. 不然会发生空指针异常

    重写目的: 实际上我们追求的是逻辑上的相等。

  • finalize() 作用:可以释放系统资源, 但是不及时。

  • clone() 创建并返回此对象的一个副本返回该对象的一个克隆

重写equals方法:

重写equals的设计原则:

重写3点

  1. 自反性

  2. 排他性+排空性

  3. 都是自己人,强转父类引用后,

    同一个类的不同实例的属性相互比较。

  4. 既然逻辑上判定了两个对象相等,也得让两者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问题

克隆的条件

  1. 子类中重写clone 访问权限问题,
  2. 需要实现Cloneable接口(空接口),否则抛出异常

克隆原则:

1.地址不同

2.重写equals后 对象相同

3.同一个类的实例

注意:

克隆不会调用构造器

返回是一个Object对象

浅拷贝与深拷贝:

注意点:

当一个类中有引用类型的成员变量,默认的clone 方法浅拷贝,拷贝的是引用,所以需要深拷贝。

深拷贝的步骤

先实现浅拷贝:

类:

  1. 首先类中重写clone 访问权限问题,super。clone()不改
  2. 需要实现Cloneable接口(空接口),否则抛出异常

引用类型的成员变量

  1. 同样需要先实现浅拷贝

再实现深拷贝

  1. 浅拷贝返回的对象向下转型。
  2. 调用引用类型的成员变量的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参数解析和封装等。

posted on 2021-01-17 17:56  e^nx  阅读(53)  评论(0编辑  收藏  举报