Java基础之Object类、String类

本文详细介绍了Java的基础概念,包括Object类的常用方法,如equals、hashCode、toString等;讲解了Scanner类用于控制台输入,以及String类的重要特性,如构造方法、比较、转换和操作方法。
摘要由CSDN通过智能技术生成

Java基础

1.Object类

import java.util.Objects;

public class Object01 {
    public static void main(String[] args) throws CloneNotSupportedException{

        /*
            TODO 方法:
                 clone() => 创建并返回此对象的副本 (浅拷贝)
                 equals => 判断两个对象是否相等
                      equals 默认底层使用 == 对两个对象地址进行判断,如果地址相同,那么结果为true
                 hashCode() => 返回对象的Hash值,该函数是一个映射函数  传入一个值,肯定有一个唯一对应的随机的值
                 toString() => 用于将当前对象转换成一个字符串
                 getClass() => 获取当前对象的类路径
         */
        Object object = new Object();
        String objStr = object.toString();
        System.out.println(objStr); // java.lang.Object@4554617c
        System.out.println(object); // java.lang.Object@4554617c  println就是调用了 toString 方法

        String str = new String("这是一个字符串");
        System.out.println(str.toString());  // 子类可以重写toString 方法

        MyClass myClass1 = new MyClass("toString", "这是一个自定义类");
        MyClass myClass2 = new MyClass("toString", "这是一个自定义类");
        System.out.println(myClass1);
        System.out.println(myClass1.equals(myClass2)); // true




        // TODO 在Java中Class也是一个类 该类的对象表示 类对象
        Class aClass = myClass1.getClass();
        System.out.println(aClass.getName().toString()); // 获取当前对象的类路径
        //结果: com.shujia.Day07_Object_StringFunction_WrapClass.MyClass


    }
}

/*
    对于一个自定义类,如果该类用于表述数据 那么其规范的写法:
        比如对于 Mysql中的emp表 每一行数据代表是一个员工类 员工的字段是类中的属性
 */
class MyClass{
    private String name;
    private String data;

    public MyClass(String name, String data) {
        this.name = name;
        this.data = data;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    //equals()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyClass myClass = (MyClass) o;
        return Objects.equals(name, myClass.name) && Objects.equals(data, myClass.data);
    }

    
    //重写hashCode()方法
    @Override
    public int hashCode() {
        return Objects.hash(name, data);
    }
    /*
       TODO  对于外部获取当前类对象的信息时,一般会调用toString方法
            对于继承的toString方法 不能获取其属性信息  所以需要对其进行重写
     */

    @Override
    public String toString() {
        return "MyClass{" +
                "name='" + name + '\'' +
                ", data='" + data + '\'' +
                '}';
    }
    
}

2.Scanner类

import java.io.InputStream;
import java.util.Scanner;

public class ScannerClass {
    public static void main(String[] args) {
        /*
            TODO Scanner类
         */
        /*
            TODO 想要从控制台获取数据 => System.in
                 in 是 System中的一个属性 类别为 InputStream 称为输入流

         */
        InputStream inputStream = System.in;
        Scanner scanner = new Scanner(inputStream);
        /*
        TODO
            next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、
              Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,
            next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
            nextLine()方法的结束符只是Enter键,
              即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
         */

//        String next = scanner.next();
        String next = scanner.nextLine();
        System.out.println(next+"|");

    }
}

3.String类

public class StringClass {
    public static void main(String[] args) {
        /*
            TODO String类
         */
        String str1 = "String";
        String str2 = "String";
        String newStr = new String("String");
        System.out.println(str1 == str2); // true  => 内存地址一样
        System.out.println(str1 == newStr); // false  => == 用于判断内存地址是否相同 内存地址不一样
        System.out.println(str1.equals(newStr)); // true  => equals是比较具体的数据(String类中的equals()方法经过了重写,判断值是否相等)

        String str3 = "1+1=2";
        String str4 = "1+1=";
        String str5 = "2";
        String str6 = str4 + str5;  // 通过 + 的方式得到的结果,会在堆空间中保存数据
        System.out.println(str3 == str6);  // false str3会存放到栈空间中


    }
}

4.String方法01

