Java的Object类和Objects类和包装类和StringBuilder类和StringJoiner的简单API

Object类:

public String toString();

Returns a string representation of the object.

基本作用:返回对象的字符串表示形式

存在的意义:让子类重写,以便返回子类对象的内容

public class student {
    private String name;
    private int age;

    public student() {
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override//重写toString方法
    public String toString() {
        return "student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public boolean equals(Object obj)

Indicates whether some other object is "equal to" this one.

基本作用:判断两个对象是否相等(比较的是对象的地址是否相同)

存在的意义:让子类重写,以便于比较对象的内容是否相同

public class test {
    public static void main(String[] args) {
        student s1=new student("hhh",18);
        System.out.println(s1);
        student s2=new student("hhh",18);
        System.out.println(s1.equals(s2));//false
    }
}

 我们可以重写equals方法:
 

/*@Override
    public boolean equals(Object obj)
    {
        student s=(student)obj;
        if(this.name.equals(s.name)&&this.age==s.age)
        {
            return true;
        }
        else return false;
    }*/
s1==this s2==o
@Override
    public boolean equals(Object o) {
//判断两个对象地址是否一样,一样直接返回true
        if (this == o) return true;
//判断o是null直接返回false或者比较者和被比较者类型不一样,直接返回false
        if (o == null || getClass() != o.getClass()) return false;
        student student = (student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

这样就会返回true

protected Object clone();

Creates and returns a copy of this object.

当对象调用这个方法时,这个方法会复制一个一模一样的新对象返回(对象地址也一样)

直接在main函数调用clone会报错,因为clone是protected修饰,要在其他包下的Object的子类才能使用,但是main函数是程序的入口,不是子类。

所以要在student类下重写clone方法,student是object的子类,所以可以调用。

然后student类和test类又在同一个包下,所以main函数下就可以访问clone函数了。

public class test {
    public static void main(String[] args)  {
        student s1=new student("hhh",18);
        System.out.println(s1);
        student s2=new student("hhh",18);
        System.out.println(s1.equals(s2));

        student s3=(student) s1.clone();//error

    }
}

 student类重写clone

//Cloneable是一个标记接口
//标志你重写了clone函数,不然JVM虚拟机不知道,会报错
public class student implements Cloneable{
    private String name;
    private int age;

    public student() {
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();//重新调用父类Object的clone函数
    }
}

成功: 

public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
        student s1=new student("hhh",18);
        System.out.println(s1);
        student s2=new student("hhh",18);
        System.out.println(s1.equals(s2));//false

        student s3=(student) s1.clone();
        System.out.println(s3.getName());//hhh
    }
}

Objects类:

public static boolean equals(Object a, Object b) 

public static boolean equals(Object a, Object b) {
    return (a == b)//先判断地址是否一样 || (a != null && a.equals(b));
}

Returns true if the arguments are equal to each other and false otherwise. Consequently, if both arguments are nulltrue is returned. Otherwise, if the first argument is not null, equality is determined by calling the equals method of the first argument with the second argument of this method. Otherwise, false is returned. 

先做非空判断,再比较两个对象是否相同

public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
        student s1=new student("hhh",18);
        System.out.println(s1);
        student s2=new student("hhh",18);
        System.out.println(s1.equals(s2));//false

        student s3=(student) s1.clone();
        System.out.println(s3.getName());//hhh
        System.out.println(s3);
        System.out.println(s1);

        System.out.println(Objects.equals(s1, s2));//true
    }
}

 public static boolean isNull(Object obj)

public static boolean isNull(Object obj) {
    return obj == null;
}

Returns true if the provided reference is null otherwise returns false.

判断对象是否为空,空返回true 

 s3=null;
        System.out.println(Objects.equals(s1,s3));
        System.out.println(Objects.isNull(s3));//true

public static boolean nonNull(Object obj)

Returns true if the provided reference is non-null otherwise returns false

包装类:
 

把基本的数据类型的数据包装成对象 

Integer类:

public String toString() 

Returns a String object representing this Integer's value.

把int类型的数据变成字符串

public static int parseInt(String s) throws NumberFormatException

Parses the string argument as a signed decimal integer 

把字符串类型变成int类型

public class test {
    public static void main(String[] args) {
        Integer t1=Integer.valueOf(12);//把12包装成类
        System.out.println(t1);//12
        //自动装箱:自动把基本类型的数据转换成对象
        Integer a=3;
        //自动拆箱:可以自动把包装类型的对象转换成对应的基本数据类型
        int a1=a;
        //泛型和集合不支持基本数据类型,只能支持引用数据类型
        ArrayList<Integer>list =new ArrayList<>();
        list.add(12);
        list.add(24);
        System.out.println(list);

        //1:把基本数据类型转成字符串
        String s=Integer.toString(3);//把3变成字符串
        System.out.println(s+1);//31

        String s2=a.toString();
        System.out.println(s2+33);//333

        String s3=a+"";

        //2:把字符串类型变成int类型
        String ss="333";
        //int b=Integer.parseInt(ss);
        int b=Integer.valueOf(ss);
        System.out.println(b+1);//334

        String ss2="33.5";
//        double d=Double.parseDouble(ss2);
        double d=Double.valueOf(ss2);
        System.out.println(d+1);//34.5
    }
}

