首页 > 编程语言 >java_day10_Object、Scanner、String

java_day10_Object、Scanner、String

时间:2024-10-07 22:23:27浏览次数:9  
标签:java String int Object System day10 println public out

1、Object类

java中所有的类默认都有一个共同的父类:Object

== 比较:
    1、比较的是两个基本数据类型的话,比较两个数值是否相等
    2、比较的是两个引用数据类型的话,比较的是两个对象的地址值是否相等

成员方法:
    int hashCode() 返回对象的哈希码值。 可以看作地址值的另外一种表现形式
    public final Class getClass() 返回此 Object的运行时类。 获取当前类的class文件对象, 一个类全局只有一个在方法区中
    public String toString()
        打印一个对象名,默认调用的是类中的toString()方法
        若我们自己没有编写该方法的话,默认使用父类Object类中的toString()
        而父类中默认的toString()打印是一个地址值
        我们今后打印一个对象名的时候,输出是地址值意义不大,我们今后更多的是想看一个对象中成员变量值的情况
        要想实现上面的输出成员变量值的话,重写toString()方法,这样调用的就是自己重写后的toString()
        自动生成即可

代码案例

class Student{
    String name;
    int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

public class ObjectDemo1 {
    public static void main(String[] args) {
//        Student s1 = new Student();
//        Student s2 = new Student();
//
//        System.out.println(s1.hashCode());
//        System.out.println(s2.hashCode());
//
//        System.out.println(s1==s2);
//
//        Class c1 = s1.getClass();
//        System.out.println(c1.getName());

        Student s1 = new Student("李刚", 18);
//        System.out.println(s1.hashCode());
//        System.out.println(s1.getClass().getName() );
//        System.out.println(s1.toString()); // com.shujia.day10.Student@4554617c
        //this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());

        System.out.println(s1.toString());
    }
}

public boolean equals(Object obj)
protected void finalize() 垃圾回收用的

equals()用法代码

import java.util.Objects;

class Student2{
    String name;
    int age;

    public Student2() {
    }

    public Student2(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student2 student2 = (Student2) o;
        return age == student2.age && Objects.equals(name, student2.name);
    }

}

public class ObjectDemo3 {
    public static void main(String[] args) {
        Student2 s1 = new Student2("李刚", 21);
        Student2 s2 = new Student2("李刚", 21);

        //默认情况下,若对象类中没有自己编写equals方法,默认使用的是父类中Object类中的equals方法
        //而父类中Object类中的equals方法底层调用的是==比较,若比较的是引用数据类型,比较的是地址值
        //而我们这里s1和s2接受的是不同两个对象的地址值,所以默认比较的结果是false
//        System.out.println(s1.equals(s2));
        //需求:当对象的姓名和年龄一样的时候,表示是同一个学生
        //比较的对象类中自己重写一个equals方法,自动生成即可
        System.out.println(s1.equals(s2));



    }
}
protected Object clone()

java中并不是所有的类都可以被克隆,只有授权的类的对象才可以使用克隆方法
我们通过阅读帮助文档后发现,若一个对象的类没有实现Cloneable接口的话,是不可以调用clone方法的
然后,我们再去看Cloneable接口的时候,发现该接口中没有任何抽象方法,今后像这样的接口称之为标记接口

克隆在IT行业中,称之为拷贝。
拷贝分为两种:
    1、浅拷贝
    2、深拷贝

面试题:Object类中的clone是浅拷贝还是深拷贝。答:是浅拷贝

代码案例

class Demo1 {
    int a = 10;


}

class Student3 implements Cloneable {
    String name;
    int age;
    Demo1 demo1;

    public Student3() {
    }

    public Student3(String name, int age, Demo1 demo1) {
        this.name = name;
        this.age = age;
        this.demo1 = demo1;
    }

    @Override
    public String toString() {
        return "Student3{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", demo1=" + demo1 +
                '}';
    }

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

public class ObjectDemo4 {
    public static void main(String[] args) throws Exception {
        Demo1 d1 = new Demo1();


        Student3 s1 = new Student3("刘亦菲", 36, d1);
        System.out.println("s1: " + s1);
        System.out.println(s1.hashCode());
//        Student3 s2 = new Student3("章若楠", 21);

        System.out.println("===========================================");
        //首先,如果此对象的类不实现接口Cloneable ,则抛出CloneNotSupportedException 。
//        Object o1 = s1.clone();
        Object o1 = s1.clone();
        System.out.println("o1: " + o1);
        System.out.println(o1.hashCode());


    }
}

二、Scanner类

Scanner: 一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。

构造方法:
    Scanner(InputStream source) 构造一个新的 Scanner ,产生从指定输入流扫描的值。

代码案例

import java.util.Scanner;


public class ScannerDemo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //获取一个数字:
//        int i = sc.nextInt();
//        System.out.println(i);
//
//        String s1 = sc.next();
//        System.out.println(s1);

