Java学习笔记——Java语言基础(十一)(Object类、String类、StringBuffer类)

一、Object类

1.1 API

1.API(Application Programming Interface)应用程序编程接口
2.Java API:Java提供的可以直接使用的类,这些类将底层的实现封装起来。

1.2 Object

1.Object类:类层次结构的根类,所有类都直接或者间接的继承Object类
2.构造方法:public Object() 子类的构造方法默认访问的是父类的无参构造方法

1.3 Object的hashCode()方法

1.返回对象的哈希吗值,不同对象的hashCode()一般来说不会相同

1.4 Object类的getClass()方法

1.通过getClass()方法,获取对象的真实类的全名称

hashCode()和getClass()的代码如下:

public class Test03 {
    public static void main(String[] args) {
        //Object的hashCode()方法
        Object obj1 = new Object();
        System.out.println(obj1);//java.lang.Object@1540e19d
        int o1 = obj1.hashCode();
        System.out.println(o1);//356573597
        Object obj2 = new Object();
        System.out.println(obj2);//java.lang.Object@677327b6
        int o2 = obj2.hashCode();
        System.out.println(o2);//1735600054

        //Object的getClass()方法
        Object obj3 = new Object();
        System.out.println(obj3);//java.lang.Object@14ae5a5
        Object obj4 = new Object();
        System.out.println(obj4);//java.lang.Object@7f31245a
        //比较地址值
        System.out.println(obj3==obj4);//false
        Class C3 = obj3.getClass();
        Class C4 = obj4.getClass();
        //比较类名
        System.out.println(C3);//class java.lang.Object
        System.out.println(C4);//class java.lang.Object
        System.out.println(C3==C4);//true
    }
}
1.5 Object类的toString()方法

1.返回该对象的字符串

public class Test04 {
    public static void main(String[] args) {
        Object obj = new Object();
        String s = obj.toString();
        //打印地址值
        System.out.println(s);//java.lang.Object@1540e19d
        /*没有重写toString方法
        Student student1 = new Student();
        String s1 = student1.toString();
        System.out.println(s1);//day11.Student@677327b6
        */
        //重写toString方法
        Student student = new Student("张三", 23);
        String s1 = student.toString();
        System.out.println(s1);//Student{name='张三', age=23}
    }
}
class Student{
    String name;
    int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //重写toString方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
1.6 Object类的equals()方法

1.指示其他某个对象是否与调用方法的对象相等
2.默认情况下比较的是对象的引用是否相同
3.由于比较引用没有意义,一般建议重写equal()方法。

public class Test05 {
    public static void main(String[] args) {
        //Object类的equals方法
        Object obj1 = new Object();
        Object obj2 = new Object();
        System.out.println(obj1.equals(obj2));//false
        System.out.println(obj1==obj2);//fasle
        //Student1重写equals方法
        Student1 s1 = new Student1("张三", 23);
        Student1 s2 = new Student1("张三", 24);
        Student1 s3 = new Student1("张三", 23);
        boolean b1 = s1.equals(s2);
        boolean b2 = s1.equals(s3);
        System.out.println(b1);//false
        System.out.println(b2);//true
    }
}
class Student1{
    String name;
    int age;

    public Student1() {
    }

