day08 Object和String类

day08 Object和String类

object类

所有类如果没有显式的继承其他类,它的直接父类就是object类

如果一个类继承了其它类,追根溯源,总有一个祖先类无继承,即这个祖先类的父类就是object类

object类有一个无参构造方法,会为了防止某个子类有无参构造方法

几种成员方法

class对象

几种方法

public final Class getClass()

返回此对象的运行时类
即调用getclass方法的当前对象
运行时类:一个Class 一个对象
一个Class对象代表一个类

如何理解class类:???
1.有成员对象
2.有成员方法
3.有构造方法

两个注意事项:
1.输出对象,其实输出的是一个对象的字符串表示
2.字符串可以和对象进行字符串做字符串拼接运算

public String toString()

public int hashCode()

public boolean equals(Object obj)

boolean equals(Object obj)
    指示其他某个对象是否与此对象"相等"。
    此对象:调用equals方法的当前对象
    其他某个对象:参数对象obj
    
Object类的equals方法实现对象上差别可能性最大的相等关系:
    即,对于任何非空引用值x和y,当且晋档x和y引用同一个对象是,此方法才返回true
    
    换言之,只有同一个对象,自己给自己比,才相等,否则不等
    
    
    
什么是对象相等?
    a.同一个类的对象,有差异的原因是成员变量的取值不同
    b.所以我么认为,同一个类的对象,当它们对应的成员变量的值都相等,我么认为这两个对象相等
    c.不同类型的对象,一定不会相等
    
equals方法在费控对象引用上实现相等关系,要满足四个特性:
    1.自反性,对于任何非空引用值x,x.equals(x)都应该返回true
    2.对称性,a和b相等,则b和a相等
    3.传递性,a和b相等,b和c相等,则a和c相等
    4.一致性,
    
    5.对于任何非空引用值x,x.equals(null)一定返回false

自己写一个equals函数:

 @Override
    public boolean equals(Object obj) {//没听懂
        if(obj == this){//自反性
            return true;
        }

        // 判断不相等的特殊情况
        if(obj == null || this.getClass() != obj.getClass()){
            return false;
        }

        //到这里,一定是同种类型的不同对象,比较成员变量值
        if(i != ((EqualsClass) obj).i){
            return false;
        }

        //比较下一个成员变量值
//        return j = ((EqualsClass) obj).j;这样比较不好,因为这个j为double变量,不好比较
        return Double.compare(j,((EqualsClass) obj).j) == 0;

    }

idea也可以直接生成一个equals方法(用generate来产生equals方法)

protected void finalize()

1.当垃圾回收期确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
2.子类重写finallize方法,以配置系统资源或执行其他清除任务
有关线程通信的几种方法

String类

构造方法:

 最常用的构造并初始化的方法:
 String str = "..."
 
 1.public String()  空字符串 ""=空对象

 //利用字节数组,创建字节数组所表示的字符串
 //a. 字符 -> 数值形式  'a' -> 97
 2.String(byte[] bytes)//eg:
 byte[] a = {97,98,99,100,101}//对应abcde
 

 //利用字节数组的一部分,创建字符序列, 从byte数组的offset开始(包含offset对应的字节值)的length个字节值
 3. public String(byte[] bytes,int offset,int length)
 byte[] bytes = {99,98,97,96};
 String s = new String(bytes, 2, 3);

 //利用一个字符数组创建字符数组,代表的字符序列,注意2和4的区别
 4. public String(char[] value)

 // 创建value字符数组中,从第offset位置开始的count个字符,所代表的字符串对象
 5. public String(char[] value,int offset,int count)

 6. public String(String original)   知道即可

java语言中字符串的特征:

  1. 字符串是常量(并非指字符串被final修饰)
  • 之所以说字符串是常量,其值在创建后不能被修改

  • 一个字符串随想一旦创建完毕,其所代表的字符串序列就固定不变了

  • 如果要修改,jvm永远是自动创建的新的字符串序列

image-20220107152940351

  1. 一个字符串字面值常量,也是字符串对象
  2. 表示字面值常量("")的字符串对象,字符串常量池中

字符串常量池在堆上来(jdk7以后)

面试题:
1.String s ="hello"; s += "world";问s的结果是多少?
2.String s = new String("hello")和String s = "hello";的区别?
  String s = new String("hello")涉及两个字符串对象,一个是new出来的,在堆上,一个是字符串常量"hello",在常量池上
  String s = "hello"只涉及1个字符串对象
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3==(s1+s2));//false
System.out.println(s3.equals(s1+s2));//true(内容相等)

