常用类_Object和String类

常用类

一,Object类

1.1概述

    1.概述:所有类的顶级父类,所有的类都会直接或者间接的继承Object类
    2.注意:
      a.如果一个类明确写出了extends 父类,那么此类的亲爹就是extends后面的哪个父类
        public class A{}
        public class B extends A{}
      b.如果一个类没有明确写出extends 父类,那么此类的亲爹就是Object
        public class A{}   A的亲爹就是Object

      c.Object属于lang包,使用lang包下的对象,不需要导包

1.2Object类中的toString方法

快捷键:

1.按住ctrl,鼠标点击对应的类,方法等,会快速跳转到被调用的位置

2.按:alt+7,快速看当前类中的成员

  1. 按:ctrl+n,快速搜索要使用的类
1.Object类中的toString方法
  String toString()  返回该对象的字符串表示形式
    
  public String toString() {
     return getClass().getName() + "@" + Integer.toHexString(hashCode());
  }

2.结论:
  a.如果一个类没有重写Object类中的toString方法,直接输出对象名,默认调用了Object类中的toString方法,输出了地址值
  b.如果一个类中重写了Object类中的toString方法,再输出地址值,重写没意义,所以我们重写之后,需要返回对象的内容(属性值)

1.3Object类中的equals()方法

1.equals方法:比较两个对象是否相等
  public boolean equals(Object obj) {
    return (this == obj);
  }

  ==:针对于基本类型,比较的是值
     针对于引用类型,比较的是地址值
结论:
  1.如果对象中没有重写Object类中的equals方法,那么使用的equals,就是调用的Object中的,而Object类中的equals只比较地址值
  2.如果对象中重写了Object类中的equals方法,再比较地址值就没意义,所以我们重写equals方法之后,应该比较对象之间的内容
 /*
      工具类:Objects

      方法:equals

      作用:防空指针
     */

if (Objects.equals(s,"abc")){
        System.out.println("s的内容是abc");
    }

总结:

如果想直接输出对象名不是地址值,重写toString

如果两个对象比较不是比较地址值,重写equals

怎么重写:alt+insert

二,String类

1.String 介绍

1.概述:String 类代表字符串
2.特点:
  a.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现
    凡是带双引号的都是String类的对象
  b.字符串是常量,它们的值在创建之后不能更改
    String s = "hello"
    s+="world"
  c.字符串是不可变的,所以可以共享
    String s1 = "abc"
    String s2 = "abc"

2.String的实现原理

1.String的底层是一个数组,而且是一个被final修饰的数组
2.注意:
  jdk9之前:String底层数组为char数组->一个char占2个字节
  jdk9之后包括9:String底层数组为byte数组->一个byte占1个字节
  我们定义的字符串,都会自动装载到底层数组中
     String s = "abc"
     char[] value = {'a','b','c'}
private final char value[]; 

数组的前面修饰符为final,为最终的数据,数组一旦建立,数组的地址就被锁死(相当于是一个常量)

3.String的创建

String中的构造:
  String() -> 根据String的空参构造创建对象
  String(String original) -> 根据String的有参构造创建对象
  String(char[] value) -> 根据char数组创建String的对象
  String(byte[] bytes)-> 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String 
                         平台:操作系统  GBK
                             
  简化形式:
   String 变量名 = ""

扩展:

扩展构造:
  String(byte[] bytes, String charsetName) ->按照指定的字符集将byte数组转成String对象
         charsetName:指定字符集,不区分大小写
  String(byte[] bytes, int offset, int length) ->将byte数组中的一部分转成String
         bytes:要转的byte数组
         offset:代表从数组的哪个索引开始转
         length:转多少个
  String(char[] value, int offset, int count) ->将char数组中的一部分转成String
         value:要转的char数组
         offset:代表从数组的哪个索引开始转
         count:转多少个	

4.字符串拼接

4.1“+”

public class Test05 {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        String s4 = "hello"+"world";
        String s5 = s1+"world";
        String s6 = s1+s2;
        System.out.println(s3==s4);//true
        System.out.println(s3==s5);//false
        System.out.println(s5==s6);//false
    }
}

总结:

字符串拼接:

如果等号右边都是常量拼接,不会产生新的字符串对象

如果等号右边有变量参与,会new一个新的StringBuilder对象

4.2 str.concat()

String str="";
        for (int i = 0; i < 100000; i++) {
            String haha = str.concat("haha");
        }

4.3 StringBuilder()

