首页 > 技术文章 > 常用类

liudemeng 2019-08-15 11:50 原文

1.Object

1.概述

java.lang.Object类是java语言中的超级父类

如果一个类没有指定父类,则继承与Object类

public class MyClass /*extends Object*/{
    // 代码块
}

学习两个方法:

  • public String toString():返回该对象的字符串表示。
  • public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。

2.toString方法

方法摘要

toString方法的返回该对象的字符串表示: 对象的类型+@+内存地址值

由于toString方法返回的结果是内存地址,而在开发中, 对象的属性得到相应的字符串表现形式,所以重写

覆盖重写

如果不希望使用toString的默认行为,对它进行覆盖重写

public class Person{
    private String name;
    private int age;
    
    @Override
    public String toString(){
        return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
    //省略构造器, Getter, Setter
}

IntelliJ IDEA中,可以点击Code菜单中的Generate...,也可以使用快捷键alt+insert,点击toString()选项。选择需要包含的成员变量并确定。

3.equals方法

方法摘要

判断这两个对象是否是相同的, 返回一个bool值

默认地址比较

如果没有覆盖重写equals方法,那么Object类中默认进行 == 运算符的对象地址比较, 只要不是同一个对象,结果必然为false。

对象内容比较

如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法

import java.util.Objects;

public class Person{
    private String name;
    private int age;
    // 多态的弊端: 无法使用子类特有的内容(属性和方法) 解决: 使用向下转型,强制转换增加判断,防止出现classcastException
    //重写
    public boolean equals(Object o){
        // 如果对象地址值一样,则相同, 传递的是this本身
        if(this==o) return true;
       
        // 如果参数为空,或者类型信息不一样,则认为不同
        // getClass() 返回值是Class类型 反射技术
        if(o==null||getClass()!=o.getCLass()) return false;
        // 转换当前的类型
        // 判断当前的类型
      	// getClass()!=o.getCLass()等效于下面的判断
      	if(o instanceof Person){
          Person person = (Person) o;
          // 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果
        	return age == person.age && Objects.equals(name, person.name);
          // Objects.equals方法: 两个对象进行比较,防止出现空指针异常
        };
    }
}

4.equals和等等于运算符区别

参数:object obj:可以传递任意的一个对象

== 比较运算符,返回的是一个bool值, true或者是false

基本类型比较: 比较的是值

引用数据类型: 比较的是两个对象的地址值

2.Date类

1.概述

  • java.util.Date: 表示日期和时间的类
  • 类Date表示特定的瞬间精确到毫秒

毫秒值得作用: 可以对时间和日期进行计算

2099-01-01 到2088-01-01中间多少天? 把日期换成毫秒进行计算,计算完毕,将毫秒转为时间

2.获取当前日期

  1. 当前的日期: 2019-07-24

  2. 时间远点:1970.1.1 0:00:00

  3. 就是计算当前日期到时间远点经历多少毫秒

    public class Demo01{
      public static void main(String[] args){
        System.out.println(System.currentTimeMillis()); // Long类型值
        // 获取当前的时间
      }
    }
    

注意事项:中国属于东八区,会把时间增加八个小时, 时间远点是一个英国格林时间

3.构造方法

date类的空参数构造方法

import java.util.Date;
public class Demo{
  public static void main(String[] args){
    demo01();
  }
  /*Date() 获取当前系统的日期和时间
  */
  private static void demo01(){
    Date date = new Date();
    System.out.println(date);
  }
}

date类的有参数构造

import java.util.Date;
public class Demo{
  public static void main(String[] args){
    demo01;
  }
  private static void demo01(){
    /*
    Date类的带参数构造,传入一个long类型, 传递毫秒值,把毫秒值转成date
    Date(long date)
    */
    date = new Date(113134141442L);
    System.out.println(date);
  }
}

4.常用的方法

  • long getTime(): 把日期转为毫秒值

    public class Demo{
      public static void main(String[] args){
        demo01();
      }
      private static void demo01(){
        Date date = new Date();
        long time = date.getTime();
        System.out.println(time);
      }
    }
    

3.DateFormat类

时间格式化日期的抽象类

作用: 格式化解析日期

1.成员方法

1.String format(Date date)
  • 按照指定的模式,吧Date日期格式化为符合模式的字符串
2.Date parse(String source)
  • 把符合模式的字符串,解析Date日期
  • java.txt.SimpleDateFormat 继续了DateFormat
// 需求在页面上显示自己的系统时间
public class Demo{
  public static void main(String[] args){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时: mm分: ss秒");
    String time - sdf.format(new Date()); //格式化
    System.out.println(time);
  }
}
// 让用户输入自己的生日,计算活了多少天
public class Demo{
  public static void main(String[] args){
    // 用户键盘输入自己的出生年月日
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入你出生的年月日");
    String birthday = sc.nextLine();
    
    // 把string类型的解析成为Date对象
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date date1 = sdf.parse(birthday); // 解析日期
    long time1 = date1.getTime(); //获取时间戳
    
    // 获取当前的时间
    Date date2 = new Date();//现在的时间
    long time2 = date2.getTime(); // 当前的时间戳
    
    long time = (time2-time1)/1000/3600/24;
    Ststem.out.println(time);
  }
}

4.Calendar类

个人理解:该类用来表示一些日历的字段,可以使用该类对字段进行转换和计算

注意:Calendar类是一个抽象类,不能创建对象,但是提供了获取对象的方式。

常用方法

int get(int field) 获取字段值

void set(int field, int value)设置字段值

void add(int field, int amount)计算字段值

public class Demo{
  public static void main(String[] args){
    // 获取Calendar对象,其实本质就是返回的是Calendar的子类对象
    Calendar c = new Calendar.getInstance();
    // 休改Calendar的时间
    c.set(Calendar.YEAR, 2019);
    c.set(Calendar.MONTH, 7);
    c.set(Calenadr.DAY_OF_MONTH,28);
    
    // 一步操作
    c.set(2019,8,24);
    c.add(Calenadr.YEAR, -1); //减一年
    
    // 获取年
    int year = c.get(Calenadr.YEAR);
    // 获取月
    int month = c.get(Calenadr.MONTH);
    // 过去日期
    int day = c.get(Calenadr.DDY_OF_MONTH);
    System.out.println(year+"年"+month+"月"+day+"日");
  }
}

5.System类