    public Student1(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //重写eauals方法,比较的是Student里面的成员变量是否相等
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student1 student1 = (Student1) o;
        return age == student1.age &&
                Objects.equals(name, student1.name);
    }
}
1.7 Object类的clone()方法

1.clone()的权限修饰符是受保护的,在用的时候,让该类重写该方法,并把该方法的权限修饰符改为public
2.对象的浅克隆:浅克隆和深克隆,使用clone方法的克隆为浅克隆
3.如果一个对象需要调用clone方法进行克隆,那么该对象所属的类必须实现Cloneable接口。
4.Cloneable接口并没有任何的抽象方法,这种没有任何抽象的接口时一种标记接口

public class Test01 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student s1 = new Student("学生A", 23);
        System.out.println(s1);//Student{name='学生', age=23}
        //克隆一个Object类
        //CloneNotSupportedException抛出异常
        Object obj = s1.clone();
        //向下转型
        Student s2= (Student) obj;
        s2.age=30;
        s2.name="学生B";
        System.out.println(s2);//Student{name='学生B', age=30}
    }
}
class Student implements Cloneable{
    String name;
    int age;
    //重写toString方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

当一个方法的参数包含引用类型的时候,clone方法的使用如下:

public class Test02 {
    public static void main(String[] args) throws CloneNotSupportedException {
        DogFood dogfood = new DogFood("骨头");
        Dog dog1 = new Dog("一号狗", 3, dogfood);
        dog1.dogFood.name="火腿";
        System.out.println(dog1.dogFood.name);//火腿
        //克隆Dog的dog1对象
        Dog dog2 = (Dog) dog1.clone();
        dog2.dogFood.name="狗粮";
        System.out.println(dog2.dogFood.name);//狗粮
        System.out.println(dog1.dogFood.name);//狗粮
    }
}
class DogFood{
    String name;
    public DogFood(String name){
        this.name=name;
    }
}
class Dog implements Cloneable {
    String name;
    int age;
    DogFood dogFood;

