kaindy7633/blog

Java基础之常用工具_集合

Opened this issue · 0 comments

API简介

Application Programming Interface,即应用程序编程接口,这里指的是API文档,通常叫:"Java文档",是Java种提供的类的使用说明书

学习API文档,发挥面向对象**,找到Java提供的对象来实现功能,学习API就是学习Java中的类的使用方法

Java中组件的层次结构如下:

模块(Module) --> 包(Package) --> 类或接口(Class/Interface)

什么是模块

模块(Module),是从Java9起提供的一种新的Java基础组件,在包(Package)的基础上又进行了一层封装,是包的容器

  • JavaSE Modules 是Java语言的核心类库,其下的模块名多以java开头

  • JDK Modules 是Java开发工具相关内容,其下的模块名多以jdk开头

Object类

Object类是类层次结构中最顶层的基类,所有类都直接或间接继承自Object类,所以,所有的类都是一个Object(对象)

Object类位于java.base模块 --> java.lang包 --> Object

构造方法

Object类只有一个空参构造方法,Object() {},构造一个对象,所有子类对象初始化时都会优先调用该方法

成员方法

Object类中有很多成员方法,其中最常用的以下4种:

  • hashCode()

    int hashCode() 该方法返回对象的哈希码值,该方法通过对象的地址值进行计算,不同对象的返回值不同

        /**
          *  Object类位于 java.lang 包下,这个包会被默认导入,无需手动导入
          *  Object类下的方法都是非静态方法
          *  所以这些方法必须使用创建的对象调用
          */
         Object obj1 = new Object();
         Object obj2 = new Object();
    
         /**
          *  hashCode方法
          *  不同的对象,返回的hashCode不一样
          */
         int code1 = obj1.hashCode();
         int code2 = obj2.hashCode();
         System.out.println(code1);  // 1915910607
         System.out.println(code2);  // 284720968
  • getClass()

    Class<?> getClass() 该方法返回调用此方法对象的运行时对象(调用者的字节码文件对象)

        /**
          *  Class<?> getClass() 返回该调用者的字节码文件对象
          *  一个类只有一个字节码文件对象
          *  也就是通过该类创建的所有对象调用此方法返回的值都是一样的
          */
         Class cls1 = obj1.getClass();
         Class cls2 = obj2.getClass();
         System.out.println(cls1);  // class java.lang.Object
         System.out.println(cls2);  // class java.lang.Object
  • toString()

    String toString() 该方法返回该对象的字符串表示

        /**
          *  String toString() 该方法返回对象的字符串表示
          *  默认返回的是地址值,不同的对象地址值不一样
          */
         String str1 = obj1.toString();
         String str2 = obj2.toString();
         System.out.println(str1);  // java.lang.Object@723279cf
         System.out.println(str2);  // java.lang.Object@10f87f48
  • equals()

    boolean equals() 该方法返回其他某个对象是否与此对象"相等",默认情况下比较两个对象的引用,建议重写

     /**
      *  boolean equals() 该方法比较两个对象是否相等
      *  该方法比较的是对象在内存种的地址值,但不同对象的地址值都不一样
      *  所以一般子类都会重写该方法
      */
     boolean b1 = obj1.equals(obj2);
     System.out.println(b1);  // false

重写Object类的方法

一般在开发种通常需要将对象转成字符串形式进行传输,或者需要对即将使用的对象进行相等的判断,所以我们需要重写toString方法和equals方法

public class Student {
    private int id;
    private String name;
    private int score;

    public Student() {
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    // 重写 toString 方法,用来将对象转换成对应的字符串形式
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }

    // 重写 equals 方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                score == student.score &&
                Objects.equals(name, student.name);
    }

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

Scanner类

Scanner类就是一个扫描器,能够解析字符串和基本数据类型的数据,它读取用户再设备上的输入,然后将输入值读取到指定的变量中

Scanner类的构造方法很多,最常见的是Scanner(InputStream),它构建一个扫描器对象,从指定输入流中获取数据参数System.in,对应键盘输入

Scanner类的成员方法有:

  • hasNextXxx() 这是一种泛指的写法,比如:hasNextInt()hasNextDouble等,它们用来判断是否还有下一个输入项,其中Xxx表示基本数据类型,返回结果为布尔类型

  • nextXxx() 有判断,就有接收,此方法用来获取下一个输入项,其中Xxx表示任意基本数据类型,返回对应类型的数据,如:nextInt()nextFloat()

  • String nextLine() 用于接收字符串类型的输入,意思是获取下一行数据,以换行符作为分隔符

  • String next() 也是用于接收字符串类型的输入,意思是获取下一个输入项,以空白字符作为分隔符,空白字符包括空格、tab,回车等。

// 创建Scanner对象
// System.in为标准输入流,意为键盘
Scanner sc = new Scanner(System.in);

// 接收整数
if (sc.hasNextInt()) {  // 判断录入的是否为整数
	int num = sc.nextInt();
	System.out.println(num);
}

// 接收字符串
String str = sc.nextLine();
System.out.println(str);

String类

String类表示字符串,每一个字符串对象都时常量。在Java中,常量分为自定义常量和字面值常量,自定义常量通过final关键字定义,字面值常量包含六种,其中就有String

String类位于:java.base模块 --> java.lang包 --> String

String类中的构造方法常用的有两种:

  • String(byte[]) 构造一个String对象,将指定字节数组中的数据转化成字符串

  • String(char[]) 构造一个String对象,将指定字符数组中的数据转化成字符串