 StringBuilder类:

构造函数: 

public StringBuilder append(任意类型) 

添加数据并返回StringBuilder对象本身 

public class test {
    public static void main(String[] args) {
        StringBuilder s=new StringBuilder("hhh");

        //1:拼接内容
        s.append(12);
        s.append("java");
        s.append(true);

        //支持链式编程
        s.append(666).append("sss");

        System.out.println(s);
    }
}

public StringBuilder reverse() 

Causes this character sequence to be replaced by the reverse of the sequence.

将对象的内容反转 

public class test {
    public static void main(String[] args) {
        StringBuilder s=new StringBuilder("hhh");

        //1:拼接内容
        s.append(12);
        s.append("java");
        s.append(true);

        //支持链式编程
        s.append(666).append("sss");

        System.out.println(s);//hhh12javatrue666sss

        s.reverse();
        System.out.println(s);//sss666eurtavaj21hhh
    }
}

public int length()

 Returns the length (character count).

返回字符串长度

//返回字符串长度
        System.out.println(s.length());//19

public String toString()

Returns a string representing the data in this sequence. A new String object is allocated and initialized to contain the character sequence currently represented by this object. This String is then returned. Subsequent changes to this sequence do not affect the contents of the String.

把StringBuilder对象转换成String类型

String s2=s.toString();
        System.out.println(s2);//sss666eurtavaj21hhh

应用:

把整形数组变成[]的String类型

public class StringBuilder2 {
    public static void main(String[] args) {
        String s =getArrData(new int[]{11,22,33});
        System.out.println(s);
    }

    public static String getArrData(int[] arr) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");

        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                sb.append(arr[i]).append("]");
            } else {
                sb.append(arr[i]).append(",");
            }
        }
        String s = sb.toString();
        return s;
    }
}

 结果:[11,22,33]

 为什么操作字符串建议使用StringBuilder而不用String

对于字符串的相关操作,如频繁的拼接,修改等,建议使用StringBuilder,效率更高

StringBuffer的用法和StringBuilder是一模一样的

但是StringBuffer是线程安全的,StringBuffer是线程不安全的 

StringJoiner类 :

好处:不仅能提高字符串的操作效率,并且有些场景使用它操作字符串,代码会更加简洁

Constructor

Description

StringJoiner(CharSequence delimiter)

Constructs a StringJoiner with no characters in it, with no prefix or suffix, and a copy of the supplied delimiter.

//创建一个StringJoiner对象,指定拼接时的间隔符号

StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)

Constructs a StringJoiner with no characters in it using copies of the supplied prefixdelimiter and suffix.

 //创建一个StringJoiner对象,指定拼接时的间隔符号,开始符号,结束符号

public StringJoiner add(CharSequence newElement)

Adds a copy of the given CharSequence value as the next element of the StringJoiner value. If newElement is null, then "null" is added.

添加数据,并返回对象本身 

 

public class StringBuilder3 {
    public static void main(String[] args) {
        String s =getArrData(new int[]{11,22,33});
        System.out.println(s);//[11,22,33]
    }

