Java学习笔记(No.14)

Java常用类(No.14)

Java常用类(Common Class)主要是解决某一方面的问题。其包括:“Object类、Boolean类、Character类、Byte类、Short类、Integer类、Long类、Float类、Double类、Date类、Calendar类、LocalDate类、LocalTime类、LocalDateTime类、DateFormat类、SimpleDateFormat类、DateTimeFormatter类、Array类、String类、StringBuffer类、StringBuilder类、Math类、File类、Enum类”等

1、Object类(Object Class)

Object类是所有Java类的根基类,若在类的声明中未使用“extends”关键字指明其基类,则默认其基类为“Object类”。其包括:“toString方法、hashCode方法、equals方法、clone方法、getClass方法(用于“反射”)、wait方法(有三种形式(用于“多线程”),如:“wait()、wait(long timeout)、wait(long timeout,int nanos)”)、notify方法(用于“多线程”)、notifyAll方法(用于“多线程”)、finalize方法(用于“GC”)”

1.1、toString方法(toString Method)

  • 1.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass;
/**
 * 打印对象的时候默认调用当前对象的toString方法;
 * 若不重写toString方法,则默认调用Object类的toString方法;
 * 一般建议通过系统自动生成重写toString方法的代码,尽量不要手写,不然容易出错。
 */
public class ToStringMethod {
    public static void main(String[] args) {
        User user1 = new User();
        user1.id="001";
        user1.name="学山学海";
        System.out.println(user1);//等价于System.out.println(user1.toString());
        User user2 = new User();
        System.out.println(user2);//等价于System.out.println(user2.toString());
    }
}
class User{
    public String id;
    public String name;
    public String password;
    //重写toString方法
    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
  • 1.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

User{id='001', name='学山学海'}
User{id='null', name='null'}
  • 1.1.3、注意事项(Matters Needing Attention)
    • 1.1.3.1、打印对象的时候默认调用当前对象的toString方法
    • 1.1.3.2、若不重写toString方法,则默认调用Object类的toString方法
    • 1.1.3.3、一般建议通过系统自动生成重写toString方法的代码,尽量不要手写,不然容易出错

1.2、hashCode方法(hashCode Method)

  • 1.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.object;
import java.util.Objects;//导入工具类“Objects”
/**
 *Object类定义的hashCode方法确实为不同的对象返回不同的整数,即使用Object类hashCode方法来确定对象的唯一性;
 *Object类的hashCode有时就是对象在内存中的地址(类似于从引用类型到int类型的转换);
 *写代码时要注意hashCode不要相同,尽量将其进行散列(即,哈希);
 */
public class HashCodeMethod {
    public static void main(String[] args) {
        Person person = new Person();
        person.id=1;
        person.name="学山学海";
        System.out.println("person.hashCode()结果为:"+person.hashCode());//调用Person类重写的hashCode方法
    }
}
class Person{
    public int id;
    public String name;
//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        Person person = (Person) o;
//        return id == person.id && Objects.equals(name, person.name);
//    }
    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
}
  • 1.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

person.hashCode()结果为:720546236

1.2.3、注意事项(Matters Needing Attention)

  • 1.2.3.1、Object类定义的hashCode方法确实为不同的对象返回不同的整数,即使用Object类hashCode方法来确定对象的唯一性
  • 1.2.3.2、Object类的hashCode有时就是对象在内存中的地址(类似于从引用类型到int类型的转换)
  • 1.2.3.3、写代码时要注意hashCode不要相同,尽量将其进行散列(即,哈希)

1.3、equals方法(equals Method)

1.3.1、equals常规对象比较(Equals General Object Comparison)
  • 1.3.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass;
import java.util.Objects;
//基本数据类型(如:int类型数据)使用equals方法比较的是两者间值是否相等
public class EqualsMethod {
    public static void main(String[] args) {
        Scientist scientist1 = new Scientist(1, "袁爷爷", "中国杂交水稻之父");
        Scientist scientist2 = new Scientist(1, "袁隆平", "世界杂交水稻之父");
        Star star1 = new Star(2, "马尔泰.若曦", "明星");
        Star star2 = new Star(2, "张晓", "偶像");
        System.out.println("Scientist类已重写equals方法:");
        System.out.println("==================================================");
        System.out.println("scientist1==scientist2结果为:" + (scientist1 == scientist2));//比较的是对象内存地址,而不是对象属性中具体的值
        System.out.println("scientist1.equals(scientist2)结果为:" + (scientist1.equals(scientist2)));//已重写Scientist类equals方法时,则调用Scientist类equals自定义方法比较对象属性中具体的值
        System.out.println("==================================================");
        System.out.println("Star类未重写equals方法:");
        System.out.println("==================================================");
        System.out.println("star1==star2结果为:" + (star1 == star2));//比较对象内存地址,而不是对象属性中具体的值
        System.out.println("star1.equals(star2)结果为:" + (star1.equals(star2)));//未重写Star类equals方法时,默认调用Object类equals方法比较对象内存地址
        System.out.println("==================================================");
    }
}
class Scientist {
    public int idCard;
    public String name;
    public String characterDescription;
    //声明有参构造方法
    public Scientist(int idCard, String name, String characterDescription) {
        this.idCard = idCard;
        this.name = name;
        this.characterDescription = characterDescription;
    }
    //重写equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Scientist scientist = (Scientist) o;
        return idCard == scientist.idCard;
    }
    //重写hashCode方法
    @Override
    public int hashCode() {
        return Objects.hash(idCard);
    }
}
class Star {
    public int idCard;
    public String name;
    public String characterDescription;
    //声明有参构造方法
    public Star(int idCard, String name, String characterDescription) {
        this.idCard = idCard;
        this.name = name;
        this.characterDescription = characterDescription;
    }
}
  • 1.3.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

Scientist类已重写equals方法:
==================================================
scientist1==scientist2结果为:false
scientist1.equals(scientist2)结果为:true
==================================================
Star类未重写equals方法:
==================================================
star1==star2结果为:false
star1.equals(star2)结果为:false
==================================================
1.3.2、equals深化组合对象比较(Equals Deepen Combination Object Comparison)
  • 1.3.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass;
import java.util.Objects;
/**
 *比较的对象如果是一个组合关系,切记要重写自定义属性类的equals方法,否则会默认调用Object类的equals方法
 */
public class EqualsDeepenMethod {
    public static void main(String[] args) {
        Computer computer1 = new Computer(1,"鸿蒙",new Cpu(11,"龙芯1"));
        Computer computer2 = new Computer(1,"鸿蒙",new Cpu(11,"龙芯2"));
        System.out.println("重写Computer类与Cpu类自定义属性equals方法:");
        System.out.println("=================================================");
        System.out.println("computer1==computer2结果为:"+(computer1==computer2));//比较对象内存地址
        System.out.println("computer1.equals(computer2)结果为:"+(computer1.equals(computer2)));//比较对象属性值
        System.out.println("=================================================");
    }
}
class Computer{
    public int id;
    public String name;
    public Cpu cpu;
    //有参构造方法
    public Computer(int id, String name, Cpu cpu) {
        this.id = id;
        this.name = name;
        this.cpu = cpu;
    }
    //重写equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Computer computer = (Computer) o;
        return id == computer.id && Objects.equals(name, computer.name) && Objects.equals(cpu, computer.cpu);
    }
    //重写hashCode方法
    @Override
    public int hashCode() {
        return Objects.hash(id, name, cpu);
    }
}
class Cpu{
    public int id;
    public String name;
    //有参构造方法
    public Cpu(int id, String name) {
        this.id = id;
        this.name = name;
    }
    //重写equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Cpu cpu = (Cpu) o;
        return id == cpu.id;
    }
    //重写hashCode方法
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
  • 1.3.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

重写Computer类与Cpu类自定义属性equals方法:
=================================================
computer1==computer2结果为:false
computer1.equals(computer2)结果为:true
=================================================
1.3.3、equals和hashCode的羁绊(The Fetter Of Equals And hashCode)
  • 1.3.3.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass;
import java.util.Objects;
/**
 *若两个对象equals(即,相等),则它们的hashCode(即,哈希码)一定相等;
 *若两个对象hashCode(即,哈希码)相等,则它们不一定equals(即,相等),需先验证hashCode,再验证equals。如:“超过hashCode最大值时”
 */