System.out.println(s3==("hello"+"world"));//true(争议最大的地方),这里经编译器处理以后形成字节码文件(class文件,在out文件夹中)直接将两个字符串拼接在了一起,与s3完全相同
System.out.println(s3.equals("hello"+"world"));

运算规则:

字符串拼接何时会在堆上,创建新的字符串对象,何时不会呢?

  1. 当参与字符串拼接的两个字符串中,至少有一个是以字符串的引用变量的形式出现,此时拼接运算,必然会在堆上创建新的字符串对象

    s1 + s2或者s1 + “hello”

  2. 只有参与字符串拼接运算两个字符串,都是字符串常量的时候,此时不会在堆上创建新的字符串对象,而是直接拼接

    boolean equals(Object obj)  //用来比较字符串的内容
    boolean equalsIgnoreCase(String str) //忽略字符串大小写比较字符串内容
    boolean contains(String str) //判断当前字符串对象是否包含,目标字符串的字符序列
    boolean startsWith(String str) //判断当前字符串对象,是否已目标字符串的字符序列开头
    boolean endsWith(String str)// 判断当前字符串,是否以目标字符串对象的字符序列结尾
    boolean isEmpty() //判断一个字符串,是不是空字符串

字符串的获取功能:

获取功能:
 int  length()  // 获取当前字符串对象中,包含的字符个数
 char charAt(int index) // 获取字符串对象代表字符序列中,指定位置的字符
 int indexOf(int ch) // 在当前字符串对象中,查找指定的字符,如果找到
                     // 就返回字符,首次出现的位置,如果没找到返回-1

 int indexOf(String str) // 查找当前字符串中,目标字符串首次出现的位置(如果包含)
                         // 找不到,返回-1, 这里的位置是指目标字符串的第一个字符
                         // 在当前字符串对象中的位置

 int indexOf(int ch,int fromIndex) // 指定,从当前字符串对象的指定位置开始,查找首次出现的指定字符的位置(如果没找到返回-1)
 int indexOf(String str,int fromIndex) // 指定,从当前字符串对象的指定位置开始,查找首次出现的指定字符串的位置(如果没找到返回-1)

 String substring(int start) // 返回字符串,该字符串只包含当前字符串中,从指定位置开始(包含指定位置字符),的那部分字符串
                                "zhangsan" -> "san"
 String substring(int start,int end) // 返回字符串,只包含当前字符串中,从start位置开始(包含),到end(不包含)指定的位置,
                                     // 这部分字符串 [start, end)(注意,是左闭右开)

字符串的转换功能

转化功能
byte[] getBytes()  // 获取一个用来表示字符串对象字符序列的,字节数组
char[] toCharArray() // 获取的是用来表示字符串对象字符序列的,字符数组

static String valueOf(char[] chs)
static String valueOf(int i)//double i也可以

String toLowerCase() //把字符串全部转化为小写
String toUpperCase() // 把字符串全部装华为大写

String concat(String str) //字符串拼接 作用等价于 + 实现的字符串拼接
     

字符串替换功能,去除空格字符

String类的替换功能
        String replace(char old,char new) // 在新的字符串中,用新(new)字符,替换旧(old)字符
        String replace(String old, String new) //在新的字符串中,用新的字符串(new), 替换旧(old)字符串

String类去除空字符串
        String类去除空格字符(去除的是开头和结尾的字符)
        String trim()

字符串的大小比较

1. 字符串的大小如何比较?

     按照字典序,比较字符串的大小。字典序原本的含义实质,英文单词在字典中出现的先后顺序
    (在字典中,先出现的字符串小,后出现的字符串大)

    具体到编程语言,是根据两个字符串字符串从左往右数,第一个对应位置的不同字符,来决定两字符串的大小
    hello
    headf

  compareTo几乎就是按照字典序,来比较两个字符串大小的
   字符串对象.compareTo(字符串对象)


    int compareTo(String str) 返回一个整数,表示大于,等于,小于三种关系
    a. 返回值 > 0 正整数 表示大于关系  当前对象 > 参数对象
    b. 返回值 < 0  负整数 表示小于关系 当前对象 < 参数对象
    c. 返回 == 0   表示相等关系 当前对象 = 参数对象

源码:

image-20220112091909118

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值