        //获取数字的时候,我们是不是只能够输入数字呢?
//        System.out.println("请输入一个数字:");
        //hasNextXxx()判断下一个输入的内容是否是指定类型
//        if(sc.hasNextInt()){
//            int i = sc.nextInt();
//            System.out.println(i);
//        }else {
//            System.out.println("您输入的内容不是一个int类型的值!");
//        }

//        int i = sc.nextInt();
//        System.out.println(i);
        String s1 = sc.next(); //无法接收换行等空白特殊字符
        System.out.println(s1);
        //输入字符串的另外一种方法
//        String s1 = sc.nextLine(); //可以接收换行等空白特殊字符
//        System.out.println(s1);


        System.out.println("hello world");
    }
}

3、String类

字符串:由若干个字符构成的字符序列叫做字符串
    String类代表字符串。
    Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。
    字符串不变; 它们的值在创建后不能被更改指的是字符串本身不能改
    因为String对象是不可变的,它们可以被共享。
    字符串可以被看作成一个字符数组

String类中的构造方法:

    public String()
    public String(byte[] bytes)
    public String(byte[] bytes,int offset,int length)
    public String(char[] value)
    public String(char[] value,int offset,int count)
    public String(String original)

代码案例

public class StringDemo2 {
    public static void main(String[] args) {
        //public String() 创建一个空字符串
        String s1 = new String(); // 堆内存
        System.out.println("s1: " + s1);

//        String s2 = ""; // 常量池
//        System.out.println(s1==s2);
        System.out.println("=============================");

        //public String(byte[] bytes) 将字节数组转成一个字符串
        byte[] bytes = {97,98,99,100,101,102};
        String s2 = new String(bytes);
        System.out.println("s2: "+s2);

        System.out.println("=============================");
        //public String(byte[] bytes,int index,int length) 从字节数组的某个位置开始,向后截取变成字符串
        String s3 = new String(bytes, 2, 3);
        System.out.println("s3: "+s3);
        System.out.println("=============================");
        //public String(char[] value)  //将一个字符数组转成一个字符串
        char[] chars = {'我','爱','中','华'};
        String s4 = new String(chars);
        System.out.println("s4: "+s4);
        System.out.println("=============================");
        //public String(char[] value,int index,int length) 将字符数组一部分转成字符串
        String s5 = new String(chars,1,2);
        System.out.println("s5: "+s5);
        System.out.println("=============================");
        //public String(String original) 将字符串封装成一个String对象在堆内存中
        String s6 = new String("你好");
        System.out.println("s6: "+s6);
    }
}

String类中的判断功能

String类中的判断功能:
    boolean equals(Object obj)
    boolean equalsIgnoreCase(String str)
    boolean contains(String str)
    boolean startsWith(String str)
    boolean endsWith(String str)
    boolean isEmpty()

代码案例

public class StringDemo4 {
    public static void main(String[] args) {
        //boolean equals(Object obj) 比较两个字符串的内容值
        String s1 = "hello";
        String s2 = "HellO";
        System.out.println(s1.equals(s2));
        //boolean equalsIgnoreCase(String str) 忽略大小写比较字符串内容值
        System.out.println(s1.equalsIgnoreCase(s2));
        //boolean contains(String str)  判断大字符串中是否包含某一个小字符串
        String s3 = "今天的天气还可以李刚决定去洗个脚";
        System.out.println(s3.contains("李刚决"));
        //boolean startsWith(String str) 判断字符串是否以某个字符串开头
        System.out.println(s3.startsWith("今天的天气数可以"));
        // boolean endsWith(String str) 判断字符串是否以某个字符串结尾
        System.out.println(s3.endsWith("洗个脚"));
        //boolean isEmpty() 判断字符串是否为空字符串,指的是内容是否为空
        String s4 = "";
        System.out.println(s4.isEmpty());
        String s5 = null;
//        System.out.println(s5.isEmpty()); // NullPointerException


    }
}

String类中的获取功能

String类中的获取功能:
int length()
char charAt(int index)
int indexOf(int ch)
int indexOf(String str)
int indexOf(int ch,int fromIndex)
int indexOf(String str,int fromIndex)
String substring(int start)
String substring(int start,int end)

代码案例