public class EqualsAndHashcode {
    public static void main(String[] args) {
        Water water1 = new Water(1,"湖水");
        Water water2 = new Water(1,"海水");
        System.out.println("water1.hashCode()结果为:"+water1.hashCode());
        System.out.println("water2.hashCode()结果为:"+water2.hashCode());
        System.out.println("water1.equals(water2)结果为:"+water1.equals(water2));
    }
}
class Water{
    public int id;
    public String name;
    public Water(int id, String name) {
        this.id = id;
        this.name = name;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Water water = (Water) o;
        return id == water.id;
    }
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
  • 1.3.3.2、运行结果(Run Result)

其运行结果,如以下信息所示

water1.hashCode()结果为:32
water2.hashCode()结果为:32
water1.equals(water2)结果为:true
1.3.4、注意事项(Matters Needing Attention)
  • 1.3.4.1、基本数据类型(如:int类型数据)使用equals方法比较的是两者间值是否相等
  • 1.3.4.2、未重写该类自定义属性的equals方法时,则默认调用Object类equals方法比较两者间对象内存地址是否相等
  • 1.3.4.3、重写该类自定义属性的equals方法时,则调用该类自定义属性的equals方法比较两者间对象属性的具体值是否相等
  • 1.3.4.4、若比较的对象是一个组合关系,切记要重写自定义属性类的equals方法,否则会默认调用Object类的equals方法
  • 1.3.4.5、若两个对象equals(即,相等),则它们的hashCode(即,哈希码)一定相等
  • 1.3.4.6、若两个对象hashCode(即,哈希码)相等,则它们不一定equals(即,相等),需先验证hashCode,再验证equals。如:“超过hashCode最大值时”
  • 1.3.4.7、创建类时,建议尽量重写toString、equals、hashCode方法

1.4、clone方法(Clone Method)

1.4.1、常规克隆(General Clone)
  • 1.4.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.object;
import java.util.Objects;
/**
 * 克隆一个类的对象时,首先要实现这个类的Cloneable接口,然后重写Object类的clone方法,且必须提高其访问权限(由“protected”更改为“public”)
 */
public class CloneGeneralMethod {
    public static void main(String[] args) throws CloneNotSupportedException {
        Fire fire1 = new Fire(1, "柴火");
        Fire fire2 = (Fire) fire1.clone();//调用Fire类重写的clone方法
        System.out.println("fire1==fire2结果为:"+(fire1==fire2));//比较对象内存地址
        System.out.println("fire1.equals(fire2)结果为:"+fire1.equals(fire2));//比较对象属性值
    }
}
class Fire implements Cloneable {
    public int id;
    public String name;
    //有参构造方法
    public Fire(int id, String name) {
        this.id = id;
        this.name = name;
    }
    //重写toString方法
    @Override
    public String toString() {
        return "Fire{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
    //重写equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Fire fire = (Fire) o;
        return id == fire.id && Objects.equals(name, fire.name);
    }
    //重写hashCode方法
    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
    //重写clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
  • 1.4.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

fire1==fire2结果为:false
fire1.equals(fire2)结果为:true
1.4.2、浅度克隆(Shallow Clone)
  • 1.4.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.object;
public class CloneShallowMethod {
    public static void main(String[] args) throws CloneNotSupportedException {
        Car car1 = new Car(1, new Engine(11, "卓越"), new Tire(22, "正新"));
        Car car2= (Car) car1.clone();
        System.out.println("clone方法的浅度克隆:");
        System.out.println("===========================================");
        System.out.println("car1.toString()结果为:"+car1.toString());
        System.out.println("car2.toString()结果为:"+car2.toString());
        System.out.println("===========================================");
    }
}
class Car implements Cloneable{
    public int id;
    public Engine engine;
    public Tire tire;
    public Car(int id, Engine engine, Tire tire) {
        this.id = id;
        this.engine = engine;
        this.tire = tire;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", engine=" + engine +
                ", tire=" + tire +
                '}';
    }
}
class Engine{
    public int eid;
    public String name;
    public Engine(int eid, String name) {
        this.eid = eid;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Engine{" +
                "eid=" + eid +
                ", name='" + name + '\'' +
                '}';
    }
}
class Tire{
    public int tid;
    public String name;
    public Tire(int tid, String name) {
        this.tid = tid;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Tire{" +
                "tid=" + tid +
                ", name='" + name + '\'' +
                '}';
    }
}
  • 1.4.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

clone方法的浅度克隆:
===========================================
car1.toString()结果为:Car{id=1, engine=Engine{eid=11, name='卓越'}, tire=Tire{tid=22, name='正新'}}
car2.toString()结果为:Car{id=1, engine=Engine{eid=11, name='卓越'}, tire=Tire{tid=22, name='正新'}}
===========================================
1.4.3、深度克隆(Deep Clone)
  • 1.4.3.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.object;
public class CloneDeepMethod {
    public static void main(String[] args) throws CloneNotSupportedException {
        CarDeep carDeep1 = new CarDeep(1, new EngineDeep(11, "卓越"), new TireDeep(22, "正新"));
        CarDeep carDeep2= (CarDeep) carDeep1.clone();
        System.out.println("clone方法的深度克隆:");
        System.out.println("===========================================");
        System.out.println("carDeep1.toString()结果为:"+carDeep1.toString());
        System.out.println("carDeep2.toString()结果为:"+carDeep2.toString());
        System.out.println("===========================================");
        System.out.println("将carDeep1.engine.name=\"极致\"后:");
        carDeep1.engine.name="极致";
        System.out.println("===========================================");
        System.out.println("carDeep1.toString()结果为:"+carDeep1.toString());
        System.out.println("carDeep2.toString()结果为:"+carDeep2.toString());
        System.out.println("===========================================");
        System.out.println("将carDeep1.tire.name=\"米其林\"后:");
        carDeep1.tire.name="米其林";
        System.out.println("===========================================");
        System.out.println("carDeep1.toString()结果为:"+carDeep1.toString());
        System.out.println("carDeep2.toString()结果为:"+carDeep2.toString());
        System.out.println("===========================================");
    }
}
class CarDeep implements Cloneable{
    public int id;
    public EngineDeep engine;
    public TireDeep tire;
    //有参构造方法
    public CarDeep(int id, EngineDeep engine, TireDeep tire) {
        this.id = id;
        this.engine = engine;
        this.tire = tire;
    }
    //重写clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        CarDeep carD= (CarDeep) super.clone();//CarDeep类中对象carD的浅度克隆
        carD.engine= (EngineDeep) this.engine.clone();//CarDeep类中使用类EngineDeep对象engine的深度克隆
        carD.tire= (TireDeep) this.tire.clone();//CarDeep类中使用类TireDeep对象tire的深度克隆
        return carD;//返回CarDeep类中对象carD
    }
    //重写toString方法
    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", engine=" + engine +
                ", tire=" + tire +
                '}';
    }
}
class EngineDeep implements Cloneable{
    public int eid;
    public String name;
    //有参构造方法
    public EngineDeep(int eid, String name) {
        this.eid = eid;
        this.name = name;
    }
    //重写toString方法
    @Override
    public String toString() {
        return "Engine{" +
                "eid=" + eid +
                ", name='" + name + '\'' +
                '}';
    }
    //重写clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class TireDeep implements Cloneable{
    public int tid;
    public String name;
    //有参构造方法
    public TireDeep(int tid, String name) {
        this.tid = tid;
        this.name = name;
    }
    //重写toString方法
    @Override
    public String toString() {
        return "Tire{" +
                "tid=" + tid +
                ", name='" + name + '\'' +
                '}';
    }
    //重写clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
  • 1.4.3.2、运行结果(Run Result)

其运行结果,如以下信息所示

clone方法的深度克隆:
===========================================
carDeep1.toString()结果为:Car{id=1, engine=Engine{eid=11, name='卓越'}, tire=Tire{tid=22, name='正新'}}
carDeep2.toString()结果为:Car{id=1, engine=Engine{eid=11, name='卓越'}, tire=Tire{tid=22, name='正新'}}
===========================================
将carDeep1.engine.name="极致"后:
===========================================
carDeep1.toString()结果为:Car{id=1, engine=Engine{eid=11, name='极致'}, tire=Tire{tid=22, name='正新'}}
carDeep2.toString()结果为:Car{id=1, engine=Engine{eid=11, name='卓越'}, tire=Tire{tid=22, name='正新'}}
===========================================
将carDeep1.tire.name="米其林"后:
===========================================
carDeep1.toString()结果为:Car{id=1, engine=Engine{eid=11, name='极致'}, tire=Tire{tid=22, name='米其林'}}
carDeep2.toString()结果为:Car{id=1, engine=Engine{eid=11, name='卓越'}, tire=Tire{tid=22, name='正新'}}
===========================================
1.4.4、注意事项(Matters Needing Attention)
  • 1.4.4.1、克隆一个类的对象时,首先要实现这个类的Cloneable接口,然后重写Object类的clone方法,且必须提高其访问权限(由“protected”更改为“public”)
  • 1.4.4.2、浅度克隆一个类的对象时,只需要实现这个类的Cloneable接口,然后重写Object类的clone方法,且必须提高其访问权限(由“protected”更改为“public”)
  • 1.4.4.3、深度克隆一个类的对象时,需要全部实现这个类以及类中其它使用类的Cloneable接口,然后分别都重写Object类的clone方法,且必须提高其访问权限(由“protected”更改为“public”)

2、包装类(Wrapper Class)

由于Java中的基本数据类型不是面向对象的,有时候不方便将其转换成对象进行操作,因此Java专门为八种基本数据类型分别设计了各自对应的类,而这八种类统称为“包装类(Wrapper Class)”

八大基本数据类型及其包装类的对应关系如下表所示

基本数据类型包装类
byteByte
booleanBoolean
shortShort
charCharacter
intInteger
longLong
floatFloat
doubleDouble
2.1、包装类常见属性与方法(Common Properties And Methods Of Wrapper Class)
  • 2.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.wrapper;
public class CommonPropertiesAndMethods {
    public static void main(String[] args) {
        Integer i=123;//int类型数据
        System.out.println("调用Integer包装类对象的toString方法:");
        System.out.println("=================================");
        System.out.println("i.toString()结果为:"+i.toString());
        System.out.println("=================================");
        String s1="1";//String类型数据
        String s2="2";//String类型数据
        System.out.println("调用Integer包装类对象的parseInt方法:");
        System.out.println("=================================");
        System.out.println("(s1+s2)结果为:"+(s1+s2));
        System.out.println("(Integer.parseInt(s1)+Integer.parseInt(s2))结果为:"+(Integer.parseInt(s1)+Integer.parseInt(s2)));//将String类型数据转换成int类型数据
        System.out.println("=================================");
        System.out.println("调用Integer包装类的MIN_VALUE与MAX_VALUE属性:");
        System.out.println("=================================");
        System.out.println("(Integer.MIN_VALUE)结果为:"+(Integer.MIN_VALUE));//Integer包装类最小值
        System.out.println("(Integer.MAX_VALUE)结果为:"+(Integer.MAX_VALUE));//Integer包装类最大值
        System.out.println("=================================");
        System.out.println("调用Integer包装类的TYPE属性:");
        System.out.println("=================================");
        System.out.println("(Integer.TYPE)结果为:"+(Integer.TYPE));//Integer包装类的类型
        System.out.println("=================================");
        System.out.println("调用Integer包装类的toBinaryString静态方法:");
        System.out.println("=================================");
        System.out.println("(Integer.toBinaryString(i))结果为:"+(Integer.toBinaryString(i)));//将10进制int类型数据转换成2进制int类型数据
        System.out.println("=================================");
        System.out.println("调用Integer包装类的toOctalString静态方法:");
        System.out.println("=================================");
        System.out.println("(Integer.toOctalString(i))结果为:"+(Integer.toOctalString(i)));//将10进制int类型数据转换成8进制int类型数据
        System.out.println("=================================");
        System.out.println("调用Integer包装类的toHexString静态方法:");
        System.out.println("=================================");
        System.out.println("(Integer.toHexString(i))结果为:"+(Integer.toHexString(i)));//将10进制int类型数据转换成16进制int类型数据
        System.out.println("=================================");
        String s3="1.2";//String类型数据
        String s4="3.4";//String类型数据
        System.out.println("调用Double包装类对象的parseDouble方法:");
        System.out.println("=================================");
        System.out.println("(s3+s4)结果为:"+(s3+s4));
        System.out.println("(Double.parseDouble(s3)+Double.parseDouble(s4))结果为:"+(Double.parseDouble(s3)+Double.parseDouble(s4)));//将String类型数据转换成double类型数据
        System.out.println("=================================");
        System.out.println("调用Double包装类的MIN_VALUE与MAX_VALUE属性:");
        System.out.println("=================================");
        System.out.println("(Double.MIN_VALUE)结果为:"+(Double.MIN_VALUE));//Double包装类最小值
        System.out.println("(Double.MAX_VALUE)结果为:"+(Double.MAX_VALUE));//Double包装类最大值
        System.out.println("=================================");
        System.out.println("调用Double包装类的TYPE属性:");
        System.out.println("=================================");
        System.out.println("(Double.TYPE)结果为:"+(Double.TYPE));//Double包装类的类型
        System.out.println("=================================");
        char c1='1';//char类型数据
        char c2='a';//char类型数据
        System.out.println("调用Character包装类对象的isDigit方法:");
        System.out.println("=================================");
        System.out.println("(Character.isDigit(c1))结果为:"+(Character.isDigit(c1)));//判断char类型数据是否为数字
        System.out.println("(Character.isDigit(c2))结果为:"+(Character.isDigit(c2)));//判断char类型数据是否为数字
        System.out.println("=================================");
        System.out.println("调用Character包装类的MIN_VALUE与MAX_VALUE属性:");
        System.out.println("=================================");
        System.out.println("((int)(Character.MIN_VALUE))结果为:"+((int)(Character.MIN_VALUE)));//Character包装类最小值
        System.out.println("((int)(Character.MAX_VALUE))结果为:"+((int)(Character.MAX_VALUE)));//Character包装类最大值
        System.out.println("=================================");
        System.out.println("调用Character包装类的TYPE属性:");
        System.out.println("=================================");
        System.out.println("(Character.TYPE)结果为:"+(Character.TYPE));//Character包装类的类型
        System.out.println("=================================");
//        System.out.println(i.hashCode()+"---"+Integer.valueOf(i).hashCode());
    }
}
  • 2.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

调用Integer包装类对象的toString方法:
=================================
i.toString()结果为:123
=================================
调用Integer包装类对象的parseInt方法:
=================================
(s1+s2)结果为:12
(Integer.parseInt(s1)+Integer.parseInt(s2))结果为:3
=================================
调用Integer包装类的MIN_VALUE与MAX_VALUE属性:
=================================
(Integer.MIN_VALUE)结果为:-2147483648
(Integer.MAX_VALUE)结果为:2147483647
=================================
调用Integer包装类的TYPE属性:
=================================
(Integer.TYPE)结果为:int
=================================
调用Integer包装类的toBinaryString静态方法:
=================================
(Integer.toBinaryString(i))结果为:1111011
=================================
调用Integer包装类的toOctalString静态方法:
=================================
(Integer.toOctalString(i))结果为:173
=================================
调用Integer包装类的toHexString静态方法:
=================================
(Integer.toHexString(i))结果为:7b
=================================
调用Double包装类对象的parseDouble方法:
=================================
(s3+s4)结果为:1.23.4
(Double.parseDouble(s3)+Double.parseDouble(s4))结果为:4.6
=================================
调用Double包装类的MIN_VALUE与MAX_VALUE属性:
=================================
(Double.MIN_VALUE)结果为:4.9E-324
(Double.MAX_VALUE)结果为:1.7976931348623157E308
=================================
调用Double包装类的TYPE属性:
=================================
(Double.TYPE)结果为:double
=================================
调用Character包装类对象的isDigit方法:
=================================
(Character.isDigit(c1))结果为:true
(Character.isDigit(c2))结果为:false
=================================
调用Character包装类的MIN_VALUE与MAX_VALUE属性:
=================================
((int)(Character.MIN_VALUE))结果为:0
((int)(Character.MAX_VALUE))结果为:65535
=================================
调用Character包装类的TYPE属性:
=================================
(Character.TYPE)结果为:char
=================================
2.2、包装类创建方法与自动装箱拆箱(Creating Methods And Autoboxing Unboxing of Wrapper Class)
  • 2.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.wrapper;
public class CreatingMethodsAndAutoboxingUnboxing {
    public static void main(String[] args) {
        //创建包装类对象
        System.out.println("创建包装类对象");
        System.out.println("========================");
        Integer i1=new Integer(1);//装箱
        System.out.println("装箱:i1="+i1);
        Integer i2=new Integer("2");//装箱
        System.out.println("装箱:i2="+i2);
        Integer i3=3;//自动装箱
        System.out.println("自动装箱:i3="+i3);
        Integer i4=Integer.valueOf(4);//装箱
        System.out.println("装箱:i4="+i4);
        Integer i5=Integer.valueOf("5");//装箱
        System.out.println("装箱:i5="+i5);
        Integer i6=Integer.valueOf("1001",2);//装箱
        System.out.println("装箱:i6="+i6);
        Integer i7=Integer.valueOf("1001",8);//装箱
        System.out.println("装箱:i7="+i7);
        Integer i8=Integer.valueOf("8",10);//装箱
        System.out.println("装箱:i8="+i8);
        Integer i9=Integer.valueOf("1001",16);//装箱
        System.out.println("装箱:i9="+i9);
        System.out.println("========================");
        System.out.println("创建基本类型数据");
        System.out.println("========================");
        int ii1=Integer.valueOf(111);//自动拆箱
        System.out.println("自动拆箱:ii1="+ii1);
        int ii2=Integer.valueOf("112");//自动拆箱
        System.out.println("自动拆箱:ii2="+ii2);
        int ii3=Integer.valueOf("1001",2);//自动拆箱
        System.out.println("自动拆箱:ii3="+ii3);
        int ii4=Integer.valueOf("1001",8);//自动拆箱
        System.out.println("自动拆箱:ii4="+ii4);
        int ii5=Integer.valueOf("8",10);//自动拆箱
        System.out.println("自动拆箱:ii5="+ii5);
        int ii6=Integer.valueOf("1001",16);//自动拆箱
        System.out.println("自动拆箱:ii6="+ii6);
        int ii7=Integer.valueOf(117).intValue();//拆箱
        System.out.println("拆箱:ii7="+ii7);
        System.out.println("========================");
    }
}
  • 2.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

创建包装类对象
========================
装箱:i1=1
装箱:i2=2
自动装箱:i3=3
装箱:i4=4
装箱:i5=5
装箱:i6=9
装箱:i7=513
装箱:i8=8
装箱:i9=4097
========================
创建基本类型数据
========================
自动拆箱:ii1=111
自动拆箱:ii2=112
自动拆箱:ii3=9
自动拆箱:ii4=513
自动拆箱:ii5=8
自动拆箱:ii6=4097
拆箱:ii7=117
========================
2.3、缓存(Cache)
  • 2.3.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.wrapper;
public class CacheInteger {
    public static void main(String[] args) {
        System.out.println("整型缓存(IntegerCache)");
        System.out.println("=====================================");
        //使用Integer类默认缓存创建对象,Integer类缓存区间"-128~127"
        Integer i1 = Integer.valueOf(1);
        Integer i2 = Integer.valueOf(1);
        System.out.println("(i1==i2)结果为:"+(i1 == i2));
        /**
         *自动装箱默认使用Integer类“valueOf”方法在缓存中创建Integer类对象,且缓存可以节省自动装箱创建Integer类对象的空间,
         *若超过缓存区间范围时,则使用“new Integer类名称”方法在堆内存中创建Integer类对象
         */
        Integer i11 = -128;//自动装箱默认使用Integer类“valueOf”方法在缓存中创建Integer类对象
        Integer i12 = -128;//自动装箱默认使用Integer类“valueOf”方法在缓存中创建Integer类对象
        System.out.println("(i11==i12)结果为:"+(i11 == i12));
        Integer i21 = 128;//超过缓存区间范围时,则使用“new Integer类名称”方法在堆内存中创建Integer类对象
        Integer i22 = 128;//超过缓存区间范围时,则使用“new Integer类名称”方法在堆内存中创建Integer类对象
        System.out.println("(i21==i22)结果为:"+(i21 == i22));
        //不会使用缓存,每次都是在堆内存中创建Integer类对象
        Integer i3=new Integer(1);
        Integer i4=new Integer(1);
        System.out.println("(i3==i4)结果为:"+(i3 == i4));
        System.out.println("=====================================");
    }
}
  • 2.3.2、运行结果(Run Result)

其运行结果,如以下信息所示

整型缓存(IntegerCache)
=====================================
(i1==i2)结果为:true
(i11==i12)结果为:true
(i21==i22)结果为:false
(i3==i4)结果为:false
=====================================
2.4、注意事项(Matters Needing Attention)
  • 2.4.1、装箱就是把一个基本数据类型转换为其对应包装类的对象
  • 2.4.2、拆箱就是把一个包装类的对象转换为其对应基本数据类型
  • 2.4.3、自动装箱与拆箱的功能就是所谓的“编译器蜜糖(Compiler Sugar,也称“语法糖(Syntactic sugar,也译为糖衣语法)”)”,但同时要避免拆箱时的空指针异常(NullPointerException),即,千万不要让包装类对象为空(Null)时拆箱
  • 2.4.4、自动装箱默认使用包装类“valueOf”方法在缓存中创建包装类对象,且缓存可以节省自动装箱创建包装类对象的空间,若超过缓存区间范围时,则使用“new 包装类名称”方法在堆内存中创建包装类对象

3、日期时间相关类(Date Time Related Class)

计算机中并不会存储日期时间格式的数据(如:“1970/01/01 00:00:00”),时间在计算中就是一个数字,以毫秒为单位

3.1、Date类(Date Class)

Date类,也称“日期时间类”

  • 3.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.datetime;
import java.util.Date;
public class DateClass {
    public static void main(String[] args) {
        //获取当前系统时间
        Date date1 = new Date();
        System.out.println("date1.toString()结果为:" + date1.toString());
        //获取指定时间
        Date date2 = new Date(1000L * 60 * 60 * 24 * (365 * 51 + 13));
        System.out.println("date2.toString()结果为:" + date2.toString());
        //日期时间类对象的比较
        Date date3 = new Date();
        Date date4 = new Date();
        System.out.println("(date3==date4)结果为:"+(date3 == date4));//比较对象内存地址
        System.out.println("(date3.equals(date4))结果为:"+(date3.equals(date4)));//比较对象属性值(即,时间毫秒数是否一致)
        System.out.println("(date3.hashCode()==date4.hashCode())结果为:"+(date3.hashCode()==date4.hashCode()));//若比较对象equals,则对象hashCode也相等,否则对象hashCode不相等
        //日期时间类对象的哈希码值
        System.out.println("date3.hashCode()结果为:"+date3.hashCode());
        System.out.println("date4.hashCode()结果为:"+date4.hashCode());
        //获取时间对应的毫秒数
        System.out.println("date1.getTime()结果为:" + date1.getTime());
        System.out.println("date2.getTime()结果为:" + date2.getTime());
        System.out.println("date3.getTime()结果为:" + date3.getTime());
        System.out.println("date4.getTime()结果为:" + date4.getTime());
    }
}
  • 3.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

date1.toString()结果为:Fri Jun 25 09:29:27 CST 2021
date2.toString()结果为:Fri Jan 01 08:00:00 CST 2021
(date3==date4)结果为:false
(date3.equals(date4))结果为:true
(date3.hashCode()==date4.hashCode())结果为:true
date3.hashCode()结果为:1086929819
date4.hashCode()结果为:1086929819
date1.getTime()结果为:1624584567508
date2.getTime()结果为:1609459200000
date3.getTime()结果为:1624584567521
date4.getTime()结果为:1624584567521

3.2、Calendar类(Calendar Class)

Calendar类,也称“日历类”

