JAVA 常用类

文章详细介绍了Java中的Object类,包括toString和equals方法的使用以及重写规则。接着讨论了String的特性,如不可变性,并对比了String、StringBuilder和StringBuffer的区别。还提到了包装类的作用和自动拆装箱,以及Integer类的一些常用方法。最后,文章阐述了枚举(enum)的定义、使用及其相关方法。
摘要由CSDN通过智能技术生成

一,Object :所有类的超类

是java中所有类的父类,java中所有的类都会直接或者间接的继承自Object

如果显示的使用extends继承其他类,因为单继承机制,不会直接继承自Object,如果没有显示继承其他类,会默认继承自Object类

  1. toString : 返回对象的字符串表现形式

当输出一个对象的引用时,默认输出的是调用toString方法的返回值

Object类中的toString实现 :

        public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }

需求 : 想要输出对象的字符串表现形式时|引用时,输出的是对象所有的属性值---->子类中进行重写toString

    //定义实体类,重写toString 方法
    public String toString() {
        return "Cat{name = " + name + ", age = " + age + "}";
    }

  1. equals : 比较两个对象是否相等

equals与==之间的区别 :

共同点 : 比较两个数据是否相等
异同点 :
比较数据类型要求 :
  1. == 能够比较任意类型数据

  1. equals 只能比较引用数据类型对象数据

int i=0;
int j=0;
System.out.println(i==j);//true
        String str1 = "abc";
        String str2 = new String("abc");

        System.out.println(str1==str2);//false
        System.out.println(str1.equals(str2));//true
比较规则 :
  1. == 基本数据类型比较数据值,引用数据类型对象数据比较地址值

  1. equals :

Object-> 比较为对象的地址值,默认通过==比较

public boolean equals(Object obj) {
    return (this == obj);
}

重写->根据所有属性值进行比较是否相等

    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Car car = (Car) o;
        return age == car.age && name.equals(car.name);
    }

注意 :

以后再定义实现类,都要根据所有属性值进行重写toString与equals

实体类规范 : javabean

1.类是公共的

2.至少 提供一个空构造,根据需求提供带参

3.私有的属性

4.公共的访问方式

5.重写toString与equals

二,字符串

String : 不可变的字符序列(内容,长度,顺序)
StringBuilder : 可变的字符序列,线程不安全|不同步,效率较高
StringBuffer : 可变的字符序列,线程安全|同步的,效率较低

1, String :

String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。

分析以下代码是否存在对象创建,有几个?

 String str1 = "abc";    //1个  "abc"  在字符串常量池中
 String str2 = new String("bcd");    //2个   new String()->堆内存中    "bcd"->常量池中
//首先在常量池中找有没有abc,如果有直接让变量指向常量池中的地址,故只有在堆内存中new出来的对象
//如果常量池中没有我们要找的字符串,那么再新建一个对象
 String str3 = new String("abc");    //1个   new String()->堆内存

String底层结构 :

jdk8->字符数组 private final char[] value;

jdk11->字节数组 private final byte[] value;

注意 : 以后要比较字符串内容是否相等,就使用equals方法

   //    String重写的equals方法
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }

2,StringBuilder|StringBuffer

String, StringBuilder,StringBuffer 的区别 :

都表示字符串,字符序列

  • 是否可变 :

String : 不可变

StringBuilder : 可变

StringBuffer : 可变

  • 线程安全|同步

StringBuilder : 线程不安全|不同步

StringBuffer : 线程安全|同步

  • 执行效率

StringBuilder > StringBuffer > String

StringBuilder,StringBuffer :

StringBuilder :

一个可变的字符序列。 此类提供与StringBuffer兼容的API,但不保证同步。 在可能的情况下,建议使用此类优先于StringBuffer因为在大多数实现中它会更快。

StringBuffer :

线程安全,可变的字符序列。可供多个线程使用。

从JDK 5版本开始,这个类已经补充了一个设计用于单个线程的等效类, StringBuilder 。 通常应优先使用StringBuilder类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。

底层结构 :

来自共同的父类 AbstractStringBuilder

jdk8及之前 : char[] value;

jdk11 : byte[] value;

  • 初始容量 : 16 | 可以通过构造器指定

  • 扩容机制 : 调用Arrays的valueOf方法实现创建新数组+拷贝数据,新数组的容量为原数组容量的2倍+2 int newCapacity = (oldCapacity << 1) + 2;

注意 :

以后如果使用某种类型底层数据结构为数组,关注初始容量 + 扩容机制

三,Math

四,Data包装类

包装类 :

有了基本数据类型为什么要提供包装类 ?