    public static String getArrData(int[] arr) {
        StringJoiner sj=new StringJoiner(",","[","]");
        for (int i = 0; i < arr.length; i++) {
            sj.add(arr[i]+"");//由于sj只能操作字符串,所以arr[i]+""把int类型变成字符串类型
        }

        String s = sj.toString();
        return s;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/508514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++入门(以c为基础)——学习笔记2

1.引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间。在语法层面&#xff0c;我们认为它和它引用的变量共用同一块内存空间。 可以取多个别名&#xff0c;也可以给别名取别名。 b/c/d本质都是别名&#…

基于深度学习的端到端自动驾驶的最新进展:调研综述

基于深度学习的端到端自动驾驶的最新进展&#xff1a;调研综述 附赠自动驾驶学习资料和量产经验&#xff1a;链接 论文链接&#xff1a;https://arxiv.org/pdf/2307.04370.pdf 调研链接&#xff1a;https://github.com/Pranav-chib/ 摘要 本文介绍了基于深度学习的端到端自…

QT-飞机水平仪图标

QT-飞机水平仪图标 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <stdio.h> #include <stdlib.h> #include <string.h>#include <QtCore> #include <QtGui> #include <QDebug> #include <QTableWidget&g…

百度网站收录提交入口

百度网站收录提交入口 在网站刚建立或者更新内容后&#xff0c;及时将网站提交给搜索引擎是提高网站曝光和获取流量的重要步骤之一。百度作为中国最大的搜索引擎之一&#xff0c;网站在百度中的收录情况尤为重要。下面介绍一下如何通过百度的网站收录提交入口提交网站。 1. 百…

游戏引擎中的粒子系统

一、粒子基础 粒子系统里有各种发射器&#xff08;emitter&#xff09;&#xff0c;发射器发射粒子&#xff08;particle&#xff09;。 粒子是拥有位置、速度、大小尺寸、颜色和生命周期的3D模型。 粒子的生命周期中&#xff0c;包含产生&#xff08;Spawn&#xff09;、与环…

08.类型转换、深浅拷贝

08.类型转换、深浅拷贝 01.类型转换1.1 int()1.2 float1.3 str()1.4 eval()1.5 list() 02.深浅拷贝2.1 赋值2.2 浅拷贝&#xff08;数据半共享&#xff09;2.3 深拷贝&#xff08;数据完全不共享&#xff09; 03.可变对象04.不可变对象 01.类型转换 02.深浅拷贝 03.可变对象 04…

自定义 Unity Scene 的界面工具

介绍 文档中会进行SceneView的自定义扩展&#xff0c;实现显示常驻GUI和添加自定义叠加层&#xff08;Custom Overlay&#xff09;。 最近项目开发用回了原生的Unity UI相关内容。对于之前常用的FairyGUI来说&#xff0c;原生的UGUI对于UI同学来讲有些不太方便。再加上这次会…

【STM32嵌入式系统设计与开发】——14PWM(pwm脉宽输入应用)

这里写目录标题 一、任务描述二、任务实施1、WWDG工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;USART1初始化函数(usart1_init())&#xff08;3&#xff09;USART数据发送函数&#xff08; USART1_Send_Data&#xff08;&#xff09…

【随笔】Git -- 高级命令(中篇)(七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

【Linux】ubuntu/centos8安装zsh终端

本文首发于 ❄️慕雪的寒舍 根据这篇知乎文章进行 https://zhuanlan.zhihu.com/p/514636147 1.安装zsh 先安装zsh并设置为默认的终端 # ubuntu sudo apt install zsh # centos sudo yum install zsh util-linux-user # 通用 chsh -s /bin/zsh如果centos下找不到chsh命令&am…

【优化算法】VMD分解算法的16种优化,对K和alpha参数寻优,附MATLAB代码

在上一篇文章中&#xff0c;我们介绍了优化算法的基本原理和一些常见的生物启发式算法。另外我们封装了一个16合1的寻优函数。 不过在上一篇中&#xff0c;我们举了一个简单的数值模型作为适应度函数的演示案例&#xff0c;然而在实际的研究中&#xff0c;适应度函数往往要复杂…

iOS移动应用实时查看运行日志的最佳实践

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 &#x1f4dd; 摘要&#xff1a; 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具&#xff0c;我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

『Apisix安全篇』APISIX 加密传输实践:SSL/TLS证书的配置与管理实战指南

&#x1f4e3;读完这篇文章里你能收获到 &#x1f31f; 了解SSL/TLS证书对于网络通信安全的重要性和基础概念。&#x1f527; 掌握在APISIX中配置SSL/TLS证书的基本步骤和方法。&#x1f4dd; 学习如何通过修改监听端口&#xff0c;使HTTPS请求更加便捷。&#x1f6e0;️ 认识…

Redis开源协议调整,我们怎么办?

2024年3月20日, Redis官方宣布&#xff0c;从 Redis 7.4版本开始&#xff0c;Redis将获得源可用许可证 ( RSALv2 ) 和服务器端公共许可证 ( SSPLv1 ) 的双重许可&#xff0c;时间点恰逢刚刚完成最新一轮融资&#xff0c;宣布的时机耐人寻味。 Redis协议调整&#xff0c;对云计算…

FFmpeg 详解

FFmpeg 详解 FFmpeg 详解整体结构不同下载版本的区别常用库常用函数初始化封装格式解码器 版本对比组件注册方式对比FFmpeg 3.x 组件注册方式FFmpeg 4.x 组件注册方式 结构体比对函数对比avcodec_decode_video2()vcodec_encode_video2() 数据结构结构体分析AVFormatContextAVIn…

Day5-

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

商场促销--策略模式

1.1 商场收银软件 package com.lhx.design.pattern.test;import java.util.Scanner;public class Test {public static void main(String[] args){System.out.println("**********************************************"); System.out.println("《大话设计模式…

聊聊测试用例评审流程

测试人员将需求熟悉完成后&#xff0c;开始编写相应的测试用例&#xff0c;待测试用例编写完成后只是测试用例完成前的第一步&#xff0c;后边的流程需要组织线上或线下评审会议等等。 首先要了解测试用例评审的最终目的是什么&#xff1a;提高测试用例的质量和覆盖率&#xff…

利用Node.js实现拉勾网数据爬取

引言 拉勾网作为中国领先的互联网招聘平台&#xff0c;汇集了丰富的职位信息&#xff0c;对于求职者和人力资源专业人士来说是一个宝贵的数据源。通过编写网络爬虫程序&#xff0c;我们可以自动化地收集这些信息&#xff0c;为求职决策和市场研究提供数据支持。Node.js以其非阻…

【Frida】【Android】08_爬虫之网络通信库okhttp3

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…