  • 3.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.datetime;
import java.util.Calendar;
import java.util.Date;
public class CalendarClass {
    public static void main(String[] args) {
        /**
         *不推荐使用:已弃用,获取Date类指定的日期时间属性值(格式:"xxxx年xx月xx日xx时xx分xx秒")
         *Date date = new Date();
         *System.out.println(date.getYear()+"年"+date.getMonth()+"月"+date.getDay()+"日"+date.getHours()+"时"+date.getMinutes()+"分"+date.getSeconds()+"秒");
         */
        //创建Calendar类对象实例
        Calendar calendar=Calendar.getInstance();
        //System.out.println("calendar.toString()结果为:"+calendar.toString());
        //推荐使用:获取Calendar类指定的日期时间属性值(格式:"xxxx年xx月xx日xx时xx分xx秒")
        calendar.set(2021,1,1,1,1,1);//使用Calendar类set方法设置指定时间
        System.out.println("使用Calendar类get方法获取Calendar类set方法设置的时间(年月日时分秒):");
        System.out.println("==============================================");
        System.out.println(calendar.get(Calendar.YEAR)+"年"+(calendar.get(Calendar.MONTH)+1)+"月"+calendar.get(Calendar.DAY_OF_MONTH)+"日"+calendar.get(Calendar.HOUR_OF_DAY)+"时"+calendar.get(Calendar.MINUTE)+"分"+calendar.get(Calendar.SECOND)+"秒"+calendar.get(Calendar.MILLISECOND)+"毫秒");
        System.out.println("==============================================");
        calendar.setTime(new Date(300000000000L));//使用Calendar类setTime方法设置指定时间
        System.out.println("使用Calendar类get方法获取Calendar类setTime方法设置的时间(年月日时分秒):");
        System.out.println("==============================================");
        System.out.println(calendar.get(Calendar.YEAR)+"年"+(calendar.get(Calendar.MONTH)+1)+"月"+calendar.get(Calendar.DAY_OF_MONTH)+"日"+calendar.get(Calendar.HOUR_OF_DAY)+"时"+calendar.get(Calendar.MINUTE)+"分"+calendar.get(Calendar.SECOND)+"秒"+calendar.get(Calendar.MILLISECOND)+"毫秒");
        System.out.println("==============================================");
        calendar.setTimeInMillis(500000000000L);//使用Calendar类setTimeInMillis方法设置指定时间
        System.out.println("使用Calendar类get方法获取Calendar类setTimeInMillis方法设置的时间(年月日时分秒):");
        System.out.println("==============================================");
        System.out.println(calendar.get(Calendar.YEAR)+"年"+(calendar.get(Calendar.MONTH)+1)+"月"+calendar.get(Calendar.DAY_OF_MONTH)+"日"+calendar.get(Calendar.HOUR_OF_DAY)+"时"+calendar.get(Calendar.MINUTE)+"分"+calendar.get(Calendar.SECOND)+"秒"+calendar.get(Calendar.MILLISECOND)+"毫秒");
        System.out.println("==============================================");
    }
}
  • 3.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

使用Calendar类get方法获取Calendar类set方法设置的时间(年月日时分秒)==============================================
202121111464毫秒
==============================================
使用Calendar类get方法获取Calendar类setTime方法设置的时间(年月日时分秒)==============================================
197975132000毫秒
==============================================
使用Calendar类get方法获取Calendar类setTimeInMillis方法设置的时间(年月日时分秒)==============================================
1985115853200毫秒
==============================================

3.3、LocalDate、LocalTime、LocalDateTime类(LocalDate And LocalTime And LocalDateTime Class)

LocalDate类,也称“本地日期类”;LocalTime类,也称“本地时间类”;LocalDateTime类,也称“本地日期时间类”,它们都是JDK8的新特性

  • 3.3.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.datetime;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class LocalDateAndLocalTimeAndLocalDateTime {
    public static void main(String[] args) {
        //当前系统日期(年月日)
        LocalDate ld1 = LocalDate.now();
        //设定LocalDate类的日期(年月日)
        LocalDate ld2 = LocalDate.of(2021, 2, 1);
        //获取LocalDate类的日期(年月日)
        System.out.println("获取LocalDate类的日期:");
        System.out.println("============================================");
        System.out.println(ld1);
        System.out.println(ld1.getYear() + "年" + ld1.getMonthValue() + "月" + ld1.getDayOfMonth() + "日");
        System.out.println(ld2);
        System.out.println(ld2.getYear() + "年" + ld2.getMonthValue() + "月" + ld2.getDayOfMonth() + "日");
        System.out.println("============================================");
        //当前系统时间(时分秒)
        LocalTime lt1 = LocalTime.now();
        //设定LocalTime类的当前系统时间(时分秒)
        LocalTime lt2 = LocalTime.of(13, 14, 15, 1);
        LocalTime lt3 = LocalTime.ofSecondOfDay(60 * 60 * 1);
        LocalTime lt4 = LocalTime.ofNanoOfDay(1000000000L * 60 * 60 * 10);
        //获取LocalTime类的时间(时分秒)
        System.out.println("获取LocalTime类的时间:");
        System.out.println("============================================");
        System.out.println(lt1);
        System.out.println(lt1.getHour() + "时" + lt1.getMinute() + "分" + lt1.getSecond() + "秒" + lt1.getNano() + "纳秒");
        System.out.println(lt2);
        System.out.println(lt2.getHour() + "时" + lt2.getMinute() + "分" + lt2.getSecond() + "秒" + lt2.getNano() + "纳秒");
        System.out.println(lt3);
        System.out.println(lt3.getHour() + "时" + lt3.getMinute() + "分" + lt3.getSecond() + "秒" + lt3.getNano() + "纳秒");
        System.out.println(lt4);
        System.out.println(lt4.getHour() + "时" + lt4.getMinute() + "分" + lt4.getSecond() + "秒" + lt4.getNano() + "纳秒");
        System.out.println("============================================");
        //当前系统日期时间(年月日时分秒)
        LocalDateTime ldt1 = LocalDateTime.now();
        //设定LocalDateTime类的当前系统日期时间(年月日时分秒)
        LocalDateTime ldt2=LocalDateTime.of(2021,6,6,6,6,6,6);
        LocalDateTime ldt3=ldt2.withDayOfMonth(1);//更改日期时间中天的参数值
        LocalDateTime ldt4=ldt2.plusDays(1);//将日期时间中天的参数值加1
        LocalDateTime ldt5=ldt2.minusDays(1);//将日期时间中天的参数值减1
        //获取LocalDateTime类的当前系统日期时间(年月日时分秒)
        System.out.println("获取LocalDateTime类的日期时间:");
        System.out.println("============================================");
        System.out.println(ldt1);
        System.out.println(ldt1.getYear() + "年" + ldt1.getMonthValue() + "月" + ldt1.getDayOfMonth() + "日" + ldt1.getHour() + "时" + ldt1.getMinute() + "分" + ldt1.getSecond() + "秒" + ldt1.getNano() + "纳秒");
        System.out.println(ldt2);
        System.out.println(ldt2.getYear() + "年" + ldt2.getMonthValue() + "月" + ldt2.getDayOfMonth() + "日" + ldt2.getHour() + "时" + ldt2.getMinute() + "分" + ldt2.getSecond() + "秒" + ldt2.getNano() + "纳秒");
        System.out.println(ldt3);
        System.out.println(ldt3.getYear() + "年" + ldt3.getMonthValue() + "月" + ldt3.getDayOfMonth() + "日" + ldt3.getHour() + "时" + ldt3.getMinute() + "分" + ldt3.getSecond() + "秒" + ldt3.getNano() + "纳秒");
        System.out.println(ldt4);
        System.out.println(ldt4.getYear() + "年" + ldt4.getMonthValue() + "月" + ldt4.getDayOfMonth() + "日" + ldt4.getHour() + "时" + ldt4.getMinute() + "分" + ldt4.getSecond() + "秒" + ldt4.getNano() + "纳秒");
        System.out.println(ldt5);
        System.out.println(ldt5.getYear() + "年" + ldt5.getMonthValue() + "月" + ldt5.getDayOfMonth() + "日" + ldt5.getHour() + "时" + ldt5.getMinute() + "分" + ldt5.getSecond() + "秒" + ldt5.getNano() + "纳秒");
        System.out.println("============================================");
    }
}
  • 3.3.2、运行结果(Run Result)

其运行结果,如以下信息所示

获取LocalDate类的日期:
============================================
2021-06-25
20216252021-02-01
202121============================================
获取LocalTime类的时间:
============================================
14:27:10.901
142710901000000纳秒
13:14:15.000000001
1314151纳秒
01:00
1000纳秒
10:00
10000纳秒
============================================
获取LocalDateTime类的日期时间:
============================================
2021-06-25T14:27:10.901
2021625142710901000000纳秒
2021-06-06T06:06:06.000000006
2021666666纳秒
2021-06-01T06:06:06.000000006
2021616666纳秒
2021-06-07T06:06:06.000000006
2021676666纳秒
2021-06-05T06:06:06.000000006
2021656666纳秒
============================================

3.4、DateFormat、SimpleDateFormat类(DateFormat And SimpleDateFormat Class)

DateFormat类是日期/时间格式化子类(SimpleDateFormat类)的抽象类,它以语言无关的方式格式化和分析日期或时间。 日期/时间格式化子类(SimpleDateFormat类)允许格式化(即日期文本),解析(文本日期)和归一化。 该日期表示为一个Date对象,或自1970年1月1日00:00:00 GMT以来的毫秒

  • 3.4.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.datetime;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatAndSimpleDateFormat {
    public static void main(String[] args) throws ParseException {
        String pattern = "yyyy-MM-dd HH:mm:ss:SSS";
        Date d1 = new Date();
        String dateConvertString = date2String(pattern, d1);//将日期时间转换为字符串
        System.out.println("将日期时间("+d1+")转换为字符串:"+dateConvertString);
//        pattern = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒";
        Date d2 = string2Date(pattern, dateConvertString);//将字符串转换为日期时间
        System.out.println("将字符串("+dateConvertString+")转换为日期时间:"+d2);
    }
    private static Date string2Date(String pattern, String string) throws ParseException {
        //将字符串转换为日期时间
        DateFormat dateFormat = new SimpleDateFormat(pattern);//抽象父类引用指向子类对象
        return dateFormat.parse(string);
    }
    private static String date2String(String pattern, Date date) {
        //将日期时间转换为字符串
        DateFormat dateFormat = new SimpleDateFormat(pattern);//抽象父类引用指向子类对象
        return dateFormat.format(date);
    }
    //自动封装类方法代码块的快捷键:先选中代码块,然后按住“Ctrl+Alt+M”不放,直到弹出对话框,再输入封装类的方法名称,最后回车即可
}
  • 3.4.2、运行结果(Run Result)

其运行结果,如以下信息所示

将日期时间(Fri Jun 25 22:08:01 CST 2021)转换为字符串:2021-06-25 22:08:01:106
将字符串(2021-06-25 22:08:01:106)转换为日期时间:Fri Jun 25 22:08:01 CST 2021

3.5、DateTimeFormatter类(DateTimeFormatter Class)

DateTimeFormatter类,也称“日期时间格式化类”

  • 3.5.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.datetime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterClass {
    public static void main(String[] args) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS");//使用日期时间格式化类的静态方法实例化日期时间格式化类的对象
        LocalDateTime localDateTime = LocalDateTime.now();//当前系统日期时间
        String dateConvertString = date2String(dateTimeFormatter, localDateTime);//将日期时间转换为字符串
        System.out.println("将日期时间(" + localDateTime + ")转换为字符串:" + dateConvertString);//输出日期时间字符串
        LocalDateTime ldt = string2Date(dateConvertString, dateTimeFormatter);//将字符串转换为日期时间
        System.out.println("将字符串(" + dateConvertString + ")转换为日期时间:" + ldt);//输出日期时间
    }
    private static LocalDateTime string2Date(String dateConvertString, DateTimeFormatter dateTimeFormatter) {
        //将字符串转换为日期时间
        return LocalDateTime.parse(dateConvertString, dateTimeFormatter);
    }
    private static String date2String(DateTimeFormatter dateTimeFormatter, LocalDateTime localDateTime) {
        //将日期时间转换为字符串
        return localDateTime.format(dateTimeFormatter);
    }
    //自动封装类方法代码块的快捷键:先选中代码块,然后按住“Ctrl+Alt+M”不放,直到弹出对话框,再输入封装类的方法名称,最后回车即可
}
  • 3.5.2、运行结果(Run Result)

其运行结果,如以下信息所示

将日期时间(2021-06-25T22:27:55.553)转换为字符串:2021-06-25 22:27:55:553
将字符串(2021-06-25 22:27:55:553)转换为日期时间:2021-06-25T22:27:55.553

3.6、注意事项(Matters Needing Attention)

  • **3.6.1、LocalDate、LocalTime、LocalDateTime类构造方法为私有的,不能使用关键字"new"创建对象 **。
  • 3.6.2、DateFormat类是抽象类,只能由继承其的子类(SimpleDateFormat类)来创建实例化对象,即,父类的引用指向子类对象
  • 3.6.3、可以使用类的静态方法实例化类的对象

4、数组(Array)

数组(Array)就是"若干个相同类型数据的有序集合(Ordered Set)",其中每一个数据称为数组的"元素(Element)",每一个数组元素都通过一个下标(Subscript)或索引(Index)来访问(Access)。具体使用示例如CSDN博客"Java数组详解(No.11))"所示

5、字符串相关类(String Related Class)

5.1、String类创建对象方法(String Class Create Object Method)

  • 5.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class StringClassCreateObjectMethod {
    public static void main(String[] args) {
        //通过构造器(即,构造方法)创建String类对象
        System.out.println("通过构造器(即,构造方法)创建String类对象:");
        System.out.println("===========================================");
        String str0 = new String();
        System.out.println(str0);
        byte[] byteStr = {1, 2, 3};
        String str1 = new String(byteStr);
        System.out.println(str1);
        char[] byteChar = {'a', 'b', 'c'};
        String str2 = new String(byteChar);
        System.out.println(str2);
        String str3 = new String("123abc");
        System.out.println(str3);
        System.out.println("===========================================");
        //通过字符字面常量创建String类对象
        System.out.println("通过字符字面常量创建String类对象:");
        System.out.println("===========================================");
        String str4 = "字符字面常量";
        System.out.println(str4);
        System.out.println("===========================================");
    }
}
  • 5.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

通过构造器(即,构造方法)创建String类对象:
===========================================


abc
123abc
===========================================
通过字符字面常量创建String类对象:
===========================================
字符字面常量
===========================================

5.2、String类常用方法(String Class Common Method)

  • 5.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class StringClassCommonMethod {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //定义字符串
        String str1 = "abcdef";
        String str2 = "ABCDEF";
        //返回一个字符串中指定索引位置的字符值
        System.out.println("str1.charAt(2)结果为:" + str1.charAt(2));
        //返回指定字符串在一个字符串中第一次出现的的索引位置,从前往后找
        System.out.println("\"abccba\".indexOf(\"c\")结果为:"+"abccba".indexOf("c"));
        //返回指定字符串在一个字符串中最后一次出现的的索引位置,从后往前找
        System.out.println("\"abccba\".lastIndexOf(\"c\")结果为:"+"abccba".lastIndexOf("c"));
        //字符串也可以比较大小,默认按照字典顺序进行比较,其结果为负数代表“小于”,其结果为正数代表“大于”,其结果为零代表“等于”
        //使用String类的compareTo方法比较2个对象的大小(区分大小写)
        System.out.println("str1.compareTo(str2)结果为:" + str1.compareTo(str2));
        //使用String类的compareToIgnoreCase方法比较2个对象的大小(不区分大小写)
        System.out.println("str1.compareToIgnoreCase(str2)结果为:" + str1.compareToIgnoreCase(str2));
        //使用String类的equals方法比较2个对象是否相等(区分大小写)
        System.out.println("str1.equals(str2)结果为:" + str1.equals(str2));
        //使用String类的equalsIgnoreCase方法比较2个对象是否相等(不区分大小写)
        System.out.println("str1.equalsIgnoreCase(str2)结果为:" + str1.equalsIgnoreCase(str2));
        //字符串拼接(将指定的字符串连接到此字符串的末尾)
        //其中指定的字符串是不变的,如果拼接字符串只能返回拼接后的字符串
        String str3 = str1.concat(str2);
        System.out.println("str1结果为:"+str1+""+",str2结果为:"+str2);//拼接后,str1与str2不变
        System.out.println("str1.concat(str2)结果为:" + str3);//拼接后,str3为最终返回的拼接字符串
        //判断一个字符串中是否包含指定字符串,若包含则返回“true”,否则返回“fasle”
        System.out.println("str1.contains(str2)结果为:"+str1.contains(str2));
        System.out.println("str3.contains(str1)结果为:"+str3.contains(str1));
        //判断一个字符串中是否以指定字符串开始,若是则返回“true”,否则返回“fasle”
        System.out.println("str3.startsWith(str1)结果为:"+str3.startsWith(str1));
        System.out.println("str3.startsWith(str2)结果为:"+str3.startsWith(str2));
        //判断一个字符串中是否以指定字符串结尾,若是则返回“true”,否则返回“fasle”
        System.out.println("str3.endsWith(str1)结果为:"+str3.endsWith(str1));
        System.out.println("str3.endsWith(str2)结果为:"+str3.endsWith(str2));
        //获取字符串的字节码形式(根据字符编码格式返回字节数组)
        byte[] byteStr=str3.getBytes();
        for (byte b : byteStr) {
            System.out.print(b+"\t");
        }
        System.out.println();
        System.out.println(Arrays.toString("中国".getBytes()));
        System.out.println(Arrays.toString("中国".getBytes("UTF-8")));
        System.out.println(Arrays.toString("中国".getBytes("GBK")));
        //判断字符串是否为空
        System.out.println("\"\".isEmpty()结果为:"+"".isEmpty()+",\" \".isEmpty()结果为:"+" ".isEmpty());
        //System.out.println("\"\".isBlank()结果为:"+"".isBlank()+",\" \".isBlank()结果为:"+" ".isBlank());//JDK11新特性,新增空格字符时也当作空
        //获取字符串的长度
        System.out.println("str1.length()结果为:"+str1.length());
        /**
         * 返回一个重复多次的字符串(JDK11新特性,即,将指定字符串复制指定次数后作为返回字符串)
         * System.out.println("123".repeat(3));//输出结果为“123123123”
         */
        //字符串替换
        System.out.println("\"aAa\".replace(\"a\",\"A\")结果为:"+"aAa".replace("a","A"));
        System.out.println("\"a1b2c3d4e5f\".replaceAll(\"\\\\d\",\"-\")结果为:"+"a1b2c3d4e5f".replaceAll("\\d","-"));
        //字符串分割(切分)
        String[] splitStr="a-b-c".split("-");//字符串分割后,返回一个字符串数组
        System.out.println("\"a-b-c\".split(\"-\")结果为:"+Arrays.toString(splitStr));
        //字符串截取
        System.out.println("abcdefg\".substring(2,3)结果为:"+"abcdefg".substring(2,3));//其范围为:[beginIndex,endIndex),不包含索引“endIndex”对应值
        System.out.println("\"abcdefg\".substring(2)结果为:"+"abcdefg".substring(2));//其范围为:[beginIndex,字符串结尾索引]
        System.out.println("\"abcdefg\".substring(2,\"abcdefg\".length())结果为:"+"abcdefg".substring(2,"abcdefg".length()));//等价于"abcdefg".substring(2)
        //字符串小写
        System.out.println("\"aBcD\".toLowerCase()结果为:"+"aBcD".toLowerCase());
        //字符串大写
        System.out.println("\"aBcD\".toUpperCase()结果为:"+"aBcD".toUpperCase());
        //字符串前后空格去除
        System.out.println("\" a b c \".trim()结果为:"+ "a b c ".trim());
        //将基本类型的数据转换成字符串
        System.out.println("String.valueOf('对')结果为:"+String.valueOf('对')+",String.valueOf(true)结果为:"+String.valueOf(true));
    }
}
  • 5.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

str1.charAt(2)结果为:c
"abccba".indexOf("c")结果为:2
"abccba".lastIndexOf("c")结果为:3
str1.compareTo(str2)结果为:32
str1.compareToIgnoreCase(str2)结果为:0
str1.equals(str2)结果为:false
str1.equalsIgnoreCase(str2)结果为:true
str1结果为:abcdef,str2结果为:ABCDEF
str1.concat(str2)结果为:abcdefABCDEF
str1.contains(str2)结果为:false
str3.contains(str1)结果为:true
str3.startsWith(str1)结果为:true
str3.startsWith(str2)结果为:false
str3.endsWith(str1)结果为:false
str3.endsWith(str2)结果为:true
97	98	99	100	101	102	65	66	67	68	69	70	
[-28, -72, -83, -27, -101, -67]
[-28, -72, -83, -27, -101, -67]
[-42, -48, -71, -6]
"".isEmpty()结果为:true," ".isEmpty()结果为:false
str1.length()结果为:6
"aAa".replace("a","A")结果为:AAA
"a1b2c3d4e5f".replaceAll("\\d","-")结果为:a-b-c-d-e-f
"a-b-c".split("-")结果为:[a, b, c]
abcdefg".substring(2,3)结果为:c
"abcdefg".substring(2)结果为:cdefg
"abcdefg".substring(2,"abcdefg".length())结果为:cdefg
"aBcD".toLowerCase()结果为:abcd
"aBcD".toUpperCase()结果为:ABCD
" a b c ".trim()结果为:a b c
String.valueOf('对')结果为:对,String.valueOf(true)结果为:true

5.3、String类六种内存模型分析(Analysis Of Six Memory Models Of String Class)

