• 常用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参数解析和封装等。

    talk is cheap,write and optimize my code。
  • 相关阅读:
    [leetcode]Valid Number
    [leetcode]Edit Distance
    [leetcode]Decode Ways
    [leetcode]Maximum Depth of Binary Tree
    [topcoder]BadNeighbors
    [topcoder]ZigZag
    [leetcode]Subsets II
    [leetcode]Merge Sorted Array
    [leetcode]Binary Tree Maximum Path Sum
    hdu 2964 Prime Bases(简单数学题)
  • 原文地址:https://www.cnblogs.com/xiongzk/p/14289643.html
Copyright © 2020-2023  润新知