常用类

Object介绍

Objective类

  • Objective类的特点

    所有类的父类,定义任何一个类就天生具备了Object类的所有方法。

  • 本地方法

    native:本地修饰符

    本地方法是c++编写,所有的本地方法,要和当前的操作系统交互。

    Object类进入内存,本地方法就被调用了,JVM就和操作系统连接了

    本地方法运行,是另一个独立的内存区域,本地方法栈

toString()方法

  • 定义在Object中,所有子类都可以使用,方法返回的是字符串
  • 在输出语句中,输出的是一个对象,默认调用toString()方法
  • Object中toString()
1
2
3
4
5
6
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//getClass().getName()计算结果是包名.类名
//hashCode()计算结果是内存地址,十进制
//Integer.toHexString转为十六进制

重写父类toString()方法

  • 利用多态性,如果重写了就调用子类的toString(),如果不重写就调用父类(Object)的。

equals()方法

java中认为所有的对象都具备比较性,进行对象之间比较的方法定义在Object中,equals方法的结果返回值boolean类型。

  • Object类中的equal()方法
1
2
3
public boolean equals(Object obj) {
return (this == obj);
}
  • ==比较引用类型时,比较的是地址。

重写equals()方法

  • public boolean equals(Object obj) {
        if(obj==null){//健壮性判断
            return false;
        }
        if(this==obj){//提升性能的校验
            return true;
        }
        if(obj instanceof 某类){//安全性校验
            //自定义
            return 布尔;
        }
        return false;
    }
    <!--2-->
    
    字符数组私有、final:字符数组一旦创建,数组的地址不能改变,是常量。
    
    jdk9开始,字符串底层实现是byte数组,省内存。
  • 字符串对象的不变性

    1
    2
    String str="abc";
    str="hello";

    存放”abc”的String没有改变,而是重新创建String对象存放”hello”,变量str重新保存了”hello”对象的地址。

  • 字符串对象的创建

    String对象创建后,在堆内存的对象中会有char数组,用来存放字符。而这个char数组是私有的且不提供set方法,所有通过String对象无法修改char数组的值。final修饰后,数组变量value的值(这个值是地址)也不能修改。

  • 直接创建

    1
    String str="hello";
  • 使用String的构造器

    1
    2
    //不推荐使用,代码太多
    String str=new String("hello");

    两种创建方式的区别:

    1
    2
    3
    4
    5
    public static void main(String[] args) {
    String str="hello";
    String str1=new String("hello");
    System.out.println(str==str1);//false
    }

    两个对象的内存地址是不一样的,使用了new ,创建了一个新的字符串对象。所以两个字符串变量不共享同一个String对象。

    两种创建方式创建出来的对象在堆内存中的布局是一样的。

  • 字符串定义比较的问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void main(String[] args) {
    String str1="hello";
    String str2="hello";
    System.out.println(str1==str2);//true 没有new 字符串相同时,编译器优化,共享空间。
    String str3="hello";
    String str4="world";
    String str5="helloworld";
    System.out.println((str3+str4)==str5);//false 编译器编译时,不确定 str3和str4的值,所以会使用新的内存,产生新的对象。
    System.out.println(("hello"+"world")==str5);//true 常量运算,确定了值 编译时做优化会共享空间。
    String str6="a"+"b"+"c";//创建了1个对象,因为编译时是常量确定了值,所以值创建一个对象
    }
    final String str7="hello";
    final String str8="world"; System.out.println((str7+str8)==str5);//true 编译后没有final这个关键字,编译时会把带有 final关键字的变量作为常量直接把值带过去
    • String类的构造方法

      创建对象的时候使用new String(),重载的形式。

      • 传递字节数组 String(byte[] bytes)

        使用操作系统默认字符集。中文GB系列

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        public static void main(String[] args) {
        byte[] bytes={97,98,99,100};//查询ascii编码表 正数
        String str=new String(bytes);
        System.out.println(str);
        byte[] bytes1={-26,-97,-91};//出现结果 负数汉字:查
        //使用的编码表是UTF-8 3个字节为一个汉字 GBK汉字两个字节
        // 默认编码表GBK 在idea中 main函数传参被修改成了UTF-8
        String str1=new String(bytes1);
        System.out.println(str1);
        }
      • 传递字节数组 String(byte[] bytes,char[] charsetName)使用指定字符集

        1
        2
        3
        4
        5
        String str1=new String(bytes1,"gbk");
        System.out.println(str1);//鏌�
        String str2=new String(bytes1,"utf8");
        //StandardCharsets.UTF_8 也可以使用定义好的常量进行传递
        System.out.println(str2);//查
      • 传递字节数组 String(byte[] bytes,int off,int len)

        off数组开始索引

        len数组中转的个数

        1
        2
        String str3=new String(bytes,1,1);
        System.out.println(str3);//b
      • 传递字符数组 String(char[] ch)和编码表无关

        1
        2
        3
        char []ch={'a','b','c','d','e'};
        String s1=new String(s);
        System.out.println(s);//abcde
      • 传递字节数组 String(char[] ch,int off,int len)

        1
        2
        3
        char []ch={'a','b','c','d','e'};
        String s2=new String(ch,1,3);
        System.out.println(s2);
    • String类的判断方法(计算结果为布尔类型)

      • boolean equals(Object obj)比较字符串是否相等,完全相等返回true

        String类继承Object,重写方法equals

        1
        2
        3
        4
        5
        public static void method1(){
        String s1="abc";
        String s2=new String("abc");
        System.out.println(s1.equals(s2));//true
        }
      • boolean equalsIgnoreCase(Object obj)比较字符串是否相等,忽略大小写,相等返回true

        1
        2
        3
        4
        5
        public static void method1(){
        String s1="Abc";
        String s2=new String("abC");
        System.out.println(s1.equalsIgnoreCase(s2));//true
        }
      • boolean isEmpty()判断字符串是否为空

        1
        2
        3
        4
        5
        6
        public static void method2(){
        String str1="";
        System.out.println(str1.isEmpty());//true
        String str2=" ";
        System.out.println(str2.isEmpty());//false
        }
      • boolean startWith()

        1
        2
        3
        4
        public static void method3(){
        String str="helloWorld,java";
        System.out.println(str.startsWith("hell"));//true
        }