  • 5.3.1、使用字面量创建String类对象(Use Literal Create String Class Object)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class MemoryModelAnalysis001 {
    public static void main(String[] args) {
        /**
         *使用字面量(即,"双引号的字符串")来创建String类对象
         *若字面量存在于常量池,则无任何操作,否则在常量池中创建该字面量
         *相同字面量对应的所有String类对象内存地址是相同的
         */
        String str1="123";//str1为变量,123为字面量
        String str2="123";//str2为变量,123为字面量
        System.out.println("(str1==str2)结果为:"+(str1==str2));//结果为“true”,即,对象内存地址相同
    }
}

其内存分析示意图,如下图所示

使用字面常量创建String类对象内存分析示意图

  • 5.3.2、使用new关键字创建String类对象(Use New Keyword Create String Class Object)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class MemoryModelAnalysis002 {
    public static void main(String[] args) {
        /**
         *使用new关键字来创建String类对象
         *首先在堆内存创建对象(无论堆内存是否存在相同字面量的对象),然后判断字面量是否存在于常量池,若存在则无任何操作,否则在常量池中创建该字面量
         */
        String str1 = new String("123");
        String str2 = new String("123");
        System.out.println("(str1==str2)结果为:"+(str1==str2));//结果为“false”,即,对象内存地址不同
    }
}

其内存分析示意图,如下图所示

使用new关键字创建String类对象内存分析示意图

  • 5.3.3、String类常量折叠(String Class Constant Fold)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class MemoryModelAnalysis003 {
    public static void main(String[] args) {
        /**
         *String类常量折叠(即,使用2个字面量相追加创建String类对象)
         *判断这2个字面量以及相加后的字面量在常量池中是否存在,若存在则无任何操作,否则则在常量池中创建相应的字面量
         */
        String str1=new String("123");
        String str2="1"+"23";
        System.out.println("(str1==str2)结果为:"+(str1==str2));//结果为“false”,即,对象内存地址不同
    }
}

其内存分析示意图,如下图所示

String类常量折叠内存分析示意图

  • 5.3.4、使用2个new关键字相追加创建String类对象(Use Two New Keywords To Append Create String Class Object)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class MemoryModelAnalysis004 {
    public static void main(String[] args) {
        /**
         *使用2个new关键字相追加创建String类对象
         *首先会在堆内存创建这2个对象以及相加后的对象,然后判断这2个对象的字面量在常量池中是否存在,若存在则无任何操作,否则则在常量池中创建相应的字面量
         */
        String str1=new String("1")+new String("23");
        String str2="123";
        System.out.println("(str1==str2)结果为:"+(str1==str2));//结果为“false”,即,对象内存地址不同
    }
}

其内存分析示意图,如下图所示

使用2个new关键字相追加创建String类对象内存分析示意图

  • 5.3.5、使用字面常量追加new关键字创建String类对象(Use Literal Constant To Append New Keyword To Create String Class Object)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class MemoryModelAnalysis005 {
    public static void main(String[] args) {
        /**
         *使用字面量(即,"双引号的字符串")追加new关键字创建String类对象
         *首先会在堆内存创建这2个对象(1个是new关键字创建的对象,另1个是相加后的对象),然后判断字面量与new关键字创建的对象的字面量在常量池中是否存在,若存在则无任何操作,否则则在常量池中创建相应的字面量
         */
        String str1="1"+new String("23");
        String str2="123";
        System.out.println("(str1==str2)结果为:"+(str1==str2));//结果为“false”,即,对象内存地址不同
    }
}

其内存分析示意图,如下图所示

使用字面常量追加new关键字创建String类对象内存分析示意图

  • 5.3.6、使用字面常量追加字符串变量创建String类对象(Use Literal Constant To Append String Variable To Create String Class Object)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class MemoryModelAnalysis006 {
    public static void main(String[] args) {
        /**
         *使用字面量(即,"双引号的字符串")追加字符串变量创建String类对象
         *首先会在堆内存创建1个字面量与字符串变量相加后的对象(不会进入常量池),然后判断字面量在常量池中是否存在,若存在则无任何操作,否则则在常量池中创建相应的字面量
         */
        String str1="3";
        String str2="12"+str1;
        String str3="123";
        System.out.println("(str2==str3)结果为:"+(str2==str3));//结果为“false”,即,对象内存地址不同
    }
}

其内存分析示意图,如下图所示

使用字面常量追加字符串变量创建String类对象内存分析示意图

5.4、String类intern方法(String Class Intern Method)

  • 5.4.1、示例代码一(Sample Code One)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class InternMethod001 {
    public static void main(String[] args) {
        /**
         *使用字面量(即,"双引号的字符串")来创建String类对象str1
         *若对象str1字面量"123"存在于常量池,则直接返回地址,否则在常量池中创建对象str1字面量"123",并返回此地址
         *str1指向常量池地址0xm1,str1.intern()指向常量池地址0xm1
         */
        String str1="123";//str1为变量,123为字面量
        System.out.println("(str1==str1.intern())结果为:"+(str1==str1.intern()));
    }
}

其内存分析示意图,如下图所示

String类intern方法示例代码一内存分析示意图

  • 5.4.2、示例代码二(Sample Code Two)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class InternMethod002 {
    public static void main(String[] args) {
        /**
         *使用new关键字来创建String类对象str1
         *首先在堆内存创建对象str1(无论堆内存是否存在相同字面量的对象),然后判断字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中创建字面量"123",并返回此地址
         *使用str1.intern()方法时,判断对象str1字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中存放"堆内存中字面量"123"对象str1的引用",并返回此地址
         *str1指向堆内存地址0xh1,str1.intern()指向常量池地址0xm1
         */
        String str1 = new String("123");
        System.out.println("(str1==str1.intern())结果为:"+(str1==str1.intern()));
    }
}

其内存分析示意图,如下图所示

String类intern方法示例代码二内存分析示意图

  • 5.4.3、示例代码三(Sample Code Three)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class InternMethod003 {
    public static void main(String[] args) {
        /**
         *先用new关键字来创建String类对象str1,再用字面量来创建String类对象str2
         *第1步,首先在堆内存创建对象str1(无论堆内存是否存在相同字面量的对象),然后判断字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中创建字面量"123",并返回此地址
         *第2步,判断对象str2字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中创建对象str2字面量"123",并返回此地址
         *使用str1.intern()方法时,判断对象str1字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中存放"堆内存中字面量"123"对象str1的引用",并返回此地址
         *str1指向堆内存地址0xh1,str1.intern()指向常量池地址0xm1,str2指向常量池地址0xm1
         */
        String str1 = new String("123");
        String str2="123";
        System.out.println("(str1==str2)结果为:"+(str1==str2));
        System.out.println("(str1==str1.intern())结果为:"+(str1==str1.intern()));
        System.out.println("(str1.intern()==str2)结果为:"+(str1.intern()==str2));
    }
}

其内存分析示意图,如下图所示

String类intern方法示例代码三内存分析示意图

  • 5.4.4、示例代码四(Sample Code Four)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class InternMethod004 {
    public static void main(String[] args) {
        /**
         *使用2个new关键字相追加创建String类对象str1
         *首先在堆内存创建3个对象[字面量"1"的对象、字面量"2"的对象、str1对象](无论堆内存是否存在相同字面量的对象),
         *然后判断字面量"1"或"2"是否存在于常量池,若存在则直接返回地址,否则在常量池中创建字面量"1"或"2",并返回此地址
         *使用str1.intern()方法时,判断对象str1字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中存放"堆内存中字面量"123"对象str1的引用",并返回此地址
         *str1指向堆内存地址0xh3,str1.intern()指向堆内存地址0xh3
         */
        String str1 = new String("1")+new String("23");
        System.out.println("(str1==str1.intern())结果为:"+(str1==str1.intern()));
    }
}

其内存分析示意图,如下图所示

String类intern方法示例代码四内存分析示意图

  • 5.4.5、示例代码五(Sample Code Five)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class InternMethod005 {
    public static void main(String[] args) {
        /**
         *先用字面量来创建String类对象str1,接着用2个new关键字相追加来创建String类对象str2,再用字面量来创建String类对象str3
         *第1步,判断字对象str1字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中创建对象str1字面量"123",并返回此地址
         *第2步,首先在堆内存创建3个对象[字面量"1"的对象、字面量"2"的对象、str2对象](无论堆内存是否存在相同字面量的对象),
         *然后判断字面量"1"或"2"是否存在于常量池,若存在则直接返回地址,否则在常量池中创建字面量"1"或"2",并返回此地址
         *第3步,判断对象str3字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中创建对象str3字面量"123",并返回此地址
         *使用str2.intern()方法时,判断对象str2字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中存放"堆内存中字面量"123"对象str2的引用",并返回此地址
         *str1指向常量池地址0xm1,str2指向堆内存地址0xh3,str2.intern()指向常量池地址0xm1,str3指向常量池地址0xm1
         */
        String str1="123";
        String str2 = new String("1")+new String("23");
        String str3="123";
        System.out.println("(str1==str2)结果为:"+(str1==str2));
        System.out.println("(str1==str2.intern())结果为:"+(str1==str2.intern()));
        System.out.println("(str2==str2.intern())结果为:"+(str2==str2.intern()));
        System.out.println("(str1==str3)结果为:"+(str1==str3));
        System.out.println("(str2==str3)结果为:"+(str2==str3));
        System.out.println("(str2.intern()==str3)结果为:"+(str2.intern()==str3));
    }
}

其内存分析示意图,如下图所示

String类intern方法示例代码五内存分析示意图

  • 5.4.6、示例代码六(Sample Code Six)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
public class InternMethod006 {
    public static void main(String[] args) {
        /**
         *先用2个new关键字相追加来创建String类对象str1,再用字面量来创建String类对象str2
         *第1步,首先在堆内存创建3个对象[字面量"1"的对象、字面量"2"的对象、str1对象](无论堆内存是否存在相同字面量的对象),
         *然后判断字面量"1"或"2"是否存在于常量池,若存在则直接返回地址,否则在常量池中创建字面量"1"或"2",并返回此地址
         *第2步,使用str1.intern()方法时,判断对象str1字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中存放"堆内存中字面量"123"对象str1的引用",并返回此地址
         *第3步,判断对象str2字面量"123"是否存在于常量池,若存在则直接返回地址,否则在常量池中创建对象str2字面量"123",并返回此地址
         *str1指向堆内存地址0xh3,str1.intern()指向堆内存地址0xh3,str2指向堆内存地址0xh3
         */
        String str1 = new String("1")+new String("23");
        str1.intern();
        String str2="123";
        System.out.println("(str1==str2)结果为:"+(str1==str2));
        System.out.println("(str1.intern()==str2)结果为:"+(str1.intern()==str2));
    }
}

其内存分析示意图,如下图所示

String类intern方法示例代码六内存分析示意图

5.5、String类核心源码分析(Core Source Code Analysis Of String Class)

其核心源码分析,如以下信息所示

/**
 *public final class String implements CharSequence
 *没有子类,没有多态和重写,本身方法不会被多态,且实现了CharSequence接口。
 */
/**
 *The value is used for character storage
 *private final char value[];
 *字符串底层代码还是一个字符数组,字符串中的字符会存到数组(value)。
 *value是一个成员变量,只能在代码块或者构造器进行初始化,且只能初始化一次。
 */
/**
 *Cache the hash code for the string
 *private int hash; // Default to 0
 *因为字符串是不可变的,所以对应hash码值也是不变的,hash码值默认为零
 */
/**
 *public String() {
 *    this.value = "".value;
 *}
 *默认情况下,当使用“String str=new String();”创建字符串时会创建一个空字符串(""),
 *而此时使用“str="123";”则会创建一个新的字符串("123")。
 */

5.6、StringBuffer类与StringBuilder类常用方法(Common Methods Of StringBuffer Class And StringBuilder Class)