1.概述:一个可变的字符序列
2.作用:主要是用于字符串拼接
3.既然可以直接用+做字符串拼接,那么为什么还要学StringBuilder呢?
  String拼接有个毛病:每次拼接都会产生一个新的串儿,一个串儿就是一个String对象,一个对象就在堆内存中开辟一个新的空间,如果要是拼接次数过多,会造成占用内存资源的问题
      
  StringBuilder拼接的好处:不会过多占用内存资源

4.StringBuilder特点:
  a.StringBuilder自带缓冲区,其缓冲区其实就是一个char数组,没有被final修饰,所以可变
  b.只要new StringBuilder,缓冲区就有了,拼接的字符串都会自动保存到缓冲区中,不会产生新的对象
  c.StringBuilder底层的缓冲区,是char数组,默认长度为16
  d.StringBuilder拼接字符串之后,如果长度超过了16,会自动扩容
  e.扩容怎么扩:底层源码->Arrays.copyOf->数组复制(创建一个新数组,将容量定位要扩充的容量,然后将新数组赋值给老数组) 
  f.扩容扩多少呢?-> 2倍+2
1.构造:
  StringBuilder()
  StringBuilder(String str)
      
public class Test01 {
    public static void main(String[] args) {
        //StringBuilder()
        StringBuilder sb1 = new StringBuilder();
        System.out.println(sb1);
        //StringBuilder(String str)
        StringBuilder sb2 = new StringBuilder("abc");
        System.out.println(sb2);
    }
}
  StringBuilder sb = new StringBuilder(str);
        for (int i = 0; i < 10; i++) {
            sb.append(11).append(22);
        }

常用方法:

  StringBuilder append(任意类型)->字符串拼接,返回的是StringBuilder自己
  StringBuilder reverse()->字符串翻转,返回的是StringBuilder自己
  String toString()-> 将StringBuilder对象转成String对象

4.4StringBuilder与StringBuffer()

  String str="";
        StringBuffer stringBuffer = new StringBuffer(str);
        System.out.println(stringBuffer.append(11));

String:
拼接字符串效率低,每拼接一次,都会产生一个新的字符串,耗费内存资源

StringBuilder和StringBuffer区别:

  1.相同点:用法一样,底层实现一样
  2.不同点:
    StringBuilder:  效率高,线程不安全
    StringBuffer: 效率低,线程安全

4.5几种方式的比较

首先,如果a为null 那么 concat方法会抛出空指针异常 而a+b会把b拼到null后面然后作为字符串输出
其次,concat只能对String操作,而+会把其他类型数据默默地转换为字符串(用toString)再拼接
最后,通常情况下concat会比+更快,但是在大量次数拼接时还是SB最快

从拼接字符串效率上来说:StringBuilder>StringBuffer>String

5.String的方法

判断方法

boolean equals(Object anObject) -> 比较两个字符串的内容 
boolean equalsIgnoreCase(String anotherString)-> 比较两个字符串的内容,忽略大小写
     

获取功能

public int length():返回 此字符串的长度
public String concat(String str):将指定的字符串拼接到老串的末尾
char charAt(int index)  :返回指定索引出的char值
int indexOf(String str)  :获取的是指定字符串在老串中第一次出现的索引位置
String substring(int beginIndex):返回一个子字符串,从beginIndex开始截取字符串到字符串末尾,老串不动

String substring(int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到endIndex截取字符串,  含beginIndex,不含endIndex 

转换功能

char[] toCharArray()  ->  将字符串转成char数组
byte[] getBytes()  -> 使用默认字符集,将字符串转成字节数组
String replace(CharSequence target, CharSequence replacement)  ->将与target匹配的字符串使用replacement字符串替换

扩展:
 byte[] getBytes(String charsetName)->按照指定的编码表将字符串转成byte数组

分割功能

String[] split(String regex):按照regex分割字符串,返回字符串数组

其他方法

boolean contains(CharSequence s)  -> 判断老串中是否包含指定的字符
boolean endsWith(String suffix)  -> 判断老串是否以指定的字符结尾
boolean startsWith(String s) -> 判断老串是否以指定的字符开头
String toLowerCase()  ->  将字符串字母转成小写
String toUpperCase()   -> 将字符串字符转成大写
String trim()  -> 去掉字符串两端空格,中间空格去不了
posted @ 2022-02-28 18:35  有空就一起吃饭吧  阅读(121)  评论(0编辑  收藏  举报