    public Dog(String name, int age, DogFood dogFood) {
        this.name = name;
        this.age = age;
        this.dogFood = dogFood;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

内存图
在这里插入图片描述

二、String类

1.概述:字符串是由多个字符组成的一串数据,可以看成是一个字符数组
2.字符串字面值“abcde”也可以看成是一个字符串对象
3.字符串是常量,一旦被创建,就不能被改变

2.1 String类的构造方法
1.public String():空构造
2.public String(String original):把字符串常量值转成字符串
3.public String(byte[] bytes):把字节数组转成字符串
4.public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串(index:表示的是从第几个索引开始, length表示的是长度)
5.public String(char[] value):把字符数组转成字符串
6.public String(char[] value,int index,int count):把字符数组的一部分转成字符串

代码演示String的构造方法

public class Test01 {
    public static void main(String[] args) {
        //String的构造方法
        //1.String() 创建一个空的字符串
        String s = new String();
        System.out.println(s.toString());
        //2.string() 传入一个字符串
        String s1 = new String("abc");
        //输出内容是字符串的内容,String类重写了toString方法
        System.out.println(s1.toString());//abc

        //3.public String(byte[] bytes):把字节数组转成字符串
        byte[] bytes = {68, 69, 70, 71, 72, 73};
        String s2 = new String(bytes);
        System.out.println(s2.toString());//DEFGHI

        //4.public String(byte[] bytes,int index,int length)
        //转换一部分的字节数组,第二个参数是起始索引,第三个参数是长度
        String s3 = new String(bytes, 2, 2);
        System.out.println(s3.toString());//FG

        //5.把一个字符数组转换成字符串
        char[] chars={'a','b','c','字','符','数','组'};
        String s4 = new String(chars);
        System.out.println(s4.toString());//abc字符数组

        //6.把一个字符数组的一部分转换成字符串
        //第二个参数是起始索引,第三个参数是长度
        String s5 = new String(chars, 2, 4);
        System.out.println(s5.toString());//c字符数
    }
}
2.2 String类的特点

1.字符串一旦被创建就不能被改变,字符串的值是在方法区的常量池中划分空间,分配地址值
2.字符串的字面值可以作为String类的实例实现

public class Test02 {
    public static void main(String[] args) {
        //字符串字面值可以作为实例实现
        System.out.println("abcdefg".length());//7
        System.out.println("abcdefg".toString());//abcdefg
        //字符串的字面值不能被改变,修改的是字符串的指向
        String s="aaa";
        s="bbb"+"ccc";
        System.out.println(s);//bbbccc

        //定义字符串的两种方式
        String s1 = new String("hello");
        String s2="hello";
        //地址值的比较
        System.out.println(s1==s2);//false
        //String类重写了Object类的equals方法,比较的是字符串的字面内容
        System.out.println(s1.equals(s2));//true
    }
}

**补充:**字符串一旦被创建就不能被改变,字符串是常量,它们的值在创建之后就不能更改,每个字符串的创建都在字符串池中分配一个地址值,字符串根据地址值的指向不同的字符串。
“=="是一个比较运算符,可以比较基本类型,也可以比较引用类型。
比较基本类型,比较的是两个值是否相等。引用类型则是比较两个地址值是否相等
“equlas‘’方法只能比较引用类型,如果一个类没有重写Object类的equals()方法,则会比较地址值。根据不同的类决定是否需要去重写该方法
两种字符串创建方式的内存图:
在这里插入图片描述

2.3 String类的判断
String类的判断功能
        public boolean equals (Object obj):比较字符串的内容是否相同, 区分大小写
        public boolean equalsIgnoreCase (String str):比较字符串的内容是否相同, 忽略大小写
        public boolean contains (String str):判断字符串中是否包含传递进来的字符串
        public boolean startsWith (String str):判断字符串是否以传递进来的字符串开头
        public boolean endsWith (String str):判断字符串是否以传递进来的字符串结尾
        public boolean isEmpty ():判断字符串的内容是否为空串 ""

代码实现:

public class Test03 {
    public static void main(String[] args) {
        //区分大小写的比较
        boolean b1 = "abcd".equals("ABCD");
        System.out.println(b1);//false
        //不区分大小写的比较
        boolean b2 = "abcd".equalsIgnoreCase("ABCD");
        System.out.println(b2);//true
        //判断字符串中是否包含传递进来的字符串
        boolean b3 = "Java学习".contains("学习");
        System.out.println(b3);//true
        //判断字符串是否以传递进来的字符串开头
        boolean b4 = "Java学习".startsWith("J");
        System.out.println(b4);//true
        //判断字符串是否以传递进来的字符串结尾
        boolean b5 = "Java学习".endsWith("习");
        System.out.println(b5);//true
        //判断字符串的内容是否为空串
        boolean b6 = "abcd".isEmpty();
        System.out.println(b6);//false
    }
}
2.4 String类的获取功能
1.String类的获取功能
		public int length ():获取字符串的长度。
        public char charAt ( int index):获取指定索引位置的字符
        public int indexOf ( int ch):返回指定字符在此字符串中第一次出现处的索引。
        public int indexOf (String str):返回指定字符串在此字符串中第一次出现处的索引。
        public int indexOf ( int ch, int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
        public int indexOf (String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
        public String substring ( int start):从指定位置开始截取字符串, 默认到末尾。
        public String substring ( int start, int end):从指定位置开始到指定位置结束截取字符串

代码实现

public class Test04 {
    public static void main(String[] args) {
        //获取字符串的长度
        System.out.println("abcdefg".length());//7
        //获取指定索引位置的字符
        System.out.println("abcdefg".charAt(4));//e
        //返回指定字符在此字符串中第一次出现处的索引
        String s="abcdeabcde";
        System.out.println(s.indexOf("d"));//3
        //返回指定字符在此字符串中从指定位置后第一次出现处的索引
        //从索引为3的开始,查找第一次出现c的索引(字符)
        System.out.println(s.indexOf('c', 3));//7
        //返回指定字符串在此字符串中从指定位置后第一次出现处的索引(字符串)
        System.out.println(s.indexOf("de", 3));//3
        //从指定位置开始截取字符串, 默认到末尾
        System.out.println(s.substring(3));//deabcde
        //从指定位置开始到指定位置结束截取字符串
        System.out.println(s.substring(3, 5));//de
    }
}

练习:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数

import java.util.Scanner;
public class Test01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String s = sc.nextLine();
        int uppercaseLetter = 0;
        int lowerCaseLetters = 0;
        int number = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= 'a' && c <= 'z') {
                lowerCaseLetters++;
            } else if (c >= 'A' && c <= 'Z') {
                uppercaseLetter++;
            } else if (c >= '0' && c <= '9') {
                number++;
            }
        }
        System.out.println("大写字母个数"+uppercaseLetter+"\n"+"小写字母个数"+lowerCaseLetters+"\n"+"数字个数"+number);
    }
}
2.5 String类的转换功能
String的转换功能:
	public byte[] getBytes():						把字符串转换为字节数组。
	public char[] toCharArray():					把字符串转换为字符数组。
	public static String valueOf( ):				String类的valueOf方法可以把任意类型的数据转成字符串
	public String toLowerCase():					把字符串转成小写。
	public String toUpperCase():					把字符串转成大写。
	public String concat(String str):		  	    把字符串拼接。
import java.util.Arrays;
public class Test02 {
    public static void main(String[] args) {
        //字符串转换为字节数组
        byte[] bytes = "ABCD".getBytes();
        for (int i = 0; i < bytes.length; i++) {
            System.out.print(bytes[i]+" ");//65 66 67 68
        }
        //字节数组转换为字符串
        String s = new String(bytes);
        System.out.println(s);//ABCD
        //字符串为中文是,转换字节数组 UTF-8中 一个汉字占三个字节 GBK中 一个汉字占两个字节
        byte[] bytes1 = "中国".getBytes();//6
        System.out.println(bytes1.length);
        for (int i = 0; i < bytes1.length; i++) {
            System.out.print(bytes1[i]+" ");//-28 -72 -83 -27 -101 -67
        }

        //把字符串转换为字符数组
        char[] chars = "ABCD".toCharArray();
        System.out.println(Arrays.toString(chars));//[A, B, C, D]

        //静态方法valueOf() 可以把基本类型,以及字符数组,对象转换成字符串
        //int类型转换为String类型
        String s1 = String.valueOf(200);
        System.out.println(s1);//200
        char[] chars1={'a','b','c','d'};
        String s2 = String.valueOf(chars1);
        System.out.println(s2);//abcd
        //把小写转换成大写
        String s3 = s2.toUpperCase();
        System.out.println(s3);//ABCD
        //把大写转换成小写
        String s4 = s3.toLowerCase();
        System.out.println(s4);//abcd
        //concat()可以代替加号拼接字符串
        String s5 = s4.concat(s3);
        System.out.println(s5);//abcdABCD
        String concat = s1.concat(s2).concat(s3.concat(s4));
        System.out.println(concat);//200abcdABCDabcd
    }
}
2.6 String类的其他功能
1.String的替换功能
					public String replace(char old,char new)			将指定字符进行互换
					public String replace(String old,String new)		将指定字符串进行互换
2.String的去除字符串两空格
					public String trim()
3.String的按字典顺序比较两个字符串
					public int compareTo(String str)
					public int compareToIgnoreCase(String str)
public class Test03 {
    public static void main(String[] args) {
        String s1="abcdabcdabcdabcd";
        //替换单个字符
        System.out.println(s1.replace('a', 'A'));//AbcdAbcdAbcdAbcd
        //替换一个字符串
        System.out.println(s1.replace("bcd", "BCD"));//aBCDaBCDaBCDaBCD
        //去除字符串两空格
        String s2="  abcdabcdabcd   ";
        System.out.println(s2.trim());//abcdabcdabcd
        //比较两个字符串 默认按照 字典顺序来比较,返回的是字符的码表中的差值
        //当字典顺序比不出来的时候,按照长度去比较
        int i = "a".compareTo("A");
        System.out.println(i);//32
        int i1 = "a".compareToIgnoreCase("A");
        //忽略大小写的比较
        System.out.println(i1);//0
    }
}

三、StringBuffer

1.字符串是常量,一旦定义不能被改变,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。
2.StringBuffer是一个长度可变的字符容器,如果需要大量的拼接字符串,可以使用长度可变的字符容器

3.1 StringBuffer类的方法
StringBuffer的构造方法:
		public StringBuffer():   			  无参构造方法
		public StringBuffer(int capacity):    指定容量的字符串缓冲区对象
		public StringBuffer(String str):      指定字符串内容的字符串缓冲区对象
StringBuffer的方法:
		public int capacity():					返回当前容量。
		public int length():					返回长度(字符数)
StringBuffer的添加功能:
		public StringBuffer append(String str):  可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
		public StringBuffer insert(int offset,String str): 在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
public class Test01 {
    public static void main(String[] args) {
        //无参构造字符串缓冲区 初始容量是16个字符
        StringBuffer stringBuffer1 = new StringBuffer();
        //指定容量的字符串缓冲区对象
        StringBuffer stringBuffer2 = new StringBuffer(100);
        //指定字符串内容的字符串缓冲区对象
        StringBuffer stringBuffer3 = new StringBuffer("abcd");
        //往容器中追加数据,返回的还是容器本身
        StringBuffer stringBuffer4 = stringBuffer1.append("abcd");
        StringBuffer stringBuffer5 = stringBuffer4.append("ABCD").append("abcd");
        //获取容器中数据的实际长度
        System.out.println(stringBuffer5.length());//12
        //获取容器中容量
        System.out.println(stringBuffer5.capacity());
        //stringBuffer5重写了toString方法 将容器内的数据转换成字符串
        System.out.println(stringBuffer5.toString());//abcdABCDabcd
        //在指定的位置加入数据,返回的还是字符串缓冲区本身
        StringBuffer stringBuffer6 = stringBuffer5.insert(5, "Z");
        System.out.println(stringBuffer6);//abcdAZBCDabcd
        //比较两个 StringBuffer对象的地址值
        System.out.println(stringBuffer5==stringBuffer6);//true
    }
}
3.2 StringBuffer类的删除、替换、反转、截取方法
StringBuffer的删除功能
		public StringBuffer deleteCharAt(int index):					删除指定位置的字符,并返回本身
		public StringBuffer delete(int start,int end):					删除从指定位置开始指定位置结束的内容,并返回本身
StringBuffer的替换功能
		public StringBuffer replace(int start,int end,String str)		从start开始到end用str替换
StringBuffer的反转功能
		public StringBuffer reverse():									字符串反转
StringBuffer的截取功能
		public String substring(int start): 							从指定位置截取到末尾
		public String substring(int start,int end):						截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
public class Test02 {
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer("aabcd");
        System.out.println(stringBuffer);//aabcd
        //删除指定索引的单个字符
        System.out.println(stringBuffer.deleteCharAt(1));//abcd
        //删除从指定位置开始指定位置结束的内容
        System.out.println(stringBuffer.delete(1, 2));//acd
        //反转容器中的数据,返回的还是容器本身
        System.out.println(stringBuffer.reverse());//dca