  1. public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) 把原数组中的指定元素,复制到目标数组中 参数解释: src - 源数组。 srcPos - 源数组中的起始位置。 dest - 目标数组。 destPos - 目标数据中的起始位置。 length - 要复制的数组元素的数量。
  2. static void exit(int status) 退出虚拟机
  3. static void gc() 运行垃圾回收器(尽力回收没有用的对象) Student s=new Student(); s=null;//当s=null时,前面的Student对象就变成了垃圾
  4. static long currentTimeMillis() 获取当前系统时间的毫秒值(距离1970年1月1日有多少毫秒) 注意:1秒=1000毫秒

6.StringBuilder类

字符串拼接问题

由于字符串类对象内容不可变, 所以每次在字符串拼接的时候,总会在内存中创建一个新的对象

public class Hello{
  public static void main(String[] args){
    String s = "hello";
    s += "world";
    System.out.println(s);
  }
}

StringBulider类是一个容器, 容器里面可以有很多的字符串,可以对其中的字符串进行操作

构造方法

  • public StringBuilder():构造一个StringBuilder的容器
  • public StringBuilder(String str):构造一个StringBuilder的容器,将字符串添加进去
public class StringBuilderDemo{
  public static void main(String[] args){
    StringBuilder sb1 = new StringBuilder();
    System.out.println(sb1); //空白
    StringBuilder sb2 = new StringBuilder("liu");
    System.out.println(sb2); // liu
  }
}

常用方法

  • public StringBuilder append(): 添加任意数据的字符串形式
  • public StringBuilder toString():将当前的StringBuilder对象转换为String对象

append方法

public class Demo{
  public static void main(String[] args){
    // 创建对象
    StringBuilder sb1 = new StringBuilder();
    StringBuilder sb2 = sb1.append("hello");
    
    // 进行对比
    System.out.println("sb1"+sb1);
    System.out.println("sb2"+sb2);
    System.out.println(sb1=sb2); //true
    
    // 可以添加任何数据
    sb1.append("world");
    sb1.append(true);
    sb1.append(100);
    // 实际开发中可以链式编程
    sb1.append("world").append("true").append(100);
    System.out.println(sb1);
  }
}
// 备注:StringBuilder已经覆盖了重写了Object当中的toString方法

toString方法

// 通过toString方法,StringBuilder对象转为不可变的String对象
public class Demo{
  public static void main(String[] args){
    //链式创建
    StringBuilder sb = new StringBuilder("hello").append("world").append(10);
    // 调用方法
    String s = sb.toString();
    System.out.println(s);
  }
}

7.包装类

概述

基本类型对应的包装类(位于java.lang中)
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

装箱和拆箱

  • 装箱:从基本类型转换为对应的包装类对象
  • 拆箱:从包装类对象转为基本类型

基本数值———>包装类型

Integer i = new Integer(4); //使用构造函数
Integer ii = Integer.valueOf(4); //使用包装类中的valueOf方法

包装对象———>基本数据

int num = i.intValue();

自动装箱和自动拆箱

Integer i = 4; // 装箱 Integer i = Integer.valueOf(4);
i = i+5;// 拆箱 i.intValue() + 5;
// 完毕后,继续装箱

基本类型与字符串之间的转换

基本类型转换为String

基本类型转换String总共有三种方式,查看课后资料可以得知,这里只讲最简单的一种方式:

基本类型直接与””相连接即可;如:34+""

String转换成对应的基本类型

除了Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符串参数转换为对应的基本类型:

  • public static byte parseByte(String s):将字符串参数转换为对应的byte基本类型。
  • public static short parseShort(String s):将字符串参数转换为对应的short基本类型。
  • public static int parseInt(String s):将字符串参数转换为对应的int基本类型。
  • public static long parseLong(String s):将字符串参数转换为对应的long基本类型。
  • public static float parseFloat(String s):将字符串参数转换为对应的float基本类型。
  • public static double parseDouble(String s):将字符串参数转换为对应的double基本类型。
  • public static boolean parseBoolean(String s):将字符串参数转换为对应的boolean基本类型。

代码使用(仅以Integer类的静态方法parseXxx为例)如:

public class Demo18WrapperParse {
    public static void main(String[] args) {
        int num = Integer.parseInt("100");
    }
}

注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出java.lang.NumberFormatException异常。

推荐阅读