/**
 * 使用字节数组构建字符串
 */
byte[] bytes = { 97, 98, 99 };
String s1 = new String(bytes);
System.out.println(s1);  // abc

/**
 * 使用字符数组构建字符串
 */
char[] chars = { 'h', 'e', 'l', 'l', 'o' };
String s2 = new String(chars);
System.out.println(s2);  // hello

/**
 * 在实际开发中,一般可以直接定义字符串对象
 */
String str = "Hello World";

String类的常用成员方法

  • boolean equals(String) 判断当前字符串与给定字符串是否相同,区分大小写

  • boolean equalsIgnoreCase(String) 判断当前字符串与给定字符串是否形同,它时不区分大小写的

  • boolean startsWith(String) 判断字符串是否以给定的字符串开头

  • boolean isEmpty(String) 判断给定字符串是否为空

更多String类方法可以查看官方API文档 String类文档

/**
 * 判断两个字符串对象是否相同
 */
String str1 = "abc";
String str2 = "ABC";
boolean b1 = str1.equals(str2);  // 区分大小写 返回false

boolean b2 = str1.equalsIgnoreCase(str2);  // 不区分大小写 返回true

/**
 * 判断字符串对象是否以特定字符串开头
 */
boolean b3 = str1.startsWith("a");  // 是否以a开头,返回 true

/**
 * 判断字符串是否为空
 */
boolean b4 = str1.isEmpty();  // false

String类中包含获取功能的成员方法

  • int length() 获取字符串的长度

  • char charAt(int index) 获取指定索引位置的字符

  • int indexOf(String) 获取指定字符或字符串在当前字符串中第一次出现的索引,未找到返回-1

  • int lastIndexOf(String) 获取指定字符或字符串在当前字符串中最后一次出现的索引,未找到返回-1

  • String substring(int) 获取指定索引位置(含)之后的字符串

  • String substring(int, int) 获取从索引start位置(含)起至索引end位置(不含)的字符串

String类中操作字符串的成员方法

  • byte[] getByte() 将字符串转换成字节数组

  • char[] toCharArray() 将字符串转换成字符数组

  • static String valueOf() 将指定类型数据转换成字符串

  • String replace(old, new) 将指定字符(串)替换成新的字符(串)

  • String[] split(String) 切割字符串,返回切割后的字符串数据,源字符串不变

  • String trim() 去除字符串两端的空白字符

StringBuilder和StringBuffer类

StringBuilderStringBuffer类都是可变字符序列,用于构造字符串对象,它们内部使用自动扩容的数组操作字符串数据,它们也使用相同的API

在实际应用场景中,StringBuilder由于效率更高,所以一般都使用StringBuilder

构造方法

  • StringBuidler() 空参构造方法,构造一个空的StringBuilder容器

  • StringBuidler(String) 构造一个StringBuilder容器,并添加指定字符串

/**
 * 创建StringBuilder容器
 */
StringBuilder sb = new StringBuilder();
sb.append("abc");  // 返回自身

/**
 * 使用带参构造
 */
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb2);  // abc

成员方法

  • StringBuidler append(...) 将任意数据添加到StringBuilder容器中

  • String toString() 将当前StringBuilder容器转换成字符串

Date和Calendar类

Date类和Calendar类分别用于处理日期和日历,都是用于操作日期相关信息的

Date类的构造方法

  • Date() 空参构造,构造一个日期对象,值为系统时间,精确到毫秒

  • Date(long) 带参构造,构造一个日期对象,值为自"1970年1月1日 00:00:00"起至指定参数的毫秒数

Date类和Caleander类的成员方法

  • long getTime() 该方法将日期对象转换成对应时间的毫秒值

  • static Calendar getInstance() 该方法根据当前系统时区和语言环境获取日历对象

  • int get(int field) 该方法返回给定日历字段的值

  • void set(int field, int value) 该方法将给定的日历字段设置为指定的值

/**
 *  Date类
 */
Date date = new Date();
System.out.println(date);  // Tue May 17 19:07:31 CST 2015

// 获取毫秒值
System.out.println(date.getTime());  // 1431860869000

/**
 *  指定时间
 */
Date l = new Date(1431860869000L);
System.out.println(l);  // Sun May 17 19:07:49 CST 2015
/**
 *  通过静态方法getInstance创建Caleandar对象
 */
Calendar cd = Calendar.getInstance();

// 通过get方法获取年月日等信息
int year = cd.get(Calendar.YEAR);
int month = cd.get(Calendar.MONTH);
int day = cd.get(Calendar.DATE);

基本类型的包装类

由于基本类型不是对象,不能通过它来调用方法,所以Java针对基本类型提供了对应的包装类,以对象的形式来使用

基本类型 所对应包装类
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
boolean Boolean

包装类有两个概念要了解:

  • 装箱: 装箱就是把基本类型转换成包装类型(对象类型)

  • 拆箱: 拆箱就是把包装类型转换成基本类型

成员方法

包装类的功能就是将字符串类型的数据转换成对应的基本类型,如:static 基本类型 parseXxx(String)

/**
 * 装箱操作,将基本数据类型转换成引用类型
 */
// Integer it = new Integer(100);  此方式已过时,使用下面的方式
Integer it = 100;

/**
 * 拆箱操作
 */
int newIt = it.intValue();  // 100

/**
 * 将字符串类型的值转换成整数
 */
String s = "100";
int num = Integer.parseInt(s);