  • 5.6.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
/**
 *String类:不可变字符序列
 *StringBuffer类:可变字符序列,速度慢,多线程安全
 *StringBuilder类:可变字符序列,速度快,多线程不安全
 *一般多数使用String类,在多字符串拼接时建议使用StringBuilder类,而多线程时建议使用StringBuffer类
 */
public class StringBufferAndStringBuilder {
    public static void main(String[] args) {
        //StringBuffer构造方法
        StringBuffer stringBuffer1=new StringBuffer();
        StringBuffer stringBuffer2=new StringBuffer("123");
        System.out.println("stringBuffer1.toString()结果为:"+stringBuffer1.toString());
        System.out.println("stringBuffer2.toString()结果为:"+stringBuffer2.toString());
        //StringBuffer类append方法:添加字符序列
        System.out.println("stringBuffer1.append(\"456\").toString()结果为:"+stringBuffer1.append("456").toString());
        System.out.println("stringBuffer2.append(\"456\").toString()结果为:"+stringBuffer2.append("456").toString());
        //StringBuffer类delete方法:删除指定区间段"[开始位置,结束位置)"的字符序列
        System.out.println("stringBuffer1.delete(0,1).toString()结果为:"+stringBuffer1.delete(0,1).toString());
        System.out.println("stringBuffer2.delete(0,1).toString()结果为:"+stringBuffer2.delete(0,1).toString());
        //StringBuffer类deleteCharAt方法:移出指定位置上的字符序列
        System.out.println("stringBuffer1.deleteCharAt(0).toString()结果为:"+stringBuffer1.deleteCharAt(0).toString());
        System.out.println("stringBuffer2.deleteCharAt(0).toString()结果为:"+stringBuffer2.deleteCharAt(0).toString());
        //StringBuffer类insert方法:在指定位置上插入字符序列
        System.out.println("stringBuffer1.insert(0,1).toString()结果为:"+stringBuffer1.insert(0,1).toString());
        System.out.println("stringBuffer2.insert(0,1).toString()结果为:"+stringBuffer2.insert(0,1).toString());
        //StringBuffer类setCharAt方法:在指定位置上设置字符序列
        stringBuffer1.setCharAt(0,'2');
        stringBuffer2.setCharAt(0,'2');
        //StringBuffer类toString方法:将字符序列转换为字符串形式
        System.out.println("stringBuffer1.toString()结果为:"+stringBuffer1.toString());
        System.out.println("stringBuffer2.toString()结果为:"+stringBuffer2.toString());
        //StringBuffer类reverse方法:逆序字符序列
        System.out.println("stringBuffer1.reverse().toString()结果为:"+stringBuffer1.reverse().toString());
        System.out.println("stringBuffer2.reverse().toString()结果为:"+stringBuffer2.reverse().toString());
        //StringBuilder构造方法
        StringBuilder stringBuilder1=new StringBuilder();
        StringBuilder stringBuilder2=new StringBuilder("987");
        System.out.println("stringBuilder1.toString()结果为:"+stringBuilder1.toString());
        System.out.println("stringBuilder2.toString()结果为:"+stringBuilder2.toString());
        //StringBuilder类append方法:添加字符序列
        System.out.println("stringBuilder1.append(\"654\").toString()结果为:"+stringBuilder1.append("654").toString());
        System.out.println("stringBuilder2.append(\"654\").toString()结果为:"+stringBuilder2.append("654").toString());
        //StringBuilder类delete方法:删除指定区间段"[开始位置,结束位置)"的字符序列
        System.out.println("stringBuilder1.delete(0,1).toString()结果为:"+stringBuilder1.delete(0,1).toString());
        System.out.println("stringBuilder2.delete(0,1).toString()结果为:"+stringBuilder2.delete(0,1).toString());
        //StringBuilder类deleteCharAt方法:移出指定位置上的字符序列
        System.out.println("stringBuilder1.deleteCharAt(0).toString()结果为:"+stringBuilder1.deleteCharAt(0).toString());
        System.out.println("stringBuilder2.deleteCharAt(0).toString()结果为:"+stringBuilder2.deleteCharAt(0).toString());
        //StringBuilder类insert方法:在指定位置上插入字符序列
        System.out.println("stringBuilder1.insert(0,1).toString()结果为:"+stringBuilder1.insert(0,1).toString());
        System.out.println("stringBuilder2.insert(0,1).toString()结果为:"+stringBuilder2.insert(0,1).toString());
        //StringBuilder类setCharAt方法:在指定位置上设置字符序列
        stringBuilder1.setCharAt(0,'2');
        stringBuilder2.setCharAt(0,'2');
        //StringBuilder类toString方法:将字符序列转换为字符串形式
        System.out.println("stringBuilder1.toString()结果为:"+stringBuilder1.toString());
        System.out.println("stringBuilder2.toString()结果为:"+stringBuilder2.toString());
        //StringBuilder类reverse方法:逆序字符序列
        System.out.println("stringBuilder1.reverse().toString()结果为:"+stringBuilder1.reverse().toString());
        System.out.println("stringBuilder2.reverse().toString()结果为:"+stringBuilder2.reverse().toString());
    }
}
  • 5.6.2、运行结果(Run Result)

其运行结果,如以下信息所示

stringBuffer1.toString()结果为:
stringBuffer2.toString()结果为:123
stringBuffer1.append("456").toString()结果为:456
stringBuffer2.append("456").toString()结果为:123456
stringBuffer1.delete(0,1).toString()结果为:56
stringBuffer2.delete(0,1).toString()结果为:23456
stringBuffer1.deleteCharAt(0).toString()结果为:6
stringBuffer2.deleteCharAt(0).toString()结果为:3456
stringBuffer1.insert(0,1).toString()结果为:16
stringBuffer2.insert(0,1).toString()结果为:13456
stringBuffer1.toString()结果为:26
stringBuffer2.toString()结果为:23456
stringBuffer1.reverse().toString()结果为:62
stringBuffer2.reverse().toString()结果为:65432
stringBuilder1.toString()结果为:
stringBuilder2.toString()结果为:987
stringBuilder1.append("654").toString()结果为:654
stringBuilder2.append("654").toString()结果为:987654
stringBuilder1.delete(0,1).toString()结果为:54
stringBuilder2.delete(0,1).toString()结果为:87654
stringBuilder1.deleteCharAt(0).toString()结果为:4
stringBuilder2.deleteCharAt(0).toString()结果为:7654
stringBuilder1.insert(0,1).toString()结果为:14
stringBuilder2.insert(0,1).toString()结果为:17654
stringBuilder1.toString()结果为:24
stringBuilder2.toString()结果为:27654
stringBuilder1.reverse().toString()结果为:42
stringBuilder2.reverse().toString()结果为:45672

5.7、基于字符串的数据加密与解密练习(Exercise Of Data Encryption And Decryption Base On String)

  • 5.7.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.string;
import java.nio.charset.StandardCharsets;
/**
 * 密码学:大写字母(ABCDEFGHIJKLMNOPQRSTUVWXYZ)、小写字母(abcdefghijklmnopqrstuvwxyz)
 * 静态加密与解密字符串(加密或解密原则:字母+加密或解密基数,字母以外字符不变,若“字母+加密或解密基数”大于最大字母位置值时,则继续从最小字母位置值开始往后计算,若“字母+加密或解密基数”小于最小字母位置值时,则继续从最大字母位置值开始往前计算)
 * 动态加密与解密字符串(加密或解密原则:字母+字母位置值,字母以外字符不变,若“字母+字母位置值”大于最大字母位置值时,则继续从最小字母位置值开始往后计算,若“字母-字母位置值”小于最小字母位置值时,则继续从最大字母位置值开始往前计算)
 */
public class StringEncryptionAndDecryption {
    private static final byte lowercaseLetterMin = "a".getBytes()[0];
    private static final byte lowercaseLetterMax = "z".getBytes()[0];
    private static final byte uppercaseLetterMin = "A".getBytes()[0];
    private static final byte uppercaseLetterMax = "Z".getBytes()[0];
    private static byte[] byteArray = "".getBytes();
    private static byte byteBase;
    public static void main(String[] args) {
        String str = "1Aa2Bb3Cc4Dd5Ee6Ff7Gg8Hh9Ii10Jj11Kk12Ll13Mm14Nn15Oo16Pp17Qq18Rr19Ss20Tt21Uu22Vv23Ww24Xx25Yy26Zz";//字符串
        //静态加密与解密字符串
        byte baseStaticEncryption1 = 1;//静态加密基数
        String stringStaticEncryption1 = staticEncryptionOrDecryptionString(str, baseStaticEncryption1);//静态加密字符串
        System.out.println("字符串(" + str + ")按基数(" + baseStaticEncryption1 + ")静态加密后结果:");
        System.out.println(stringStaticEncryption1);
        byte baseStaticEncryption2 = (byte) (-1 * baseStaticEncryption1);//静态解密基数
        String stringStaticEncryption2 = staticEncryptionOrDecryptionString(stringStaticEncryption1, baseStaticEncryption2);//静态解密字符串
        System.out.println("字符串(" + stringStaticEncryption1 + ")按基数(" + baseStaticEncryption2 + ")静态解密后结果:");
        System.out.println(stringStaticEncryption2);
        byte baseStaticEncryption3 = 27;//静态加密基数
        String stringStaticEncryption3 = staticEncryptionOrDecryptionString(str, baseStaticEncryption3);//静态加密字符串
        System.out.println("字符串(" + str + ")按基数(" + baseStaticEncryption3 + ")静态加密后结果:");
        System.out.println(stringStaticEncryption3);
        byte baseStaticEncryption4 = (byte) (-1 * baseStaticEncryption3);//静态解密基数
        String stringStaticEncryption4 = staticEncryptionOrDecryptionString(stringStaticEncryption3, baseStaticEncryption4);//静态解密字符串
        System.out.println("字符串(" + stringStaticEncryption3 + ")按基数(" + baseStaticEncryption4 + ")静态解密后结果:");
        System.out.println(stringStaticEncryption4);
        //动态加密与解密字符串
        String stringDynamicEncryption1 = dynamicEncryptionOrDecryptionString(str, true);//动态加密字符串
        System.out.println("字符串(" + str + ")动态加密后结果:");
        System.out.println(stringDynamicEncryption1);
        String stringDynamicEncryption2 = dynamicEncryptionOrDecryptionString(stringDynamicEncryption1, false);//动态解密字符串
        System.out.println("字符串(" + stringDynamicEncryption1 + ")动态解密后结果:");
        System.out.println(stringDynamicEncryption2);
    }
    public static String staticEncryptionOrDecryptionString(String str, byte base) {
        /**
         *静态加密或解密字符串
         *加密或解密原则:字母+加密或解密基数(base),字母以外字符不变,若“字母+加密或解密基数(base)”大于最大字母位置值时,则继续从最小字母位置值开始往后计算,若“字母+加密或解密基数(base)”小于最小字母位置值时,则继续从最大字母位置值开始往前计算
         */
        byteArray = str.getBytes();
        byteBase = (byte) (base % (lowercaseLetterMax - lowercaseLetterMin + 1));
        /**
         System.out.println("字符串(" + str + ")静态加密或解密前对应的字节码:");
         for (byte b : byteArray) {
         System.out.print(b + "\t");
         }
         System.out.println();
         */
        for (int i = 0; i < byteArray.length; i++) {
            if ((byteArray[i] >= lowercaseLetterMin) && (byteArray[i] <= lowercaseLetterMax)) {
                //小写字母(a-z)字节码:(97)-(97+26-1)
                if (byteArray[i] + byteBase < lowercaseLetterMin) {
                    byteArray[i] = (byte) (lowercaseLetterMax - (lowercaseLetterMin - (byteArray[i] + byteBase)) + 1);
                } else if (byteArray[i] + byteBase <= lowercaseLetterMax) {
                    byteArray[i] += byteBase;
                } else {
                    byteArray[i] = (byte) (lowercaseLetterMin + (byteArray[i] + byteBase - lowercaseLetterMax) - 1);
                }
            } else if ((byteArray[i] >= uppercaseLetterMin) && (byteArray[i] <= uppercaseLetterMax)) {
                //小写字母(A-Z)字节码:(65)-(65+26-1)
                if (byteArray[i] + byteBase < uppercaseLetterMin) {
                    byteArray[i] = (byte) (uppercaseLetterMax - (uppercaseLetterMin - (byteArray[i] + byteBase)) + 1);
                } else if (byteArray[i] + byteBase <= uppercaseLetterMax) {
                    byteArray[i] += byteBase;
                } else {
                    byteArray[i] = (byte) (uppercaseLetterMin + (byteArray[i] + byteBase - uppercaseLetterMax) - 1);
                }
            } else {
                //小写与小写字母以外的字符
            }
        }
        /**
         System.out.println("字符串(" + str + ")静态加密或解密后对应的字节码:");
         for (byte b : byteArray) {
         System.out.print(b + "\t");
         }
         System.out.println();
         String strStaticEncryptionOrDecryption=new String(byteArray);
         System.out.println("字符串(" + str + ")静态加密或解密后对应的字符串:"+strStaticEncryptionOrDecryption);
         */
        return new String(byteArray);
    }
    public static String dynamicEncryptionOrDecryptionString(String str, boolean isEncryption) {
        /**
         *动态加密或解密字符串
         *加密或解密原则:字母+字母位置值,字母以外字符不变,若“字母+字母位置值”大于最大字母位置值时,则继续从最小字母位置值开始往后计算,若“字母-字母位置值”小于最小字母位置值时,则继续从最大字母位置值开始往前计算
         */
        byteArray = str.getBytes();
        /**
         System.out.println("字符串(" + str + ")动态加密或解密前对应的字节码:");
         for (byte b : byteArray) {
         System.out.print(b + "\t");
         }
         System.out.println();
         */
        for (int i = 0; i < byteArray.length; i++) {
            if (isEncryption) {
                byteBase = (byte) ((i + 1) % (lowercaseLetterMax - lowercaseLetterMin + 1));//动态加密
            } else {
                byteBase = (byte) ((-1 * (i + 1)) % (lowercaseLetterMax - lowercaseLetterMin + 1));//动态解密
            }
            if ((byteArray[i] >= lowercaseLetterMin) && (byteArray[i] <= lowercaseLetterMax)) {
                //小写字母(a-z)字节码:(97)-(97+26-1)
                if (byteArray[i] + byteBase < lowercaseLetterMin) {
                    byteArray[i] = (byte) (lowercaseLetterMax - (lowercaseLetterMin - (byteArray[i] + byteBase)) + 1);
                } else if (byteArray[i] + byteBase <= lowercaseLetterMax) {
                    byteArray[i] += byteBase;
                } else {
                    byteArray[i] = (byte) (lowercaseLetterMin + (byteArray[i] + byteBase - lowercaseLetterMax) - 1);
                }
            } else if ((byteArray[i] >= uppercaseLetterMin) && (byteArray[i] <= uppercaseLetterMax)) {
                //小写字母(A-Z)字节码:(65)-(65+26-1)
                if (byteArray[i] + byteBase < uppercaseLetterMin) {
                    byteArray[i] = (byte) (uppercaseLetterMax - (uppercaseLetterMin - (byteArray[i] + byteBase)) + 1);
                } else if (byteArray[i] + byteBase <= uppercaseLetterMax) {
                    byteArray[i] += byteBase;
                } else {
                    byteArray[i] = (byte) (uppercaseLetterMin + (byteArray[i] + byteBase - uppercaseLetterMax) - 1);
                }
            } else {
                //小写与小写字母以外的字符
            }
        }
        /**
         System.out.println("字符串(" + str + ")动态加密或解密后对应的字节码:");
         for (byte b : byteArray) {
         System.out.print(b + "\t");
         }
         System.out.println();
         String strDynamicEncryptionOrDecryption=new String(byteArray);
         System.out.println("字符串(" + str + ")动态加密或解密后对应的字符串:"+strDynamicEncryptionOrDecryption);
         */
        return new String(byteArray);
    }
}
  • 5.7.2、运行结果(Run Result)

其运行结果,如以下信息所示

字符串(1Aa2Bb3Cc4Dd5Ee6Ff7Gg8Hh9Ii10Jj11Kk12Ll13Mm14Nn15Oo16Pp17Qq18Rr19Ss20Tt21Uu22Vv23Ww24Xx25Yy26Zz)按基数(1)静态加密后结果:
1Bb2Cc3Dd4Ee5Ff6Gg7Hh8Ii9Jj10Kk11Ll12Mm13Nn14Oo15Pp16Qq17Rr18Ss19Tt20Uu21Vv22Ww23Xx24Yy25Zz26Aa
字符串(1Bb2Cc3Dd4Ee5Ff6Gg7Hh8Ii9Jj10Kk11Ll12Mm13Nn14Oo15Pp16Qq17Rr18Ss19Tt20Uu21Vv22Ww23Xx24Yy25Zz26Aa)按基数(-1)静态解密后结果:
1Aa2Bb3Cc4Dd5Ee6Ff7Gg8Hh9Ii10Jj11Kk12Ll13Mm14Nn15Oo16Pp17Qq18Rr19Ss20Tt21Uu22Vv23Ww24Xx25Yy26Zz
字符串(1Aa2Bb3Cc4Dd5Ee6Ff7Gg8Hh9Ii10Jj11Kk12Ll13Mm14Nn15Oo16Pp17Qq18Rr19Ss20Tt21Uu22Vv23Ww24Xx25Yy26Zz)按基数(27)静态加密后结果:
1Bb2Cc3Dd4Ee5Ff6Gg7Hh8Ii9Jj10Kk11Ll12Mm13Nn14Oo15Pp16Qq17Rr18Ss19Tt20Uu21Vv22Ww23Xx24Yy25Zz26Aa
字符串(1Bb2Cc3Dd4Ee5Ff6Gg7Hh8Ii9Jj10Kk11Ll12Mm13Nn14Oo15Pp16Qq17Rr18Ss19Tt20Uu21Vv22Ww23Xx24Yy25Zz26Aa)按基数(-27)静态解密后结果:
1Aa2Bb3Cc4Dd5Ee6Ff7Gg8Hh9Ii10Jj11Kk12Ll13Mm14Nn15Oo16Pp17Qq18Rr19Ss20Tt21Uu22Vv23Ww24Xx25Yy26Zz
字符串(1Aa2Bb3Cc4Dd5Ee6Ff7Gg8Hh9Ii10Jj11Kk12Ll13Mm14Nn15Oo16Pp17Qq18Rr19Ss20Tt21Uu22Vv23Ww24Xx25Yy26Zz)动态加密后结果:
1Cd2Gh3Kl4Op5St6Wx7Ab8Ef9Ij10No11St12Xy13Cd14Hi15Mn16Rs17Wx18Bc19Gh20Lm21Qr22Vw23Ab24Fg25Kl26Pq
字符串(1Cd2Gh3Kl4Op5St6Wx7Ab8Ef9Ij10No11St12Xy13Cd14Hi15Mn16Rs17Wx18Bc19Gh20Lm21Qr22Vw23Ab24Fg25Kl26Pq)动态解密后结果:
1Aa2Bb3Cc4Dd5Ee6Ff7Gg8Hh9Ii10Jj11Kk12Ll13Mm14Nn15Oo16Pp17Qq18Rr19Ss20Tt21Uu22Vv23Ww24Xx25Yy26Zz

5.8、注意事项(Matters Needing Attention)

