(六)常用类之Object类 与 String类

Object类

  1. public int hashCode() : 返回该对象的哈希码值

    注意: 哈希值是根据哈希算法计算出来的一个值,这个值和地址有关,但不是地址。可以暂时理解为地址

  2. public getClass() 返回对应的类的名字 同一个类是同一个

  3. public String toString() : 返回该对象的字符串表示 (最好子类重写)

    通常默认情况下,返回的字符串,由类名(对象是该类的一个实例),at标记符“@”,和对此对象的哈希码的无符号十六进制表示组成。即它的值等于:

    getClass().getName() + “@” + Integer.toHexString(hashCode())

    Integer.toHexString(int i) 把一个整数转成一个十六进制表示的字符串

    • 建议所有子类重写该方法
  4. public boolean equals(Object obj) : 默认情况下指示两个对象是否指向是同一个对象(在同一个地址) 注意:有些子类会重写,可以比较值是否相同

    == 基本类型:比较值是否相等; 引用类型:比较地址值是否相等

    euals() : 只能比较引用类型

    源码

    public boolean equals(Object obj) {
        return (this == obj);
    }
    

    比较地址一般意义不大,所以经常需要重写

    • 经常重写为比较成员变量值。

    • 重写方法内部,注意成员变量值的引用,如果参数是Object,需要先向下转型

    • 优化: 先判断对象是否是同一个 if ( this == obj ) { return true; }

    • 优化: 先判断是否是对应的类 if ( !(obj instanceof *** ) ) { return false; }

      或者 getClass()方法判断 if ( this.getClass() != obj.getClass() ) { return false; }

    注意:String类的值比较不能用==来比较,而是equals()方法。已经被重写比较字符串值是否相同。


String类

特点:

  1. 字符值是一个实例,一个常量,一旦被创建就不能改变。拼接或者其他操作只是创建新对象,然后改变引用变量引用的位置。(不改变只是指对象实例不变,引用变量可变)
  2. 字符串直接赋值的方式是先到字符串常量池里面去找。如果有就直接返回,如果没有,就创建在常量池中再返回。
  3. 比较时需要用equals()方法(已经被重写)
  4. 判断功能,获取功能,转换功能,替换、比较、去除功能。

构造方法:

  1. public String()

  2. public String(byte[ ] bytes)

  3. public String(byte[ ] bytes, int index, int length)

  4. public String(char[ ] chars)

  5. public String(char[ ] chars, int index, int length)

  6. public String(original String)

    • String 构造时,构造方法与直接字面量赋值的区别:

      String s1 = new String("Hello"); 
      // s1指向堆内存的构造器地址,堆中构造器再指向字符串常量池地址(两个指针)
      
      String s2 = "Hello";
      // s2直接指向字符串常量池的地址
      
      String s3 = "Hello";
      System.out.println(s3 == s1);  //false
      System.out.println(s3 == s2);  //true
      // s3 竟然直接指向s2指向的同一对象
      
      String s4 = "world";
      String s4 = "Helloworld";
      s3 == s1 + s2;  //false
      s3 == "Hello" + "world";  //true
      
      • String引用变量来进行拼接+:先在字符串常量池创建空间,再拼接出新对象
      • String字面常量来进行拼接+:先常量拼接起来,看看有没有这样的常量,如果有直接返回,否则就创建

常用方法:

一. String判断功能

  1. boolean equals(Object obj) 已经重写,可以比较字符串内容是否相同(区分大小写)
  2. boolean equalsIgnoreCase(String str) 比较字符串的内容是否相同,忽略大小写
  3. boolean contains(String str) 判断大字符串中包含小字符串
  4. boolean startsWith(String str) 判断字符串是否以某个指定的字符串结尾
  5. boolean isEmpty() 判断字符串是否为空字符串(对象存在,只是值为空)

二. String获取功能

  1. int length() 获取长度(字符个数)
  2. char charAt(int index) 获取指定位置的字符 //类似python索引
  3. int indexOf(int ch) 返回指定字符在字符串中第一次出现的索引
  4. int indexOf(String str) 返回指定字符第一次出现的索引
  5. int indexOf(int ch,int fromIndex)
  6. int indexOf(String str, int fromIndex)
  7. int lastIndexOf(String str) 返回最后一次出现的索引
  8. String substring(int start) 从指定位置开始截取字符串,默认到末尾 //类似python切片
  9. String substring(int start,int end) 注意endIndex,不包含下边界end(包start不包end
  • 3,4,5,6 若找不到index,返回-1,不报错

三. String转换功能

  1. byte[ ] getBytes() : 把字符串转换成字节数组

  2. char[ ] toCharArray() : 把字符串转换成字符数组 (可以用来遍历字符串)

  3. static String valueOf(char[ ] chs) : 把字符数组转成字符串

  4. static String valueOf(int i) : 把int类型转换为字符串

    注意:static String valueOf() 可以把任意类型的数据转换成字符串

  5. String toLowerCase() : 返回转成小写的字符串 (产生新串,原字符串不变)

  6. String toUpperCase():返回转成大写的字符串

四. 其他功能

1. 替换:把原字符串中的old全部转换为new,返回新的字符串

  • String replace(char old, char new)
  • String replace(String old, String new)

2. 去除字符串两端空格、回车、换行

  • String trim()

3. 分割功能:

public String[ ] split(String str) :将此字符串按照给定的str分割成字符串数组

3. 按字典顺序比较两个字符串

  • int compareTo(String str)
  • int compareToIgnoreCasse(String str)
    // 字符串自动转换成一个字符数组
    // private final char value[]
public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;   //若某个值不同,返回差值
            }
            k++;
        }
        return len1 - len2;  // 若到末尾均相同,返回长度的差
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容