public class StringDemo5 {
    public static void main(String[] args) {
        String s = "李刚在数加学院中学习非常快乐!";
        //int length() 获取字符串中的字符个数,字符串长度
        System.out.println(s.length());

        //char charAt(int index) 根据索引获取字符串中某一个字符
        //字符串可以被看作成一个字符数组
//        System.out.println(s.charAt(15)); // StringIndexOutOfBoundsException

        //int indexOf(int ch) 根据ascii码值获取对应字符所在的索引位置,左边起第一个
        String s2 = "qweasdsafqe";
        System.out.println(s2.indexOf(104)); // -1
        //int indexOf(int ch,int fromIndex) 从某个索引开始向后寻找某个字符,返回找到字符在整个大字符串中的索引位置
        System.out.println(s2.indexOf(97,5)); // 7

        //int indexOf(String str) 获取大字符串中小字符串的位置,返回小字符串第一个字符的索引
        System.out.println(s2.indexOf("sdsa")); // 4
        //int indexOf(String str,int fromIndex) 从某个索引开始向后寻找某个字符,返回找到字符串第一个字符在整个大字符串中的索引位置
        System.out.println(s2.indexOf("saf",3)); // 6

        //String substring(int start) // 从指定位置向后截取,返回新的字符串
        String s3 = "李刚是真的帅!江川很不服,钱志强觉得自己是最帅的!";
        String res1 = s3.substring(3);
        System.out.println(res1);

        //String substring(int start,int end) 截取字符串中的一部分 [start, end)
        String res2 = s3.substring(7, 12);
        System.out.println(res2);


    }
}

String转换功能

String转换功能:
    byte[] getBytes()
    char[] toCharArray()
    static String valueOf(char[] chs)
    static String valueOf(int i)
    String toLowerCase()
    String toUpperCase()
    String concat(String str)

代码案例

public class StringDemo6 {
    public static void main(String[] args) {
        String s1 = "abcdefg";
        //byte[] getBytes() 将字符串转字节数组
        byte[] bytes = s1.getBytes();
        for(int i=0;i<bytes.length;i++){
            System.out.println(bytes[i]);
        }
        System.out.println("----------------");
        
//        for(byte b : bytes){
//            System.out.println(b);
//        }
//        System.out.println("----------------");
//        System.out.println(Arrays.toString(bytes));
//        System.out.println("----------------");
        //char[] toCharArray()  将字符串转字符数组
        char[] chars = s1.toCharArray();
        for(int i=0;i<chars.length;i++){
            System.out.println(chars[i]);
        }
        System.out.println("----------------");
        String s3 = new String(chars);
        System.out.println(s3);

        //static String valueOf(char[] chs) 将字符数组转字符串
        String s2 = String.valueOf(chars);
        System.out.println(s2);


        //static String valueOf(int i)
        System.out.println(String.valueOf(100)); // 100 -> "100"

        //String toLowerCase() 转小写
        String s4 = "HellOWOrlD";
        String res1 = s4.toLowerCase();
        System.out.println(res1);

        //String toUpperCase()
        String res2 = s4.toUpperCase();
        System.out.println(res2);

        //String concat(String str) 字符串拼接操作
        String res3 = "李刚".concat("真帅!");
        System.out.println(res3);


    }
}

String其它功能

String其它功能:
    替换功能
        String replace(char old,char new)
        String replace(String old,String new)
    去除字符串两空格
        String trim()
    按字典顺序比较两个字符串
        int compareTo(String str)
        int compareToIgnoreCase(String str)

代码案例

public class StringDemo7 {
    public static void main(String[] args) {
        String s1 = "dasqwajavadwqrajjavaiojadjavafq-aedjavaqajiqa";
        //String replace(char old,char new) 由新字符替换字符串中所有旧字符
        String res1 = s1.replace('a', '$');
        System.out.println(s1);
        System.out.println(res1);
        //String replace(String old,String new) 由新的字符串替换旧的字符串
        String res2 = s1.replace("java", "李刚");
        System.out.println(res2);
        //String trim() 去除字符串两边的空格
        String s2 = "    hello  world    ";
        System.out.println("s2: "+s2);
        String res3 = s2.trim();
        System.out.println("res3: "+res3);
        //int compareTo(String str) 按字典顺序比较两个字符串是否相同 当结果是0的时候表示两个字符串内容相同
        String s3 = "hello";
        String s4 = "world";
        String s5 = "hel";
        String s6 = "hello";
        System.out.println(s3.compareTo(s4)); // -15
        System.out.println(s3.compareTo(s5)); // 2
        System.out.println(s3.compareTo(s6)); // 0


    }
}