  • 5.8.1、字符串也可以比较大小,默认按照字典顺序进行比较,其结果为负数代表“小于”,其结果为正数代表“大于”,其结果为零代表“等于”
  • 5.8.2、字符串拼接时,其中指定的字符串是不变的,如果拼接字符串只能返回拼接后的字符串
  • 5.8.3、类对象为空(即,null)时,容易引发“空指针异常”
  • 5.8.4、使用字面量创建String类对象时,判断字面量是否存在于常量池,若存在则无任何操作,否则在常量池中创建字面量,且相同字面量对应的所有String类对象内存地址是相同的
  • 5.8.5、使用new关键字创建String类对象时,首先在堆内存创建new关键字对象(无论堆内存是否存在相同字面量的对象),然后判断new关键字对象字面量是否存在于常量池,若存在则无任何操作,否则在常量池中创建new关键字对象字面量
  • 5.8.6、使用字面量拼接(即,字面量折叠或常量折叠)创建String类对象时,判断拼接后的字面量是否存在于常量池,若存在则无任何操作,否则在常量池中创建拼接后的字面量
  • 5.8.7、使用new关键字拼接创建String类对象时,首先在堆内存创建各个new关键字对象与拼接后的对象(无论堆内存是否存在相同字面量的对象),然后判断各个new关键字对象字面量是否存在于常量池,若存在则无任何操作,否则在常量池中创建各个new关键字对象
  • 5.8.8、使用字面量拼接new关键字创建String类对象时,首先判断字面量是否存在于常量池,若存在则无任何操作,否则在常量池中创建字面量,接着在堆内存创建new关键字对象与拼接后的对象(无论堆内存是否存在相同字面量的对象),然后判断new关键字对象字面量是否存在于常量池,若存在则无任何操作,否则在常量池中创建new关键字对象
  • 5.8.9、使用字面量拼接变量创建String类对象时,首先判断变量是否存在于常量池,若存在则无任何操作,否则在常量池中创建变量,接着判断字面量是否存在于常量池,若存在则无任何操作,否则在常量池中创建字面量,再接着在堆内存创建拼接后的对象(无论堆内存是否存在相同字面量的对象)
  • 5.8.10、使用String类intern方法时,将字面量(即,字符串)存放到常量池中。1、若字面量存在于常量池,则直接返回当前地址;2、若字面量不存在于常量池且字面量不存在于堆内存,则在常量池中创建字面量,并返回当前地址;3、若字面量存在于堆内存且字面量不存在于常量池,则在常量池中创建一个堆内存中存放字面量对象的引用地址,并返回当前地址;4、若字面量存在于堆内存且字面量存在于常量池,则直接返回常量池当前地址
  • 5.8.11、String类为"不可变字符序列",StringBuffer类为"可变字符序列,线程安全,但是效率低",StringBuffer类为"可变字符序列,线程不安全,但是效率高"

6、数学类(Math Class)

  • 6.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.math;
public class CommonMethod {
    public static void main(String[] args) {
        //最大值
        System.out.println("Math.max(1.23210,1.23211)结果为:"+Math.max(1.23210,1.23211));
        //最小值
        System.out.println("Math.min(1.23210,1.23211)结果为:"+Math.min(1.23210,1.23211));
        //随机数
        System.out.println("Math.random()结果为:"+Math.random());
        //绝对值:幂等
        System.out.println("Math.abs(-1.0)结果为:"+Math.abs(-1.0));
        System.out.println("ath.abs(Math.abs(-1.0))结果为:"+Math.abs(Math.abs(-1.0)));
        //四舍五入
        System.out.println("Math.round(1.499)结果为:"+Math.round(1.499));
        System.out.println("Math.round(-1.499)结果为:"+Math.round(-1.499));
        System.out.println("Math.round(2.500)结果为:"+Math.round(2.500));
        System.out.println("Math.round(-2.500)结果为:"+Math.round(-2.500));
        //向上取整
        System.out.println("Math.ceil(1.23)结果为:"+Math.ceil(1.23));
        System.out.println("Math.ceil(-1.23)结果为:"+Math.ceil(-1.23));
        //向下取整
        System.out.println("Math.floor(1.23)结果为:"+Math.floor(1.23));
        System.out.println("Math.floor(-1.23)结果为:"+Math.floor(-1.23));
        //次幂(乘方)
        System.out.println("Math.pow(10,1)结果为:"+Math.pow(10,1));
        System.out.println("Math.pow(10,0)结果为:"+Math.pow(10,0));
        System.out.println("Math.pow(10,-1)结果为:"+Math.pow(10,-1));
        //正平方根
        System.out.println("Math.sqrt(9)结果为:"+Math.sqrt(9));
        //log对数
        System.out.println("Math.log(10)结果为:"+Math.log(10));
        System.out.println("Math.log10(10)结果为:"+Math.log10(10));
        System.out.println("Math.log1p(10)结果为:"+Math.log1p(10));
        //三角函数
        System.out.println("Math.sin(60)结果为:"+Math.sin(60));//正弦
        System.out.println("Math.cos(60)结果为:"+Math.cos(60));//余弦
        System.out.println("Math.tan(60)结果为:"+Math.tan(60));//正切
        System.out.println("Math.atan(60)结果为:"+Math.atan(60));//反正切
    }
}
  • 6.2、运行结果(Run Result)

其运行结果,如以下信息所示

Math.max(1.23210,1.23211)结果为:1.23211
Math.min(1.23210,1.23211)结果为:1.2321
Math.random()结果为:0.16841005134196396
Math.abs(-1.0)结果为:1.0
ath.abs(Math.abs(-1.0))结果为:1.0
Math.round(1.499)结果为:1
Math.round(-1.499)结果为:-1
Math.round(2.500)结果为:3
Math.round(-2.500)结果为:-2
Math.ceil(1.23)结果为:2.0
Math.ceil(-1.23)结果为:-1.0
Math.floor(1.23)结果为:1.0
Math.floor(-1.23)结果为:-2.0
Math.pow(10,1)结果为:10.0
Math.pow(10,0)结果为:1.0
Math.pow(10,-1)结果为:0.1
Math.sqrt(9)结果为:3.0
Math.log(10)结果为:2.302585092994046
Math.log10(10)结果为:1.0
Math.log1p(10)结果为:2.3978952727983707
Math.sin(60)结果为:-0.3048106211022167
Math.cos(60)结果为:-0.9524129804151563
Math.tan(60)结果为:0.320040389379563
Math.atan(60)结果为:1.554131203080956

7、文件类(File Class)

File类是“文件和目录路径名的抽象表示形式”

7.1、File类常用方法(File Class Common Method)

  • 7.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.file;
import java.io.File;
public class CommonMethod {
    public static void main(String[] args) {
        //创建File类对象
        File file=new File("D:\\Program Files");
        System.out.println("file结果为:"+file);
        //是否可以读取文件
        System.out.println("file.canRead()结果为:"+file.canRead());
        //是否可以写入文件
        System.out.println("file.canWrite()结果为:"+file.canWrite());
        //是否可以执行文件
        System.out.println("file.canExecute()结果为:"+file.canExecute());
        //文件是否存在
        System.out.println("file.exists()结果为:"+file.exists());
        //获取文件路径
        System.out.println("file.getPath()结果为:"+file.getPath());
        //获取绝对文件
        System.out.println("file.getAbsoluteFile()结果为:"+file.getAbsoluteFile());
        //获取文件绝对路径
        System.out.println("file.getAbsolutePath()结果为:"+file.getAbsolutePath());
        //获取文件的父文件
        System.out.println("file.getParentFile()结果为:"+file.getParentFile());
        //获取文件的父路径
        System.out.println("file.getParent()结果为:"+file.getParent());
        //获取文件对应的磁盘总空间
        System.out.println("file.getTotalSpace()结果为:"+file.getTotalSpace()+"字节(B)");
        System.out.println("(file.getTotalSpace()*1.0/1024/1024/1024)结果为:"+(file.getTotalSpace()*1.0/1024/1024/1024)+"千兆字节(GB)");
        //获取文件对应的磁盘空闲空间
        System.out.println("file.getFreeSpace()结果为:"+file.getFreeSpace()+"字节(B)");
        System.out.println("(file.getFreeSpace()*1.0/1024/1024/1024)结果为:"+(file.getFreeSpace()*1.0/1024/1024/1024)+"千兆字节(GB)");
        //获取文件对应的磁盘可用空间
        System.out.println("file.getUsableSpace()结果为:"+file.getUsableSpace()+"字节(B)");
        System.out.println("(file.getUsableSpace()*1.0/1024/1024/1024)结果为:"+(file.getUsableSpace()*1.0/1024/1024/1024)+"千兆字节(GB)");
        //获取文件对应的磁盘已使用空间
        System.out.println("(file.getTotalSpace()*1.0-file.getUsableSpace()*1.0)结果为:"+(file.getTotalSpace()*1.0-file.getUsableSpace()*1.0)+"字节(B)");
        System.out.println("((file.getTotalSpace()*1.0-file.getUsableSpace()*1.0)/1024/1024/1024)结果为:"+((file.getTotalSpace()*1.0-file.getUsableSpace()*1.0)/1024/1024/1024)+"千兆字节(GB)");
    }
}
  • 7.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

file结果为:D:\Program Files
file.canRead()结果为:true
file.canWrite()结果为:true
file.canExecute()结果为:true
file.exists()结果为:true
file.getPath()结果为:D:\Program Files
file.getAbsoluteFile()结果为:D:\Program Files
file.getAbsolutePath()结果为:D:\Program Files
file.getParentFile()结果为:D:\
file.getParent()结果为:D:\
file.getTotalSpace()结果为:246961664000字节(B)
(file.getTotalSpace()*1.0/1024/1024/1024)结果为:230.00097274780273千兆字节(GB)
file.getFreeSpace()结果为:178874249216字节(B)
(file.getFreeSpace()*1.0/1024/1024/1024)结果为:166.58962631225586千兆字节(GB)
file.getUsableSpace()结果为:178874249216字节(B)
(file.getUsableSpace()*1.0/1024/1024/1024)结果为:166.58962631225586千兆字节(GB)
(file.getTotalSpace()*1.0-file.getUsableSpace()*1.0)结果为:6.8087414784E10字节(B)
((file.getTotalSpace()*1.0-file.getUsableSpace()*1.0)/1024/1024/1024)结果为:63.411346435546875千兆字节(GB)

7.2、File类显示子文件目录(File Class Display Sub File Directory)

7.2.1、查看子文件目录(View Sub File Directory)
  • 7.2.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.file;
import java.io.File;
public class ViewSubFileDirectory {
    public static void main(String[] args) {
        //文件分隔符
        System.out.println("文件分隔符");
        System.out.println("==================================================");
        System.out.println("File.separator结果为:"+File.separator);
        System.out.println("==================================================");
        //查看文件的子文件目录
        File file = new File("D:\\Program Files");
        //判断文件是否为文件夹目录
        if(file.isDirectory()){
            //获取文件目录的所有子文件(全路径)
            System.out.println("获取文件目录("+file+")的所有子文件:");
            System.out.println("==================================================");
            File[] subFile1=file.listFiles();
            for (int i = 0; i < subFile1.length; i++) {
                //System.out.println(subFile1[i]);
                System.out.println(subFile1[i].getAbsolutePath());
            }
            System.out.println("==================================================");
            //获取文件目录的所有子文件路径(不是全路径,只是子文件或子文件夹名称)
            System.out.println("获取文件目录("+file+")的所有子文件路径:");
            System.out.println("==================================================");
            String[] subFile2=file.list();
            for (int i = 0; i < subFile2.length; i++) {
                System.out.println(subFile2[i]);
            }
            System.out.println("==================================================");
        }
    }
}
  • 7.2.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

文件分隔符
==================================================
File.separator结果为:\
==================================================
获取文件目录(D:\Program Files)的所有子文件:
==================================================
D:\Program Files\CSR
D:\Program Files\JetBrains
D:\Program Files\Microsoft SQL Server
D:\Program Files\MXPLC
D:\Program Files\PostgreSQL
D:\Program Files\RealVNC
D:\Program Files\TortoiseSVN
D:\Program Files\Typora
D:\Program Files\WinRAR
==================================================
获取文件目录(D:\Program Files)的所有子文件路径:
==================================================
CSR
JetBrains
Microsoft SQL Server
MXPLC
PostgreSQL
RealVNC
TortoiseSVN
Typora
WinRAR
==================================================
7.2.2、练习(Exercise)

练习作业:使用递归(尽量有缩进)打印输出指定文件目录下的所有子文件(包含子文件夹中的子文件)