public class StringFunction01 {
    public static void main(String[] args) {
        /*
            TODO String类的方法
                1.构造方法
                    new String(char[] chars)
                    new String(byte[] bytes)
                2.判断功能
                    boolean equals(Object obj)  等值判断  // 非常重要
                    boolean equalsIgnoreCase(String str)  // 忽略大小写比较字符串
                    boolean contains(String str) // 是否包含某个子字符串
                    boolean startsWith(String str)  // 判断是否以某个子字符串为开头
                    boolean endsWith(String str) // 判断是否以某个子字符串为结尾
                    boolean isEmpty() //判断字符串是否为空
               3.String类的获取功能
                    int length() => 获取字符长度 // 非常重要
                    char charAt(int index) => 根据下标获取其对应下标位置上的数据 => 因为字符串可以看成是char类型的数组
                    int indexOf(int ch)   indexOf是用于返回其传入 参数(注意参数列表) 在字符串中的下标
                    int indexOf(String str)
                    int indexOf(int ch,int fromIndex)
                    int indexOf(String str,int fromIndex)  fromIndex 表示从某个下标开始寻找
                    String substring(int start)  // 非常重要  从某个开始下标截取字符串直到末尾
                    String substring(int start,int end) // 非常重要 从某个开始下标截取字符串直到结束下标 截取区间为左闭右开区间

         */
        char[] chars = {'a','b','c','d'};
        String char2Str = new String(chars);
        System.out.println(char2Str); // print()方法内部调用了toString()方法,因此可以这样输出

        // TODO 对于字符串来说 认为byte[]中保存的数据是字节数据,在创建对象时,会根据其ASC码值将其转换成对应的字符
        byte[] bytes = {97,98,99};
        System.out.println(new String(bytes));  // abc


        String str = "ABCD";
        System.out.println(char2Str.equalsIgnoreCase(str));  // true

        System.out.println(char2Str.contains("a")); // true

        System.out.println(str.startsWith("AB")); // true

        System.out.println(str.endsWith("CD")); // true

        System.out.println(str.isEmpty()); //

        // 对字符串赋予 null 值之后,使得其指向的内地址消失 所以调用时会出现空指针异常
//        String nullStr = null;
        //注:null与""是两个概念,isEmpty()输出不同
        String emptyStr = "";
//        System.out.println(nullStr.isEmpty()); // java.lang.NullPointerException
        System.out.println(emptyStr.isEmpty()); // true

        System.out.println(str.length()); // 4
        System.out.println(str.charAt(0));

        System.out.println(str.indexOf("BC")); // 1 返回的是第一个字符的下标

        String str2 = "ABCDABCD";
        System.out.println(str2.indexOf("BC",2)); // 5 从第二个字符开始查找,并返回下标

        System.out.println(str2.substring(2)); // CDABCD
        System.out.println(str2.substring(2,6));  // CDAB

    }
}

5.String方法02

import java.util.Arrays;

public class Demo05StringFunction2 {
    public static void main(String[] args) {
        /*
            TODO 字符串方法
                转换功能
                byte[] getBytes()  (若无参数)表示使用平台的默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
                char[] toCharArray() 将字符串中的字符转换为字符数组
                static String valueOf(char[] chs) 将 char 数组 data 转换成字符串
                static String valueOf(int i) 将 int 变量 i 转换成字符串
                String toLowerCase() 将字符串中字符转换成大写
                String toUpperCase() 将字符串中字符转换成小写
                String concat(String str) 用于将指定的字符串参数连接到字符串上
         */

        String str = "abcd";
        byte[] bytes = str.getBytes();
        System.out.println(Arrays.toString(bytes)); // [97, 98, 99, 100]

        /*TODO
            注:对于一个中文默认占用三个字节数据
         */
        String str2 = "字符串"; // => [-27, -83, -105, -25, -84, -90, -28, -72, -78]
        System.out.println(Arrays.toString(str2.getBytes()));

        /*TODO
            注:对于一个中文默认占用一个字符数据
        */
        char[] chars = str2.toCharArray();
        System.out.println(Arrays.toString(chars));
        System.out.println(str.toCharArray());

        char[] chars2 = {'数','组'};
        /* TODO:
            String.valueOf(char[] data) : 将 char 数组 data 转换成字符串
            String.valueOf(char[] data, int offset, int count) :
            将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串
         */
        String char2Str = String.valueOf(chars2);
        System.out.println(char2Str);

        System.out.println(str.toUpperCase());
        System.out.println(str.toUpperCase().toLowerCase());

        // 如何将hello转换成Hello
        String hello = "helLo"; // => Hello
        String takeStr = hello.substring(1).toLowerCase();
//        String headStr = hello.substring(0, 1).toUpperCase();
        String headStr = String.valueOf(hello.charAt(0)).toUpperCase();
        System.out.println(headStr+takeStr);

        String str3 = "head";
        String str4 = "tail";
        System.out.println(str3+","+str4);
        System.out.println(str3.concat(",").concat(str4));


    }
}

6.String方法03

package com.shujia.Day07_Object_StringFunction_WrapClass;