compareTo源码解释

class String{
    //s3.compareTo(s4)
    //s3 - "hello"
    //s4 - "hel"
    public int compareTo(String anotherString) {
        // this - "hello"
        // anotherString - "hel"
        int len1 = this.value.length; // 5
        int len2 = anotherString.value.length; // 3
        int lim = Math.min(len1, len2); // 3
        char[] v1 = value; // ['h','e','l','l','o']
        char[] v2 = anotherString.value; // ['h','e','l']
        int k = 0;

        while (k < lim) {
            char c1 = v1[k]; // 'h'  'e'  'l'
            char c2 = v2[k]; // 'h'  'e'  'l'
            if (c1 != c2) {
                return c1 - c2; // 104 - 119 = -15
            }
            k++;
        }
        return len1 - len2; // 5-3=2
    }
}

标签:java,String,int,Object,System,day10,println,public,out
From: https://www.cnblogs.com/w-ll/p/18450765

相关文章

  • java计算机毕业设计宠物商城网站(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人们生活水平的提高,宠物已成为许多家庭的重要成员。宠物市场的繁荣带动了宠物相关产业的发展,其中宠物商城网站作为线上购物的......
  • Java基础语法
    一入Java情几许?大家好,我是深山夕照深秋雨。本文主要介绍Java的基础语法第二部分变量,类型转换和运算符。一、变量详解变量里的数据在计算机中的底层原理1、数据在计算机底层都是采用二进制:使用0、1,按照逢2进1的规则表示数据来存储。2、算出一个数据的二进制形式:除二取余法......
  • Java大厂面试题合集!
    1、为什么要使用线程池  难度系数:⭐使用线程池的主要原因包括:降低资源开销:线程池预先创建一定数量的线程,当需要处理任务时,直接从线程池中获取已经创建好的线程,避免了频繁地创建和销毁线程所带来的开销。这样可以显著提高系统的性能。控制并发线程数量:线程池可以限制同......
  • 代码源Csp-S模拟赛Day10-11赛后总结
    代码源Csp-S模拟赛Day10-11赛后总结Day10赛时T1赛时感觉很难维护时间以及多个精灵同时到达同一格子的情况,后来想了一种做法:对于每个格子最早被遍历到的时间我们的处理是容易的,你考虑我们可以对每行每列都建一棵线段树(数据范围保证了\(rc\leq5e5\),所以总空间大致是一个\(4rc......
  • Java中的外观模式
    Java中的外观模式综述本文总结外观模式的定义,特点,使用场景并给出了具体的示例.外观模式的定义外观模式(门面模式)是一种结构型设计模式.其主要目的是为复杂系统提供一个简化的接口.帮助客户端代码与系统的子系统进行交互,同时还可以省略大量的细节.这种设计模式可以称得......
  • 视野修炼-技术周刊第104期 | 下一代 JavaScript 工具链
    欢迎来到第104期的【视野修炼-技术周刊】,下面是本期的精选内容简介......
  • Java中的任务超时处理
    Java中的任务超时处理综述任务超时处理是编程世界中一个不可或缺且常见的处理机制,特别是在进行耗时任务时,如网络请求,数据库查询,大规模数据处理等场景。在这些情况下,为了防止任务因各种不可预测的因素(如网络延迟,服务器响应超时,数据量过大等)而无休止地占用宝贵的系......
  • Java中的策略模式
    Java中的策略模式综述本文总结了策略模式的定义,特点,使用场景以及实现思路。策略模式的定义策略模式说通了,就是定义一系列的算法,将它们各自封装起来,并且使用一个共同的接口使它们可相互替换.使得算法和算法之间没有耦合,这样如果方法需要修改或者添加,工程师不需要修......
  • Java基础第八章(多态)
    多态1.方法体现多态方法重载体现多态对象通过传入不同数量的参数,会调用不同的sun方法,体现出多态方法重写体现多态A类和B类是继承关系,通过不同对象调用对应类中重写的方法体现2.对象体现多态编译是javac,运行是java(1)一个对象的编译类型和运行类型可以不一致将父......
  • JavaScript 小知识:轻松搞定 ArrayBuffer 到 Base64 的转换
    关键词:ArrayBuffer,Base64,栈溢出,TextDecoder,btoa,性能优化,JavaScript,兼容性摘要本文探讨了在JavaScript中将ArrayBuffer转换为Base64字符串时遇到的栈溢出问题,并提供了几种实用的解决方案。我们将通过生动的比喻来解释相关概念,比较不同方法的性能和兼......