  • 7.2.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.file;
import java.io.File;
/**
 * 练习作业:使用递归(尽量有缩进)打印输出指定文件目录下的所有子文件(包含子文件夹中的子文件)
 */
public class ViewAllSubFile {
    public static void main(String[] args) {
        File file = new File("E:\\Environment\\Java\\IDEA");//创建File类对象
        System.out.println(file.getAbsolutePath());//输出文件绝对路径
        printViewAllSubFile(file);//递归(尽量有缩进)打印输出指定文件目录下的所有子文件
    }
    public static void printViewAllSubFile(File file) {
        /**
         *递归(尽量有缩进)打印输出指定文件目录下的所有子文件
         */
        //判断文件是否为文件夹目录
        if (file.isDirectory()) {
            //File类对象为文件夹
            File[] fileArr = file.listFiles();//获取文件目录的所有子文件
            String[] fileString = file.list();//获取文件目录的所有子文件路径
            for (int i = 0; i < fileArr.length; i++) {
                System.out.println(fillCharacter((int) (fileArr[i].toString().length() - fileString[i].toString().length()), "-") + fileString[i]);//输出子文件或子文件夹路径
                printViewAllSubFile(fileArr[i]);//递归(尽量有缩进)打印输出指定文件目录下的所有子文件
            }
        }
        return;//返回方法参数并退出方法
    }
    private static String fillCharacter(int length, String charStr) {
        /**
         *填充指定长度的指定字符
         */
        String str = "";
        for (int i = 0; i < length; i++) {
            str += charStr;
        }
        return str;
    }
}
  • 7.2.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

E:\Environment\Java\IDEA
-------------------------StageOne
----------------------------------.idea
----------------------------------------.gitignore
----------------------------------------misc.xml
----------------------------------------modules.xml
----------------------------------------uiDesigner.xml
----------------------------------------workspace.xml
----------------------------------javase
-----------------------------------------javase.iml
-----------------------------------------src
---------------------------------------------com
-------------------------------------------------xueshanxuehai
---------------------------------------------------------------array
---------------------------------------------------------------------ApplicationArray1.java
---------------------------------------------------------------------ApplicationArray2.java
---------------------------------------------------------------------ApplicationArray3.java
---------------------------------------------------------------------ApplicationArray4.java
---------------------------------------------------------------------ApplicationTwoDimensionalArray.java
---------------------------------------------------------------------ArrayClass.java
---------------------------------------------------------------------ArrayDeclarationAndCreation.java
---------------------------------------------------------------------BubbleSortAlgorithm.java
---------------------------------------------------------------------InitializationArray.java
---------------------------------------------------------------------SparseArray.java
---------------------------------------------------------------basic
---------------------------------------------------------------------Comments.java
---------------------------------------------------------------------Constant.java
---------------------------------------------------------------------DataTypeExtension.java
---------------------------------------------------------------------HelloWorld.java
---------------------------------------------------------------------JavaDoc.java
---------------------------------------------------------------------TypeConversion.java
---------------------------------------------------------------------Variable.java
---------------------------------------------------------------commonclass
---------------------------------------------------------------------------datetime
------------------------------------------------------------------------------------CalendarClass.java
------------------------------------------------------------------------------------DateClass.java
------------------------------------------------------------------------------------DateFormatAndSimpleDateFormat.java
------------------------------------------------------------------------------------DateTimeFormatterClass.java
------------------------------------------------------------------------------------LocalDateAndLocalTimeAndLocalDateTime.java
---------------------------------------------------------------------------file
--------------------------------------------------------------------------------CommonMethod.java
--------------------------------------------------------------------------------CreateFile.java
--------------------------------------------------------------------------------CreateFileDirectory.java
--------------------------------------------------------------------------------DeleteFileAndFolder.java
--------------------------------------------------------------------------------DeleteFileDirectory.java
--------------------------------------------------------------------------------ViewAllSubFile.java
--------------------------------------------------------------------------------ViewSubFileDirectory.java
---------------------------------------------------------------------------math
--------------------------------------------------------------------------------CommonMethod.java
---------------------------------------------------------------------------object
----------------------------------------------------------------------------------CloneDeepMethod.java
----------------------------------------------------------------------------------CloneGeneralMethod.java
----------------------------------------------------------------------------------CloneShallowMethod.java
----------------------------------------------------------------------------------EqualsAndHashcode.java
----------------------------------------------------------------------------------EqualsDeepenMethod.java
----------------------------------------------------------------------------------EqualsMethod.java
----------------------------------------------------------------------------------HashCodeMethod.java
----------------------------------------------------------------------------------ToStringMethod.java
---------------------------------------------------------------------------string
----------------------------------------------------------------------------------CommonMethod.java
----------------------------------------------------------------------------------CreateObjectMethod.java
----------------------------------------------------------------------------------InternMethod001.java
----------------------------------------------------------------------------------InternMethod002.java
----------------------------------------------------------------------------------InternMethod003.java
----------------------------------------------------------------------------------InternMethod004.java
----------------------------------------------------------------------------------InternMethod005.java
----------------------------------------------------------------------------------InternMethod006.java
----------------------------------------------------------------------------------MemoryModelAnalysis001.java
----------------------------------------------------------------------------------MemoryModelAnalysis002.java
----------------------------------------------------------------------------------MemoryModelAnalysis003.java
----------------------------------------------------------------------------------MemoryModelAnalysis004.java
----------------------------------------------------------------------------------MemoryModelAnalysis005.java
----------------------------------------------------------------------------------MemoryModelAnalysis006.java
----------------------------------------------------------------------------------SourceCodeAnalysis.java
----------------------------------------------------------------------------------StringBufferAndStringBuilder.java
----------------------------------------------------------------------------------StringEncryptionAndDecryption.java
---------------------------------------------------------------------------wrapper
-----------------------------------------------------------------------------------CacheInteger.java
-----------------------------------------------------------------------------------CommonPropertiesAndMethods.java
-----------------------------------------------------------------------------------CreatingMethodsAndAutoboxingUnboxing.java
---------------------------------------------------------------exception
-------------------------------------------------------------------------CallCustomException.java
-------------------------------------------------------------------------CatchException.java
-------------------------------------------------------------------------CustomException.java
-------------------------------------------------------------------------ThrowException.java
-------------------------------------------------------------------------ThrowsException.java
---------------------------------------------------------------method
----------------------------------------------------------------------CommandLineDeliveryParameter.class
----------------------------------------------------------------------CommandLineDeliveryParameter.java
----------------------------------------------------------------------ConsoleCalculator.java
----------------------------------------------------------------------DefinitionAndCallMethod.java
----------------------------------------------------------------------OverloadMethod.java
----------------------------------------------------------------------RecursiveMethod.java
----------------------------------------------------------------------VariableParameter.java
---------------------------------------------------------------multithread
---------------------------------------------------------------------------InheritThreadClass.java
---------------------------------------------------------------oop
-------------------------------------------------------------------Abstract.java
-------------------------------------------------------------------Abstract1.java
-------------------------------------------------------------------Abstract2.java
-------------------------------------------------------------------ClassAndObjectCreation.java
-------------------------------------------------------------------ClassConstructor.java
-------------------------------------------------------------------CreateObjectMemoryAnalysis.java
-------------------------------------------------------------------DefinitionAndCallMethod.java
-------------------------------------------------------------------Dog.java
-------------------------------------------------------------------Encapsulation.java
-------------------------------------------------------------------Human.java
-------------------------------------------------------------------Inherit.java
-------------------------------------------------------------------InnerClass.java
-------------------------------------------------------------------InstanceofAndTypeConversion.java
-------------------------------------------------------------------Interface.java
-------------------------------------------------------------------MethodOverride.java
-------------------------------------------------------------------Outer.java
-------------------------------------------------------------------Override1.java
-------------------------------------------------------------------Override2.java
-------------------------------------------------------------------Peoples.java
-------------------------------------------------------------------Pet.java
-------------------------------------------------------------------Pets.java
-------------------------------------------------------------------Polices.java
-------------------------------------------------------------------Polymorphic.java
-------------------------------------------------------------------Scientists.java
-------------------------------------------------------------------Static.java
-------------------------------------------------------------------Students.java
-------------------------------------------------------------------Super.java
-------------------------------------------------------------------Teachers.java
-------------------------------------------------------------------TimerService.java
-------------------------------------------------------------------UserService.java
-------------------------------------------------------------------UserServiceImpl.java
---------------------------------------------------------------operator
------------------------------------------------------------------------ArithmeticalOperator.java
------------------------------------------------------------------------ConditionalOperator.java
------------------------------------------------------------------------ExtendedAssignmentOperator.java
------------------------------------------------------------------------LogicalOperator.java
------------------------------------------------------------------------MathClass.java
------------------------------------------------------------------------PositionalOperator.java
------------------------------------------------------------------------RelationalOperator.java
---------------------------------------------------------------processcontrol
------------------------------------------------------------------------------BreakContinueGotoExercise.java
------------------------------------------------------------------------------DoWhileCyclicStructure.java
------------------------------------------------------------------------------EnhanceForCyclicStructure.java
------------------------------------------------------------------------------ForCyclicStructure.java
------------------------------------------------------------------------------IfDoubleSelectionStructure.java
------------------------------------------------------------------------------IfMultipleSelectionStructure.java
------------------------------------------------------------------------------IfSingleSelectionStructure.java
------------------------------------------------------------------------------NestedIfSelectionStructure.java
------------------------------------------------------------------------------PrintTriangle.java
------------------------------------------------------------------------------ScannerClass1.java
------------------------------------------------------------------------------ScannerClass2.java
------------------------------------------------------------------------------ScannerClass3.java
------------------------------------------------------------------------------ScannerClass4.java
------------------------------------------------------------------------------ScannerClass5.java
------------------------------------------------------------------------------SwitchSelectionStructure.class
------------------------------------------------------------------------------SwitchSelectionStructure.java
------------------------------------------------------------------------------WhileCyclicStructure.java
----------------------------------out
--------------------------------------production
-------------------------------------------------javase
--------------------------------------------------------com
------------------------------------------------------------xueshanxuehai
--------------------------------------------------------------------------array
--------------------------------------------------------------------------------ApplicationArray1.class
--------------------------------------------------------------------------------ApplicationArray2.class
--------------------------------------------------------------------------------ApplicationArray3.class
--------------------------------------------------------------------------------ApplicationArray4.class
--------------------------------------------------------------------------------ApplicationTwoDimensionalArray.class
--------------------------------------------------------------------------------ArrayClass.class
--------------------------------------------------------------------------------ArrayDeclarationAndCreation.class
--------------------------------------------------------------------------------BubbleSortAlgorithm.class
--------------------------------------------------------------------------------InitializationArray.class
--------------------------------------------------------------------------------SparseArray.class
--------------------------------------------------------------------------basic
--------------------------------------------------------------------------------Comments.class
--------------------------------------------------------------------------------Constant.class
--------------------------------------------------------------------------------DataTypeExtension.class
--------------------------------------------------------------------------------HelloWorld.class
--------------------------------------------------------------------------------JavaDoc.class
--------------------------------------------------------------------------------TypeConversion.class
--------------------------------------------------------------------------------Variable.class
--------------------------------------------------------------------------commonclass
--------------------------------------------------------------------------------------datetime
-----------------------------------------------------------------------------------------------CalendarClass.class
-----------------------------------------------------------------------------------------------DateClass.class
-----------------------------------------------------------------------------------------------DateFormatAndSimpleDateFormat.class
-----------------------------------------------------------------------------------------------DateTimeFormatterClass.class
-----------------------------------------------------------------------------------------------LocalDateAndLocalTimeAndLocalDateTime.class
--------------------------------------------------------------------------------------file
-------------------------------------------------------------------------------------------CommonMethod.class
-------------------------------------------------------------------------------------------CreateFile.class
-------------------------------------------------------------------------------------------CreateFileDirectory.class
-------------------------------------------------------------------------------------------DeleteFileAndFolder.class
-------------------------------------------------------------------------------------------DeleteFileDirectory.class
-------------------------------------------------------------------------------------------ViewAllSubFile.class
-------------------------------------------------------------------------------------------ViewSubFileDirectory.class
--------------------------------------------------------------------------------------math
-------------------------------------------------------------------------------------------CommonMethod.class
--------------------------------------------------------------------------------------object
---------------------------------------------------------------------------------------------Car.class
---------------------------------------------------------------------------------------------CarDeep.class
---------------------------------------------------------------------------------------------CloneDeepMethod.class
---------------------------------------------------------------------------------------------CloneGeneralMethod.class
---------------------------------------------------------------------------------------------CloneShallowMethod.class
---------------------------------------------------------------------------------------------Computer.class
---------------------------------------------------------------------------------------------Cpu.class
---------------------------------------------------------------------------------------------Engine.class
---------------------------------------------------------------------------------------------EngineDeep.class
---------------------------------------------------------------------------------------------EqualsAndHashcode.class
---------------------------------------------------------------------------------------------EqualsDeepenMethod.class
---------------------------------------------------------------------------------------------EqualsMethod.class
---------------------------------------------------------------------------------------------Fire.class
---------------------------------------------------------------------------------------------HashCodeMethod.class
---------------------------------------------------------------------------------------------Person.class
---------------------------------------------------------------------------------------------Scientist.class
---------------------------------------------------------------------------------------------Star.class
---------------------------------------------------------------------------------------------Tire.class
---------------------------------------------------------------------------------------------TireDeep.class
---------------------------------------------------------------------------------------------ToStringMethod.class
---------------------------------------------------------------------------------------------User.class
---------------------------------------------------------------------------------------------Water.class
--------------------------------------------------------------------------------------string
---------------------------------------------------------------------------------------------CommonMethod.class
---------------------------------------------------------------------------------------------CreateObjectMethod.class
---------------------------------------------------------------------------------------------InternMethod001.class
---------------------------------------------------------------------------------------------InternMethod002.class
---------------------------------------------------------------------------------------------InternMethod003.class
---------------------------------------------------------------------------------------------InternMethod004.class
---------------------------------------------------------------------------------------------InternMethod005.class
---------------------------------------------------------------------------------------------InternMethod006.class
---------------------------------------------------------------------------------------------MemoryModelAnalysis001.class
---------------------------------------------------------------------------------------------MemoryModelAnalysis002.class
---------------------------------------------------------------------------------------------MemoryModelAnalysis003.class
---------------------------------------------------------------------------------------------MemoryModelAnalysis004.class
---------------------------------------------------------------------------------------------MemoryModelAnalysis005.class
---------------------------------------------------------------------------------------------MemoryModelAnalysis006.class
---------------------------------------------------------------------------------------------SourceCodeAnalysis.class
---------------------------------------------------------------------------------------------StringBufferAndStringBuilder.class
---------------------------------------------------------------------------------------------StringEncryptionAndDecryption.class
--------------------------------------------------------------------------------------wrapper
----------------------------------------------------------------------------------------------CacheInteger.class
----------------------------------------------------------------------------------------------CommonPropertiesAndMethods.class
----------------------------------------------------------------------------------------------CreatingMethodsAndAutoboxingUnboxing.class
--------------------------------------------------------------------------exception
------------------------------------------------------------------------------------CallCustomException.class
------------------------------------------------------------------------------------CatchException.class
------------------------------------------------------------------------------------CustomException.class
------------------------------------------------------------------------------------ThrowException.class
------------------------------------------------------------------------------------ThrowsException.class
--------------------------------------------------------------------------method
---------------------------------------------------------------------------------CommandLineDeliveryParameter.class
---------------------------------------------------------------------------------ConsoleCalculator.class
---------------------------------------------------------------------------------DefinitionAndCallMethod.class
---------------------------------------------------------------------------------OverloadMethod.class
---------------------------------------------------------------------------------RecursiveMethod.class
---------------------------------------------------------------------------------VariableParameter.class
--------------------------------------------------------------------------multithread
--------------------------------------------------------------------------------------InheritThreadClass.class
--------------------------------------------------------------------------oop
------------------------------------------------------------------------------Abstract.class
------------------------------------------------------------------------------Abstract1.class
------------------------------------------------------------------------------Abstract2.class
------------------------------------------------------------------------------ClassAndObjectCreation.class
------------------------------------------------------------------------------ClassConstructor.class
------------------------------------------------------------------------------CreateObjectMemoryAnalysis.class
------------------------------------------------------------------------------DefinitionAndCallMethod.class
------------------------------------------------------------------------------Dog.class
------------------------------------------------------------------------------Encapsulation.class
------------------------------------------------------------------------------Human.class
------------------------------------------------------------------------------Inherit.class
------------------------------------------------------------------------------InnerClass$1.class
------------------------------------------------------------------------------InnerClass.class
------------------------------------------------------------------------------InnerClassInterface.class
------------------------------------------------------------------------------InstanceofAndTypeConversion.class
------------------------------------------------------------------------------Interface.class
------------------------------------------------------------------------------MethodOverride.class
------------------------------------------------------------------------------OtherClass.class
------------------------------------------------------------------------------Outer$1LocalInner.class
------------------------------------------------------------------------------Outer$MemberInner.class
------------------------------------------------------------------------------Outer$StaticInner.class
------------------------------------------------------------------------------Outer.class
------------------------------------------------------------------------------Override1.class
------------------------------------------------------------------------------Override2.class
------------------------------------------------------------------------------Peoples.class
------------------------------------------------------------------------------Person.class
------------------------------------------------------------------------------Pet.class
------------------------------------------------------------------------------Pets.class
------------------------------------------------------------------------------Polices.class
------------------------------------------------------------------------------Polymorphic.class
------------------------------------------------------------------------------Scientists.class
------------------------------------------------------------------------------Static.class
------------------------------------------------------------------------------Student.class
------------------------------------------------------------------------------Students.class
------------------------------------------------------------------------------Super.class
------------------------------------------------------------------------------Teachers.class
------------------------------------------------------------------------------TimerService.class
------------------------------------------------------------------------------UserService.class
------------------------------------------------------------------------------UserServiceImpl.class
--------------------------------------------------------------------------operator
-----------------------------------------------------------------------------------ArithmeticalOperator.class
-----------------------------------------------------------------------------------ConditionalOperator.class
-----------------------------------------------------------------------------------ExtendedAssignmentOperator.class
-----------------------------------------------------------------------------------LogicalOperator.class
-----------------------------------------------------------------------------------MathClass.class
-----------------------------------------------------------------------------------PositionalOperator.class
-----------------------------------------------------------------------------------RelationalOperator.class
--------------------------------------------------------------------------processcontrol
-----------------------------------------------------------------------------------------BreakContinueGotoExercise.class
-----------------------------------------------------------------------------------------DoWhileCyclicStructure.class
-----------------------------------------------------------------------------------------EnhanceForCyclicStructure.class
-----------------------------------------------------------------------------------------ForCyclicStructure.class
-----------------------------------------------------------------------------------------IfDoubleSelectionStructure.class
-----------------------------------------------------------------------------------------IfMultipleSelectionStructure.class
-----------------------------------------------------------------------------------------IfSingleSelectionStructure.class
-----------------------------------------------------------------------------------------NestedIfSelectionStructure.class
-----------------------------------------------------------------------------------------PrintTriangle.class
-----------------------------------------------------------------------------------------ScannerClass1.class
-----------------------------------------------------------------------------------------ScannerClass2.class
-----------------------------------------------------------------------------------------ScannerClass3.class
-----------------------------------------------------------------------------------------ScannerClass4.class
-----------------------------------------------------------------------------------------ScannerClass5.class
-----------------------------------------------------------------------------------------SwitchSelectionStructure.class
-----------------------------------------------------------------------------------------WhileCyclicStructure.class
-------------------------Workspace
-----------------------------------Project
-------------------------------------------JavaDoc
---------------------------------------------------allclasses-frame.html
---------------------------------------------------allclasses-noframe.html
---------------------------------------------------com
-------------------------------------------------------xueshanxuehai
---------------------------------------------------------------------Basic
---------------------------------------------------------------------------JavaDoc.html
---------------------------------------------------------------------------package-frame.html
---------------------------------------------------------------------------package-summary.html
---------------------------------------------------------------------------package-tree.html
---------------------------------------------------constant-values.html
---------------------------------------------------deprecated-list.html
---------------------------------------------------help-doc.html
---------------------------------------------------index-files
---------------------------------------------------------------index-1.html
---------------------------------------------------------------index-2.html
---------------------------------------------------------------index-3.html
---------------------------------------------------index.html
---------------------------------------------------overview-tree.html
---------------------------------------------------package-list
---------------------------------------------------script.js
---------------------------------------------------stylesheet.css

7.3、File类创建文件目录(File Class Create File Directory)