        //根据首尾索引,去替换容器中的一段内容 第一个参数起始位置 第二个位数  返回的还是容器本身
        System.out.println(stringBuffer.replace(1, 1, "ABCD"));//aABCDcd
        根据首尾索引,截取一部分内容,以字符串形式返回
        System.out.println(stringBuffer.substring(2).toString());//BCDca
        System.out.println(stringBuffer.substring(1, 5).toString());//ABCD
    }
}
3.2 StringBuffer和String的相互转换
public class Test03 {
    public static void main(String[] args) {
        //String-- StringBuffer
        String str="abcd";
        //构造方法
        StringBuffer stringBuffer1 = new StringBuffer(str);
        //append方法
        StringBuffer stringBuffer2 = new StringBuffer().append(str);

        //StringBuffer---String
        //subString方法
        String string1 = stringBuffer1.substring(0);
        //toString方法
        String string2 = stringBuffer1.toString();
        //构造方法
        String string3 = new String(stringBuffer1);
    }
}

3.3 String和StringBuffer分别作为参数传递

1.形式参数:String作为参数传递 String虽然是引用类型,但是它是一个常量,所以在做传递的时候,完全可以将其看成基本数据类型数据进行传递

public class Test04 {
    public static void main(String[] args) {
        String string = new String("abcdefg");
        StringBuffer stringBuffer = new StringBuffer("努力学习");
        test(string);//
        //String 类型作为参数传递,是值传递
        System.out.println(string);//abcdefg
        //作为参数传递(引用传递,传的是地址值)形参的改变会影响实参
        test(stringBuffer);
        System.out.println(stringBuffer);//习学力努
    }

    private static void test(StringBuffer stringBuffer) {
        System.out.println(stringBuffer.reverse());//习学力努
    }

    private static void test(String string) {
        String s = string.substring(3);
        System.out.println(s);//defg
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值