1.类中可以定义很多方法,方便操作使用

2.集合存储数据,只能存储引用数据类型的对象数据

3.结合业务 : 区分用户账户余额是否充过值|充值后消费完 :

null --> 没有充过值,新用户

0.0 --> 老用户,重置了花没了

为了什么有了包装类还要存在基本数据类型?

1.使用简单,赋值简单

2.有利于节省内存

1.基本数据类型与包装类之间相互转换 :

jdk5新增的自动拆装箱

自动装箱 : 基本-->引用

自动拆箱 : 引用-->基本

基本 <----> 包装类

byte Byte

short Short

int Integer

long Long

float Float

double Double

char Character

boolean Boolean

2,Integer的一些方法展示

 //基本
        int i1 = 1;
        //包装
        //自动装箱      Integer.valueOf(i1)
        Integer in1 = i1;

        //自动拆箱     in1.intValue();
        int i2 = in1;

        getSum(1.1,2.2); //自动装箱

        //static int max(int a, int b) 返回两个 int值中较大的一个, int调用 Math.max一样 。
        //static int min(int a, int b) 返回两个 int值中较小的一个, int调用 Math.min一样 。

        //static int parseInt(String s) 将字符串参数解析为带符号的十进制整数。
        System.out.println(Integer.parseInt("10"));
        //static int parseInt(String s, int radix) 将字符串参数解析为第二个参数指定的基数中的有符号整数。
        System.out.println(Integer.parseInt("10",2));
        System.out.println(Integer.parseInt("10",8));
        System.out.println(Integer.parseInt("10",16));

        //static int sum(int a, int b) 根据+运算符将两个整数相加。
        //static String toBinaryString(int i) 返回整数参数的字符串表示形式,作为base 2中的无符号整数。
        System.out.println(Integer.toBinaryString(10));
        //static String toHexString(int i) 返回整数参数的字符串表示形式,作为基数为16的无符号整数。
        System.out.println(Integer.toHexString(10));
        //static String toOctalString(int i) 返回整数参数的字符串表示形式,作为基数为8的无符号整数。

五,枚举

枚举 enum

  1. 确定一种事物的所有可能|实例

  1. 枚举是一种特殊的类型,定义特殊,特点特殊,使用特殊

  1. 使用enum定义枚举类型

  1. 枚举类型的实例是由枚举类内部提供,不允许外部创建,只能获取使用

enum State{
    //字段
    BUSY,FREE,NORMAL;
}
  1. 枚举类中的字段为当前枚举类型的实例,相当于省略了public static final

  1. 枚举类中的构造器默认修饰符为private

  1. 枚举类中可以定义字段,属性,构造器,方法....

enum WDay{
    //实例
    D1("星期一"),D2("星期二"),D3("星期三");

    //属性
    private String name;

    //构造器

    private WDay() {
    }

    WDay(String name) {
        this.name = name;
    }


    //成员方法

    public String getName() {
        return name;
    }

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

    public void test(){}
}
  1. 枚举类型的使用,通过枚举类名.实例名获取对象,通过对象调用成员

 new Staff("lisa",20,"2021",20000,State.BUSY),
 new Staff("haha",24,"2020",21000,State.FREE),
 new Staff("yaya",25,"2021",15000,State.NORMAL),
 new Staff("甘师傅",23,"2023",28000,State.BUSY)
  1. 枚举类型默认隐式的继承自 java.lang.Enum 这是所有Java语言枚举类型的公共基类。

  1. 枚举的一些方法

//int ordinal() 返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。  
//String toString() 返回声明中包含的此枚举常量的名称。  
//T valueOf​(类<T> enumType, String name) 返回具有指定名称的指定枚举类型的枚举常量。 
public class Class001_Enum1 {
    public static void main(String[] args) {
        Weekday w1=Weekday.D1;
        //int ordinal() 返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。
        System.out.println(w1.ordinal());
        //static <T extends Enum<T>>
        //T valueOf​(类<T> enumType, String name) 返回具有指定名称的指定枚举类型的枚举常量。
        Weekday[] arr=w1.values();//得到的是w1类型的枚举的全部实例组成的数组
        System.out.println(Arrays.toString(arr));
        //String toString() 返回声明中包含的此枚举常量的名称。
    }
}

//定义枚举
enum Weekday{
    //字段
    D1("星期一"),D2("星期二"),D3("星期三"),D4("星期四"),D5("星期五"),D6("星期六"),D7("星期天");
    private String name;
    //构造器默认是用private修饰
    Weekday(){

    }
    Weekday(String name){
        this.name=name;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值