  • 7.3.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.file;
import java.io.File;
public class CreateFileDirectory {
    public static void main(String[] args) {
        /**
         *创建文件目录
         *File类mkdir方法:只能创建父级目录存在的子文件目录
         *File类mkdirs方法:可以创建父级目录不存在的子文件目录
         */
        File fileMkdir1=new File("E:\\JavaSE1");
        if(!fileMkdir1.exists()){
            //文件目录不存在
            System.out.println("文件("+fileMkdir1.toString()+")使用fileMkdir1.mkdir()方法创建结果为:"+fileMkdir1.mkdir());
        }
        File fileMkdir2=new File("E:\\JavaSE1\\File\\mkdir");
        if(!fileMkdir2.exists()){
            //文件目录不存在
            System.out.println("文件("+fileMkdir2.toString()+")fileMkdir2.mkdir()方法创建结果为:"+fileMkdir2.mkdir());
        }
        File fileMkdirs1=new File("E:\\JavaSE2");
        if(!fileMkdirs1.exists()){
            //文件目录不存在
            System.out.println("文件("+fileMkdirs1.toString()+")fileMkdirs1.mkdirs()方法创建结果为:"+fileMkdirs1.mkdirs());
        }
        File fileMkdirs2=new File("E:\\JavaSE2\\File\\mkdirs");
        if(!fileMkdirs2.exists()){
            //文件目录不存在
            System.out.println("文件("+fileMkdirs2.toString()+")fileMkdirs2.mkdirs()方法创建结果为:"+fileMkdirs2.mkdirs());
        }
    }
}
  • 7.3.2、运行结果(Run Result)

其运行结果,如以下信息所示

文件(E:\JavaSE1)使用fileMkdir1.mkdir()方法创建结果为:true
文件(E:\JavaSE1\File\mkdir)fileMkdir2.mkdir()方法创建结果为:false
文件(E:\JavaSE2)fileMkdirs1.mkdirs()方法创建结果为:true
文件(E:\JavaSE2\File\mkdirs)fileMkdirs2.mkdirs()方法创建结果为:true

7.4、File类创建文件(File Class Create File)

  • 7.4.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.file;
import java.io.File;
import java.io.IOException;
public class CreateFile {
    public static void main(String[] args) throws IOException {
        /**
         *创建文件
         *File类createNewFile方法:创建任意指定类型的文件
         */
        File file1=new File("E:\\JavaSE","1.txt");
        if(!file1.exists()){
            if(!file1.getParentFile().exists()){
                boolean bool1=file1.getParentFile().mkdirs();
                System.out.println("文件("+file1.getParentFile().toString()+")file1.getParentFile().mkdirs()方法创建结果为:"+bool1);
                if(bool1){
                    System.out.println("文件("+file1.toString()+")使用file1.createNewFile()方法创建结果为:"+file1.createNewFile());
                }
            }else{
                System.out.println("文件("+file1.toString()+")使用file1.createNewFile()方法创建结果为:"+file1.createNewFile());
            }
        }
    }
}
  • 7.4.2、运行结果(Run Result)

其运行结果,如以下信息所示

文件(E:\JavaSE)file1.getParentFile().mkdirs()方法创建结果为:true
文件(E:\JavaSE\1.txt)使用file1.createNewFile()方法创建结果为:true

7.5、File类删除文件与文件夹(File Class Delete File And Folder)

7.5.1、删除文件与文件夹(Delete File And Folder)
  • 7.5.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.file;
import java.io.File;
public class DeleteFileAndFolder {
    public static void main(String[] args) {
        /**
         *删除文件与文件夹
         *File类delete方法:删除任意指定的文件与文件夹
         */
        //删除文件
        File file1=new File("E:\\JavaSE\\1.txt");
        System.out.println("文件("+file1.toString()+")使用file1.delete()方法删除结果为:"+file1.delete());
        //删除文件夹
        File file2=new File("E:\\JavaSE\\2");
        System.out.println("文件("+file2.toString()+")使用file2.delete()方法删除结果为:"+file2.delete());
    }
}
  • 7.5.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

文件(E:\JavaSE\1.txt)使用file1.delete()方法删除结果为:true
文件(E:\JavaSE\2)使用file2.delete()方法删除结果为:true
7.5.2、删除包含子文件与子文件夹的文件目录(Delete File Directory of Contain Sub File And Sub Folder)
  • 7.5.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.file;
import java.io.File;
/**
 * 练习作业:使用递归删除包含子文件与子文件夹的文件目录
 */
public class DeleteFileDirectory {
    public static void main(String[] args) {
        File file = new File("E:\\JavaSE");//创建File类对象
        System.out.println("文件目录(E:\\JavaSE)的所有子文件与子文件夹(删除前):");
        if(file.exists()){
            File[] fileArr1 = file.listFiles();//获取文件目录的所有子文件
            for (int i = 0; i < fileArr1.length; i++) {
                System.out.println(fileArr1[i]);
            }
        }
        System.out.println("递归删除包含子文件与子文件夹的文件目录(E:\\JavaSE)");
        while(file.exists()){
            //若指定文件目录还存在,则继续删除包含子文件与子文件夹的文件目录
            deleteFileDirectory(file);//递归删除包含子文件与子文件夹的文件目录
        }
        System.out.println("文件目录及其所有子文件与子文件夹(删除后)");
        if(file.exists()) {
            System.out.println("文件目录:"+file.toString());
            System.out.println("所有子文件与子文件夹:");
            File[] fileArr2 = file.listFiles();//获取文件目录的所有子文件
            for (int i = 0; i < fileArr2.length; i++) {
                System.out.println(fileArr2[i]);
            }
        }
    }
    public static void deleteFileDirectory(File file) {
        /**
         *递归删除包含子文件与子文件夹的文件目录
         */
        //判断文件是否为文件夹目录
        if (file.isDirectory()) {
            //File类对象为文件夹
            File[] fileArr = file.listFiles();//获取文件目录的所有子文件
            if (fileArr.length == 0) {
                file.delete();//删除文件夹
            }
            for (int i = 0; i < fileArr.length; i++) {
                deleteFileDirectory(fileArr[i]);//递归删除包含子文件与子文件夹的文件目录
            }
        } else {
            file.delete();//删除文件
        }
        return;//返回方法参数并退出方法
    }
}
  • 7.5.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

文件目录(E:\JavaSE)的所有子文件与子文件夹(删除前):
E:\JavaSE\1.txt
E:\JavaSE\2
递归删除包含子文件与子文件夹的文件目录(E:\JavaSE)
文件目录及其所有子文件与子文件夹(删除后)

8、枚举类(Enum Class)

枚举是指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值。枚举通常用来表示“颜色、方式、类别、状态等数目有限、形式离散、表达又极为明确的量”

枚举是JDK1.5开始引入的新类型。其可以理解为一种特殊的Java类,在这个特殊类中定义几个静态常量,每个常量都是这个类的实例,通过关键字enum实现,自动继承自Enum类

8.1、枚举类常规使用(Enum Class General Use)

  • 8.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.enumclass;
public class GeneralUse {
    public static void main(String[] args) {
        Employee employee1=new Employee(1,"小红",EmployeeType.UNQUALIFIED);
        Employee employee2=new Employee(2,"小橙",EmployeeType.QUALIFIED);
        Employee employee3=new Employee(3,"小黄",EmployeeType.COMMONLY);
        Employee employee4=new Employee(4,"小绿",EmployeeType.EXCELLENT);
        System.out.println(employee1.id+","+employee1.name+","+employee1.employeeType);
        System.out.println(employee2.id+","+employee2.name+","+employee2.employeeType);
        System.out.println(employee3.id+","+employee3.name+","+employee3.employeeType);
        System.out.println(employee4.id+","+employee4.name+","+employee4.employeeType);
    }
}
class Employee{
    //员工类
    public int id;
    public String name;
    public EmployeeType employeeType;
    public Employee(int id, String name, EmployeeType employeeType) {
        this.id = id;
        this.name = name;
        this.employeeType = employeeType;
    }
}
enum EmployeeType{
    //员工的枚举类型(即,枚举所有的员工类型)
    UNQUALIFIED,//不合格
    QUALIFIED,//合格
    COMMONLY,//一般
    EXCELLENT;//优秀
}
  • 8.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

1,小红,UNQUALIFIED
2,小橙,QUALIFIED
3,小黄,COMMONLY
4,小绿,EXCELLENT

8.2、枚举类深化使用(Enum Class Deepen Use)

  • 8.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.enumclass;
public class DeepenUse {
    public static void main(String[] args) {
        Teacher teacher1=new Teacher(1,"李老师", TeacherType.PRIMARY);
        Teacher teacher2=new Teacher(2,"刘老师", TeacherType.INTERMEDIATE);
        Teacher teacher3=new Teacher(3,"罗老师", TeacherType.SENIOR);
        Teacher teacher4=new Teacher(4,"金老师", TeacherType.SUPER);
        Teacher teacher5=new Teacher(5,"彭老师", TeacherType.SUPER);
 System.out.println(teacher1.id+","+teacher1.name+","+teacher1.teacherType+","+teacher1.teacherType.getLevel()+","+teacher1.teacherType.getSalary()+","+teacher1.teacherType.getSubsidy());
 System.out.println(teacher2.id+","+teacher2.name+","+teacher2.teacherType+","+teacher2.teacherType.getLevel()+","+teacher2.teacherType.getSalary()+","+teacher2.teacherType.getSubsidy());
 System.out.println(teacher3.id+","+teacher3.name+","+teacher3.teacherType+","+teacher3.teacherType.getLevel()+","+teacher3.teacherType.getSalary()+","+teacher3.teacherType.getSubsidy());
 System.out.println(teacher4.id+","+teacher4.name+","+teacher4.teacherType+","+teacher4.teacherType.getLevel()+","+teacher4.teacherType.getSalary()+","+teacher4.teacherType.getSubsidy());
 System.out.println(teacher5.id+","+teacher5.name+","+teacher5.teacherType+","+teacher5.teacherType.getLevel()+","+teacher5.teacherType.getSalary()+","+teacher5.teacherType.getSubsidy());
        //枚举对象不管被使用多少次,内存中都只会被创建一次,而且只有在第一次加载枚举类的时候创建
        System.out.println("(teacher4.teacherType==teacher5.teacherType)结果为:"+(teacher4.teacherType==teacher5.teacherType));
        //遍历枚举类对象
        System.out.println("遍历枚举类对象:");
        for (TeacherType tt : TeacherType.values()) {
            System.out.println(tt.toString()+","+tt.name()+","+tt.getLevel()+","+tt.getSalary()+","+tt.getSubsidy());
        }
    }
}
class Teacher{
    //教师类
    public int id;
    public String name;
    public TeacherType teacherType;
    /**
     *教师类的构造器
     * @param id 编号
     * @param name 姓名
     * @param teacherType 教师枚举类型
     */
    public Teacher(int id, String name, TeacherType teacherType) {
        this.id = id;
        this.name = name;
        this.teacherType = teacherType;
    }
}
enum TeacherType{
    //教师的枚举类型(即,枚举所有的教师类型)
    PRIMARY(1,1000,100),//初级
    INTERMEDIATE(2,2000,200),//中级
    SENIOR(3,3000,300),//高级
    SUPER(4,4000,400);//特级
    private int level;
    private int salary;
    private int subsidy;
    /**
     *枚举类的构造器
     * @param level 级别
     * @param salary 薪资
     * @param subsidy 补助
     */
    TeacherType(int level, int salary, int subsidy) {
        this.level = level;
        this.salary = salary;
        this.subsidy = subsidy;
    }
    public int getLevel() {
        return level;
    }
    public int getSalary() {
        return salary;
    }
    public int getSubsidy() {
        return subsidy;
    }
}
  • 8.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

1,李老师,PRIMARY,1,1000,100
2,刘老师,INTERMEDIATE,2,2000,200
3,罗老师,SENIOR,3,3000,300
4,金老师,SUPER,4,4000,400
5,彭老师,SUPER,4,4000,400
(teacher4.teacherType==teacher5.teacherType)结果为:true
遍历枚举类对象:
PRIMARY,PRIMARY,1,1000,100
INTERMEDIATE,INTERMEDIATE,2,2000,200
SENIOR,SENIOR,3,3000,300
SUPER,SUPER,4,4000,400
  • 8.2.3、内存分析(Memory Analysis)

枚举类单例对象内存分析示意图,如下图所示

枚举类单例对象内存分析示意图

8.3、注意事项(Matters Needing Attention)

  • 8.3.1、枚举对象不管被使用多少次,内存中都只会被创建一次,而且只有在第一次加载枚举类的时候创建。

9、工具类(Tool Class)

一般的类名后加上"s"结尾的类称为“工具类”,如:“Objects类、Arrays类、Collections类”等

9.1、Objects工具类(Objects Tool Class)

  • 9.1.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.tool;
import java.util.Objects;
public class ObjectsClass {
    public static void main(String[] args) {
        //生成对象的哈希码值
        System.out.println("Objects.hash(\"12345\")结果为:"+Objects.hash("12345"));
        //返回对象的内容的字符串表示形式
        System.out.println("Objects.toString(null)结果为:"+Objects.toString(null));
        System.out.println("Objects.toString(new ObjectsClass())结果为:"+Objects.toString(new ObjectsClass()));
        //返回对象的内容的字符串表示形式,若第一个参数不是null,则返回第一个参数调用toString的结果,toString返回第二个参数。
        System.out.println("Objects.toString(null,\"空\")结果为:"+Objects.toString(null,"空"));
        System.out.println("Objects.toString(new ObjectsClass(),\"空\")结果为:"+Objects.toString(new ObjectsClass(),"空"));
        //比较2个对象是否相等,若相等则返回true,否则返回false
        System.out.println("Objects.equals(new ObjectsClass(),new ObjectsClass())结果为:"+ Objects.equals(new ObjectsClass(),new ObjectsClass()));
        System.out.println("Objects.equals(\"123\",\"123\")结果为:"+ Objects.equals("123","123"));
        //判断对象是否为空,若为空则返回true,否则返回false
        System.out.println("Objects.isNull(null)结果为:"+Objects.isNull(null));
        System.out.println("Objects.isNull(new ObjectsClass())结果为:"+Objects.isNull(new ObjectsClass()));
        System.out.println("Objects.isNull(\"\")结果为:"+Objects.isNull(""));
    }
}
  • 9.1.2、运行结果(Run Result)

其运行结果,如以下信息所示

Objects.hash("12345")结果为:46792786
Objects.toString(null)结果为:null
Objects.toString(new ObjectsClass())结果为:com.xueshanxuehai.commonclass.tool.ObjectsClass@1b6d3586
Objects.toString(null,"空")结果为:空
Objects.toString(new ObjectsClass(),"空")结果为:com.xueshanxuehai.commonclass.tool.ObjectsClass@4554617c
Objects.equals(new ObjectsClass(),new ObjectsClass())结果为:false
Objects.equals("123","123")结果为:true
Objects.isNull(null)结果为:true
Objects.isNull(new ObjectsClass())结果为:false
Objects.isNull("")结果为:false

9.2、Arrays工具类(Arrays Tool Class)

  • 9.2.1、示例代码(Sample Code)

其示例,如以下代码所示

package com.xueshanxuehai.commonclass.tool;
import java.util.Arrays;
public class ArraysClass {
    public static void main(String[] args) {
        int[] intArray1={1,3,5,7,9,8,6,4,2,0};
        int[] intArray2={1,3,5,7,9,8,6,4,2,0};
        //返回指定数组的内容的字符串表示形式
        System.out.println("Arrays.toString(intArray1)结果为:"+Arrays.toString(intArray1));
        System.out.println("Arrays.toString(intArray2)结果为:"+Arrays.toString(intArray2));
        //比较2个数组是否相等,若相等则返回true,否则返回false
        System.out.println("Arrays.equals(intArray1,intArray2)结果为:"+Arrays.equals(intArray1,intArray2));
        //填充指定元素给指定数组的每个元素
        int[] intArray3=new int[10];
        Arrays.fill(intArray3,10);
        System.out.println("Arrays.toString(intArray3)结果为:"+Arrays.toString(intArray3));
        //复制指定长度的数组,若指定长度大于复制数组的长度,则用零填充后面的数组元素,若指定长度小于复制数组的长度,则截取指定长度的复制数组元素。
        int[] intArray4=Arrays.copyOf(intArray3,15);
        int[] intArray5=Arrays.copyOf(intArray3,5);
        System.out.println("Arrays.toString(intArray4)结果为:"+Arrays.toString(intArray4));
        System.out.println("Arrays.toString(intArray5)结果为:"+Arrays.toString(intArray5));
        //升序排序数组元素
        Arrays.sort(intArray1);
        System.out.println("Arrays.toString(intArray1)结果为:"+Arrays.toString(intArray1));
        //二分法查找指定数组元素在数组中的位置下标索引(且若要正确找到,则数组各元素必须是已升序排序)
        System.out.println("Arrays.binarySearch(intArray1,6)结果为:"+Arrays.binarySearch(intArray1,6));
        System.out.println("Arrays.binarySearch(intArray2,6)结果为:"+Arrays.binarySearch(intArray2,6));
    }
}
  • 9.2.2、运行结果(Run Result)

其运行结果,如以下信息所示

Arrays.toString(intArray1)结果为:[1, 3, 5, 7, 9, 8, 6, 4, 2, 0]
Arrays.toString(intArray2)结果为:[1, 3, 5, 7, 9, 8, 6, 4, 2, 0]
Arrays.equals(intArray1,intArray2)结果为:true
Arrays.toString(intArray3)结果为:[10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
Arrays.toString(intArray4)结果为:[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0]
Arrays.toString(intArray5)结果为:[10, 10, 10, 10, 10]
Arrays.toString(intArray1)结果为:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Arrays.binarySearch(intArray1,6)结果为:6
Arrays.binarySearch(intArray2,6)结果为:-4

参考资料(Reference Data):

学习网站地址(即"学习网址",Learning Website Address):Java常用类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值