import java.util.Arrays;

public class Demo06StringFunction3 {
    public static void main(String[] args) {
        /*
          TODO  String类的其他功能
                String replace(char old,char new)
                String replace(String old,String new) // 非常重要
                String trim()  去除前后空格信息
                字典顺序比较:(字典顺序指的是ASCII码表中的字符顺序。ASCII表中每个字符都有对应的下标,从0开始升序排列,共128个字符。)
                int compareTo(String str):
                  用字符串1跟字符串2作比较(字符串1.compareTo(字符串2)),如果字符串1的字典顺序在字符串2前面,
                   则返回一个正数。若在后面,则返回一个负数。若两个字符串的字典顺序相同,则返回0。
                   特殊案例:
                   String str1 = "ljj";
                   String str2 = "ljjLovexql";
                   System.out.println(str1.compareTo(str2));
                   以上代码运行结果为 -7,str1比str2少7个字符,所以返回 -7
                int compareToIgnoreCase(String str) 方法用于按字典顺序比较两个字符串,不考虑大小写
                注意:对于String中修改数据的函数,不会对String本身进行修改,会返回一个新的String对象
         */
        String str = "123 456";
        System.out.println(str.replace(" ", ","));
        System.out.println(str);

        String str1 = "  今天天气真好呀  \t";
        System.out.println(str1);
        System.out.println(str1.trim()+"|");

        // 对于数值数据进行排序时,是按照自然排序方式
        int[] ints = {11,10,100};
        Arrays.sort(ints);
        System.out.println(Arrays.toString(ints));  // [10, 11, 100]

        // 对于字符串类型数据进行比较时,是按照字典顺序进行比较的
        String strArr[] = {"11","10","100"};
        Arrays.sort(strArr);
        System.out.println(Arrays.toString(strArr)); // [10, 100, 11]

        String intStr1 = "11";
        String intStr2 = "100";
        int compareToRes = intStr1.compareTo(intStr2);  // 1
        System.out.println(compareToRes);



        /*
            value?
            private final char value[];  => 11
            value = ['1','1']

            public int compareTo(String anotherString) {
                int len1 = value.length;  ['1','1'] => 2
                int len2 = anotherString.value.length; ['1','0','0'] => 3
                int lim = Math.min(len1, len2); // 取长度最小值 2
                char v1[] = value;  ['1','1']
                char v2[] = anotherString.value; ['1','0','0']

                int k = 0; // 下标
                while (k < lim) {
                    // 取出对应下标中的字符
                    char c1 = v1[k];
                    char c2 = v2[k];
                    // k=1 => c1=1,c2=0
                    if (c1 != c2) {
                        // 将两个char类型的数据通过ASC码值进行比较 返回其差值
                        // c1表示当前字符串  c2表示传入比较的字符串
                        return c1 - c2;
                    }
                    k++;
                }
                return len1 - len2;
            }
         */

        //实现字符串abc的逆序输出
        String str4 = "abc";
        String res = "";
        char[] chars = str4.toCharArray();
        for (int i = chars.length-1; i >= 0 ; i--) {
            res += chars[i];
        }
        System.out.println(res);



        //从下方字符串中匹配”java“的数量
        String javaStr = "oaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
         //TODO 法一:
        //        int num = 0;
    //        for (int i = 0; i < javaStr.length(); i++) {
    //            if (i + 4 < javaStr.length()){
    //                String substring = javaStr.substring(i, i + 4);
    //                if (substring.equals("java")) {
    //                    num ++;
    //                }
    //            }
    //        }
    //        System.out.println("num:"+num);

        int num = 0;
        // TODO 法二:
       //        while (javaStr.contains("java")){
//            返回下标
//            int javaStartIndex = javaStr.indexOf("java");
//            进行javaStartIndex+4,越过此次找到的“java”来进行下一次的查找
//            javaStr = javaStr.substring(javaStartIndex+4);
//            num ++;
       //        }
       //        System.out.println("num:"+num);

        // TODO 法三(相对于法二进行了优化): indexOf当获取不到值对应返回结果为 -1
        //        javaStr = "hello";
        //        System.out.println(javaStr.indexOf("java"));

        int javaStartIndex = 0;
        while ((javaStartIndex = javaStr.indexOf("java")) != -1){
            javaStr = javaStr.substring(javaStartIndex+4);
            num ++;
        }
        System.out.println("num:"+num);

        // 当前String类型的字符长度是不可更改的 => 字符串底层做数据存储是 char[] 定义后长度不可发生变化
        String st = "a";
        String b = st.concat("b");
        System.out.println(b);


    }
}
  • 20
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值