Java常用API

文章目录

    • String 类
      • 创建String 对象的两种方式
      • 两种创建String 对象的区别
      • String练习
      • 字符串的特性
      • 面试题
      • String 类的常见方法
    • StringBuffer 类
      • 基本介绍
      • String VS StringBuffer
      • String 和 StringBuffer 相互转换
      • StringBuffer 类常见方法
      • StringBuffer 类测试题
    • StringBuilder 类
      • 基本介绍
      • StringBuilder 常用方法
      • String、StringBuffer 和 StringBuilder 的比较
      • String、StringBuffer 和 StringBuilder 的效率测试
      • String、StringBuffer 和 StringBuilder 的选择
    • System类
    • Math类
    • Object类
      • equals 方法
      • hashCode 方法
      • toString 方法
      • finalize 方法
    • 9. BigInteger 和 BigDecimal 类
      • BigInteger类
      • BigDecimal 类
    • random类
    • 时间日期类
      • 第一代日期类 date类
      • 第二代日期类 Calendar类(日期)
      • 第三代日期类
      • LocalDate(日期/年月日); LocalTime(时间/时分秒) ;LocalDateTime(日期时间/年月日时分秒);
      • DateTimeFormatter 格式日期类
      • Instant 时间戳
    • Arrays 类
      • Arrays 类常见方法应用案例
      • Arrays 类练习
    • 包装类
      • 包装类的分类
      • 包装类和基本数据的转换
      • 练习1
      • 包装类型和String 类型的相互转换
    • Integer 类和Character 类的常用方法
      • Integer 类面试题

String 类

Java常用API_第1张图片

5. String  类实现了接口 SerializableString  可以串行化:可以在网络传输】
	              接口 Comparable [String 对象可以比较大小]
6. Stringfinal  类,不能被其他的类继承
7. String  有属性 private final char value[];  用于存放字符串内容
8. 一定要注意:value 是一个 final 类型,不可以修改(需要功力):即 value 不能指向新的地址,但是单个字符内容是可以变化

在这里插入图片描述

创建String 对象的两种方式

在这里插入图片描述

两种创建String 对象的区别

Java常用API_第2张图片

String练习

Java常用API_第3张图片
Java常用API_第4张图片
在这里插入图片描述
Java常用API_第5张图片
Java常用API_第6张图片

字符串的特性

Java常用API_第7张图片

面试题

Java常用API_第8张图片
Java常用API_第9张图片
Java常用API_第10张图片
Java常用API_第11张图片
Java常用API_第12张图片
Java常用API_第13张图片

String 类的常见方法

Java常用API_第14张图片
Java常用API_第15张图片

      //1. equals 比较内容是否相同,区分大小写
      String str1 = "hello";
      String str2 = "Hello"; 
      System.out.println(str1.equals(str2));//false
      // 2.equalsIgnoreCase 忽略大小写的判断内容是否相等
      String username = "johN";
      System.out.println("john".equalsIgnoreCase(username));//true
      // 3.length 获取字符的个数,字符串的长度
      System.out.println("张三李四".length());//4
      // 4.indexOf 获取字符在字符串对象中第一次出现的索引,索引从 0 开始,如果找不到,返回-1
      String s1 = "wer@terwe@g";
      int index = s1.indexOf('@'); System.out.println(index);// 3       System.out.println("weIndex=" + s1.indexOf("we"));//0
      // 5.lastIndexOf 获取字符在字符串中最后一次出现的索引,索引从 0 开始,如果找不到,返回-1
      s1 = "wer@terwe@g@"; index = s1.lastIndexOf('@'); System.out.println(index);//11
      System.out.println("ter 的位置=" + s1.lastIndexOf("ter"));//4
      // 6.substring 截取指定范围的子串
      String name = "hello,张三";
      //下面 name.substring(6) 从索引 6 开始截取后面所有的内容
      System.out.println(name.substring(6));//截取后面的字符  输出:张三
      //name.substring(0,5)表示从索引 0 开始截取,截取到索引 5-1=4 位置
      System.out.println(name.substring(2,5));//llo

Java常用API_第16张图片

     // 1.toUpperCase 转换成大写
     String s = "heLLo";
     System.out.println(s.toUpperCase());//HELLO
     // 2.toLowerCase
     System.out.println(s.toLowerCase());//hello
     // 3.concat 拼接字符串
     String s1 = "宝玉";
     s1 = s1.concat("林黛玉").concat("薛宝钗").concat("together");
     System.out.println(s1);//宝玉林黛玉薛宝钗 together
     // 4.replace 替换字符串中的字符
     s1 = "宝玉 and  林黛玉 林黛玉 林黛玉";
     //在 s1 中,将 所有的 林黛玉 替换成薛宝钗
     //s1.replace() 方法执行后,返回的结果才是替换过的.
     // 注意对 s1 没有任何影响
     String s11 = s1.replace("宝玉", "jack");
     System.out.println(s1);//宝玉 and 林黛玉 林黛玉 林黛玉
     System.out.println(s11);//jack and 林黛玉 林黛玉 林黛玉
     // 5.split 分割字符串, 对于某些分割字符,我们需要 转义比如 | \\等
     String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦";
     //解读:
     // 1. 以 ,  为标准对 poem  进行分割 ,  返回一个数组
     // 2. 在对字符串进行分割时,如果有特殊字符,需要加入 转义符 \ 
     String[] split = poem.split(",");
     poem = "E:\\aaa\\bbb"; 
     split = poem.split("\\\\");
     System.out.println("==分割后内容===");
     for (int i = 0; i < split.length; i++) {
          System.out.println(split[i]);
     }
     // 6.toCharArray 转换成字符数组
     s = "happy";
     char[] chs = s.toCharArray();
     for (int i = 0; i < chs.length; i++) {      
         System.out.println(chs[i]);
     }
     // 7.compareTo 比较两个字符串的大小,如果前者大,
     // 则返回正数,后者大,则返回负数,如果相等,返回 0
     // (1) 如果长度相同,并且每个字符也相同,就返回 0
     // (2) 如果长度相同或者不相同,但是在进行比较时,可以区分大小
     //	就返回 if (c1 != c2) {
     //	return c1 - c2;
     //	}
     // (3) 如果前面的部分都相同,就返回 str1.len - str2.len 
     String a = "jcck";// len = 3
     String b = "jack";// len = 4
     System.out.println(a.compareTo(b)); //  返回值是 'c' - 'a' = 2 的值
     // 8.format 格式字符串
     /* 占位符有:
     * %s  字符串 %c 字符 %d 整型 %.2f 浮点型
     */
     String name = "john"; int age = 10;
     double score = 56.857;
     char gender = '男';
     //将所有的信息都拼接在一个字符串. 
     String info ="我的姓名是" + name + "年龄是" + age + ",成绩是" + score + "性别是" + gender + "。希望大家喜欢我!";
     System.out.println(info);
     //解读
     //1. %s , %d , %.2f %c 称为占位符
     //2. 这些占位符由后面变量来替换
     //3. %s  表示后面由 字符串来替换
     //4. %d 是整数来替换
     //5. %.2f 表示使用小数来替换,替换后,只会保留小数点两位,  并且进行四舍五入的处理
     //6. %c 使用 char 类型来替换
     String formatStr = "我的姓名是%s 年龄是%d,成绩是%.2f 性别是%c.希望大家喜欢我!";
     String info2 = String.format(formatStr, name, age, score, gender);
     System.out.println("info2=" + info2);

StringBuffer 类

基本介绍

Java常用API_第17张图片

//1. StringBuffer 的直接父类 是 AbstractStringBuilder
//2. StringBuffer 实现了 Serializable,  即 StringBuffer 的对象可以串行化
//3. 在父类中	AbstractStringBuilder 有属性 char[] value,不是 final
//	该 value 数组存放 字符串内容,引出存放在堆中的
//4. StringBuffer 是一个 final 类,不能被继承
//5. 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)
//	不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String

String VS StringBuffer

Java常用API_第18张图片

String 和 StringBuffer 相互转换

      // 看 String——>StringBuffer
      String str = "hello tom";
      //方式 1  使用构造器
      //注意: 返回的才是 StringBuffer 对象,对 str 本身没有影响
      StringBuffer stringBuffer = new StringBuffer(str);
      //方式 2  使用的是 append 方法
      StringBuffer stringBuffer1 = new StringBuffer();
      stringBuffer1 = stringBuffer1.append(str);

      //看看 StringBuffer ->String
      StringBuffer stringBuffer3 = new StringBuffer("韩顺平教育");
      //方式 1  使用 StringBuffer 提供的 toString 方法
      String s = stringBuffer3.toString();
      //方式 2:  使用构造器来搞定
      String s1 = new String(stringBuffer3);

StringBuffer 类常见方法

public static void main(String[] args) {
     StringBuffer s = new StringBuffer("hello");
//增append
     s.append(',');// "hello,"
     s.append("张三丰");//"hello,张三丰"
     s.append("赵敏").append(100).append(true).append(10.5);//"hello,张三丰赵敏 100true10.5"
     System.out.println(s);//"hello,张三丰赵敏 100true10.5"
//删delete
     /*
     * 删除索引为>=start && 
     s.delete(11, 14);
     System.out.println(s);//"hello,张三丰赵敏 true10.5"
//改replace
     //,使用 周芷若 替换 索引 9-11 的字符 [9,11) 
     s.replace(9, 11, "周芷若");
     System.out.println(s);//"hello,张三丰周芷若 true10.5"
//查indexOf
     //查找指定的子串在字符串第一次出现的索引,如果找不到返回-1 
     int indexOf = s.indexOf("张三丰");
     System.out.println(indexOf);//6
 //插insert
     //在索引为 9 的位置插入 "赵敏",原来索引为 9 的内容自动后移
     s.insert(9, "赵敏");
     System.out.println(s);//"hello,张三丰赵敏周芷若 true10.5"
//长度length
     System.out.println(s.length());//22 
     System.out.println(s);
}

StringBuffer 类测试题

public static void main(String[] args) {
     String str = null;// ok
     StringBuffer sb = new StringBuffer(); //ok
     sb.append(str);//需要看源码 , 底层调用的是AbstractStringBuilder 的 appendNull 
     System.out.println(sb.length());//4
     System.out.println(sb);//null
     //下面的构造器,会抛出 NullpointerException
     StringBuffer sb1 = new StringBuffer(str);//看底层源码 super(str.length() + 16); 
     System.out.println(sb1);
}

Java常用API_第19张图片

 public static void main(String[] args) {
        new Scanner(System.in);
        String price = "345678.88";
        StringBuffer sb = new StringBuffer(price);
       //先完成一个最简单的实现 123,564.59
       //找到小数点的索引,然后在该位置的前 3 位,插入,即可
//        int i = sb.lastIndexOf(".");
//        sb = sb.insert(i - 3, ",");
       //上面的两步需要做一个循环处理,才是正确的
        for (int i = sb.lastIndexOf(".") - 3; i > 0; i -= 3) {
            sb = sb.insert(i, ",");
        }
        System.out.println(sb);//345,678.88
    }

StringBuilder 类

基本介绍

Java常用API_第20张图片

//1. StringBuffer 的直接父类 是 AbstractStringBuilder
//2. StringBuffer 实现了 Serializable,  即 StringBuffer 的对象可以串行化
//3. 在父类中	AbstractStringBuilder 有属性 char[] value,不是 final
//	该 value 数组存放 字符串内容,引出存放在堆中的
//4. StringBuffer 是一个 final 类,不能被继承
//5. 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)
//	不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String
       StringBuffer stringBuffer = new StringBuffer("hello");

StringBuilder 常用方法

Java常用API_第21张图片

//1. StringBuilder 继承 AbstractStringBuilder 类
//2. 实现了 Serializable ,说明 StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)
//3. StringBuilder 是 final 类,  不能被继承
//4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value;
//	因此,字符序列是堆中
//5. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用
//	StringBuilder
       StringBuilder stringBuilder = new StringBuilder();

String、StringBuffer 和 StringBuilder 的比较

Java常用API_第22张图片

String、StringBuffer 和 StringBuilder 的效率测试

  • StringVsStringBufferVsStringBuilder.java 效率 :StringBuilder > StringBuffer > String
 public static void main(String[] args) {
        long startTime = 0L;
        long endTime = 0L;
        StringBuffer buffer = new StringBuffer("");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 80000; i++) {//StringBuffer 拼接 20000 次
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer 的执行时间:" + (endTime - startTime));
        StringBuilder builder = new StringBuilder("");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 80000; i++) {//StringBuilder 拼接 20000 次
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder 的执行时间:" + (endTime - startTime));

        String text = "";
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 80000; i++) {//String 拼接 20000
             text = text + i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("String 的执行时间:" + (endTime - startTime));
}
结果:
StringBuffer 的执行时间:13
StringBuilder 的执行时间:7
String 的执行时间:6226

String、StringBuffer 和 StringBuilder 的选择

Java常用API_第23张图片

System类

在这里插入图片描述

  public static void main(String[] args) {
//exit 退出当前程序
	System.out.println("ok1");
//	//1. exit(0) 表示程序退出
//	//2. 0 表示一个状态 , 正常的状态
//	System.exit(0);//
//	System.out.println("ok2");
//arraycopy :复制数组元素,比较适合底层调用,
// 一般使用 Arrays.copyOf 完成复制数组
        int[] src={1,2,3};
        int[] dest = new int[3];// dest  当前是 {0,0,0}
//1. 主要是搞清楚这五个参数的含义
//2.源数组
// 	* @param	src	the source array.
//	srcPos: 从源数组的哪个索引位置开始拷贝
//	* @param	srcPos	starting position in the source array.
//	dest :  目标数组,即把源数组的数据拷贝到哪个数组
//	* @param	dest	the destination array.
//	destPos: 把源数组的数据拷贝到 目标数组的哪个索引
//	* @param	destPos	starting position in the destination data.
//	length: 从源数组拷贝多少个数据到目标数组
//	* @param	length	the number of array elements to be copied.
//	    System.arraycopy(src, 0, dest, 0, 2);//[1, 2, 0]
        System.arraycopy(src, 0, dest,0, src.length);//[1, 2, 3]
//        int[] src={1,2,3};
//        System.arraycopy(src, 0, dest, 1, 2);//[ 0, 1, 2]
        System.out.println("dest=" + Arrays.toString(dest));
//currentTimeMillens:返回当前时间距离 1970-1-1 的毫秒数
 System.out.println(System.currentTimeMillis());
    }

Math类

Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

  • 方法一览(均为静态方法)
    Java常用API_第24张图片
    Java常用API_第25张图片
    public static void main(String[] args) {
// Math 常用的方法(静态方法)
//1.abs 绝对值
        int abs = Math.abs(-9);
        System.out.println(abs);//9
//2.pow 求幂
        double pow = Math.pow(2, 4);//2 的 4 次方
        System.out.println(pow);//16
//3.ceil 向上取整,返回>=该参数的最小整数(转成 double);
        double ceil = Math.ceil(3.9);
        System.out.println(ceil);//4.0
//4.floor 向下取整,返回<=该参数的最大整数(转成 double)
        double floor = Math.floor(4.001);
        System.out.println(floor);//4.0
//5.round 四舍五入	Math.floor(该参数+0.5)
        long round = Math.round(5.51);
        System.out.println(round);//6
//6.sqrt 求开方
        double sqrt = Math.sqrt(9.0);
        System.out.println(sqrt);//3.0
//7.random 求随机数
//	random 返回的是 0 <= x < 1  之间的一个随机小数 范围为[0,1)
// 思考:请写出获取 a-b 之间的一个随机整数,a,b 均为整数 ,比如 a = 2, b=7
// Math.random() * (b-a)  返回的就是 0	<= 数 <= b-a
// (1) (int)(a) <= x <= (int)(a + Math.random() * (b-a +1) )
//	(int)(a + Math.random() * (b-a +1) ) = (int)( 2 + Math.random()*6)
//	Math.random()*6 返回的是 0 <= x < 6  小数
//	2 + Math.random()*6 返回的就是 2<= x < 8  小数
// 	(int)(2 + Math.random()*6) = 2 <= x <= 7
// 公式就是	(int)(a + Math.random() * (b-a +1) )
        for (int i = 0; i < 100; i++) {
            System.out.println((int) (2 + Math.random() * (7 - 2 + 1)));
        }
//8. max , min  返回最大值和最小值
        int min = Math.min(1, 9);
        int max = Math.max(45, 90);
        System.out.println("min=" + min);
        System.out.println("max=" + max);
    }

Object类

Java常用API_第26张图片

equals 方法

==和 equals 的对比 [面试题]

Java常用API_第27张图片

==
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
对于复合数据类型(类),使用equals()和“==”效果是一样的,两者比较的都是对象在内存中的存放地址(确切的说,是堆内存地址)。

equals
注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

public class test {
    public static void main(String[] args) {
        A a = new A();
        A m = new A();
        System.out.println(a==m);
        A b = a;
        A c = b;
        System.out.println(a == c);//true
        System.out.println(b == c);//true
        B bObj = a;
        System.out.println(bObj == c);//true
        int num1 = 10;
        double num2 = 10.0;
        System.out.println(num1 == num2);//基本数据类型,判断值是否相等
        
        /*即Object 的equals 方法默认就是比较对象地址是否相同
        也就是判断两个对象是不是同一个对象.*/
        Integer integer1 = new Integer(1000);
        Integer integer2 = new Integer(1000);
        System.out.println(integer1 == integer2);//false
        System.out.println(integer1.equals(integer2));//true

        String str1 = new String("jxl");
        String str2 = new String("jxl");
        System.out.println(str1 == str2);//false
        System.out.println(str1.equals(str2));//true
    }
}
class B { }
class A extends B { }

重写equals 方法
判断两个Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false。

public class test {
    public static void main(String[] args) {
        Person person1 = new Person("jack", 10);
        Person person2 = new Person("jack", 20);
        System.out.println(person1.equals(person2));//false
    }
}
//判断两个Person对象的内容是否相等,
//如果两个Person对象的各个属性值都一样,则返回true,反之false
class Person { //extends Object
    private String name;
    private int age;
    //重写Object 的 equals方法
    public boolean equals(Object obj) {
        //判断如果比较的两个对象是同一个对象,则直接返回true
        if (this == obj) {
            return true;
        }
        //类型判断
        if (obj instanceof Person) {//是Person,我们才比较
            //进行 向下转型, 因为我需要得到obj的 各个属性
            Person p = (Person) obj;
            return this.name.equals(p.name) && this.age == p.age;
        }
        //如果不是Person ,则直接返回false
        return false;
    }
    public Person(String name, int age) { this.name = name;this.age = age; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

hashCode 方法

Java常用API_第28张图片

1)提高具有哈希结构的容器的效率!
2)两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
3)两个引用,如果指向的是不同对象,则哈希值是不一样的
4)哈希值主要根据地址号来的!, 不能完全将哈希值等价于地址。

public class test {
    public static void main(String[] args) {
        AA aa = new AA();
        AA aa2 = new AA();
        AA aa3 = aa;
        System.out.println("aa.hashCode()=" + aa.hashCode());//aa.hashCode()=356573597
        System.out.println("aa2.hashCode()=" + aa2.hashCode());//aa2.hashCode()=1735600054
        System.out.println("aa3.hashCode()=" + aa3.hashCode());//aa3.hashCode()=356573597
    }
}
class AA {}

toString 方法

  1. 基本介绍
    默认返回:全类名+@+哈希值的十六进制,【查看 Object 的 toString 方法】
    子类往往重写 toString 方法,用于返回对象的属性信息
  2. 重写 toString 方法,打印对象或拼接对象时,都会自动调用该对象的 toString 形式.
  3. 当直接输出一个对象时, toString 方法会被默认的调用, 比如 System.out.println(monster) ; 就会默认调用
    monster.toString()
public class test {
    public static void main(String[] args) {
        Monster monster = new Monster("小妖怪", "巡山的");
        System.out.println(monster.toString() + " hashcode=" + monster.hashCode());
        //Monster{name='小妖怪', job='巡山的} hashcode=356573597
        System.out.println("==当直接输出一个对象时,toString 方法会被默认的调用==");
        System.out.println(monster); //等价 monster.toString()  //Monster{name='小妖怪', job='巡山的}
    }
}
class Monster {
    private String name;
    private String job;
    public Monster(String name, String job) {
        this.name = name;
        this.job = job;
    }
    //重写toString方法, 输出对象的属性
    //使用快捷键即可 alt+insert -> toString
    @Override
    public String toString() { //重写后,一般是把对象的属性值输出,当然程序员也可以自己定制
        return "Monster{" +
                "name='" + name + '\'' +
                ", job='" + job + '}';
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("fin..");
    }
}

finalize 方法

  1. 当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作
  2. 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用 finalize 方法。
  3. 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制,测试:Car [name]
    提示: 我们在实际开发中,几乎不会运用 finalize , 所以更多就是为了应付面试.
//演示 Finalize的用法
public class test {
    public static void main(String[] args) {
        Car bmw = new Car("宝马");
        //这时 car对象就是一个垃圾,垃圾回收器就会回收(销毁)对象, 在销毁对象前,会调用该对象的finalize方法
        //,程序员就可以在 finalize中,写自己的业务逻辑代码(比如释放资源:数据库连接,或者打开文件..)
        //,如果程序员不重写 finalize,那么就会调用 Object类的 finalize, 即默认处理
        //,如果程序员重写了finalize, 就可以实现自己的逻辑
        bmw = null;
        System.gc();//主动调用垃圾回收器
        System.out.println("程序退出了....");
    }
}
class Car {
    private String name;
    //属性, 资源。。
    public Car(String name) {
        this.name = name;
    }
    //重写finalize
    @Override
    protected void finalize(){
        System.out.println("我们销毁" + name + "汽车");
        System.out.println("释放了某些资源...");
    }
}

9. BigInteger 和 BigDecimal 类

在这里插入图片描述

  • BigInteger 和BigDecimal 常见方法
    Java常用API_第29张图片

BigInteger类

//当我们编程中,需要处理很大的整数,long 不够用
//可以使用 BigInteger 的类来搞定
//	long l = 23788888899999999999999999999l;
//	System.out.println("l=" + l);
        BigInteger bigInteger = new BigInteger("23788888899999999999999999999");
        BigInteger bigInteger2 = new BigInteger("10099999999999999999999999999999999999999999999999999999999999999999999999999999999");
        System.out.println(bigInteger);
//老韩解读
//1. 在对 BigInteger 进行加减乘除的时候,需要使用对应的方法,不能直接进行 + - * /
//2. 可以创建一个 要操作的 BigInteger 然后进行相应操作
        BigInteger add = bigInteger.add(bigInteger2);
        System.out.println(add);//加
        BigInteger subtract = bigInteger.subtract(bigInteger2);
        System.out.println(subtract);//减
        BigInteger multiply = bigInteger.multiply(bigInteger2);
        System.out.println(multiply);//乘
        BigInteger divide = bigInteger.divide(bigInteger2);
        System.out.println(divide);//除

BigDecimal 类


//当我们需要保存一个精度很高的数时,double 不够用,可以是 BigDecimal
//	double d = 1999.11111111111999999999999977788d;
//	System.out.println(d);
        BigDecimal bigDecimal = new BigDecimal("1999.1111111111999999999999977788");
        BigDecimal bigDecimal2 = new BigDecimal("3");
        System.out.println(bigDecimal);
//1. 如果对 BigDecimal 进行运算,比如加减乘除,需要使用对应的方法
//2. 创建一个需要操作的 BigDecimal 然后调用相应的方法即可
        System.out.println(bigDecimal.add(bigDecimal2));
        System.out.println(bigDecimal.subtract(bigDecimal2));
        System.out.println(bigDecimal.multiply(bigDecimal2));
//System.out.println(bigDecimal.divide(bigDecimal2));//可能抛出异常 ArithmeticException
//在调用 divide 方法时,指定精度即可. BigDecimal.ROUND_CEILING
//如果有无限循环小数,就会保留 分子 的精度
        System.out.println(bigDecimal.divide(bigDecimal2, BigDecimal.ROUND_CEILING));

输出
1999.1111111111999999999999977788
2002.1111111111999999999999977788
1996.1111111111999999999999977788
5997.3333333335999999999999933364
666.3703703703999999999999992596

random类

  1. DoubleStream doubles()
    返回一个有效的无限流的伪随机 double值,每个值在零(包括)和一(独占)之间。
  2. DoubleStream doubles(double randomNumberOrigin, double randomNumberBound)
    返回一个有效的无限流伪 double值 double ,每个值都符合给定的起始(包括)和绑定(排他)。
  3. DoubleStream doubles(long streamSize)
    返回一个流,产生给定的 streamSize伪 double数值 double ,每个值在零(包括)和一(独占)之间。
  4. DoubleStream doubles(long streamSize, double randomNumberOrigin, double randomNumberBound)
    返回一个流,产生给定的 streamSize伪 double数值 double ,每个值符合给定的起始(包括)和绑定(排他)。
  5. IntStream ints()
    返回一个有效的无限流的伪 int值。
  6. IntStream ints(int randomNumberOrigin, int randomNumberBound)
    返回一个有效的无限流伪 int值 int ,每个值都符合给定的起始(包括)和绑定(排他)。
  7. IntStream ints(long streamSize)
    返回一个流,产生给定的 streamSize数 int值。
  8. IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)
    返回一个流,产生给定的 streamSize数 int值,每个符合给定的起始(包括)和绑定(排他)。
  9. LongStream longs()
    返回一个有效的无限流的伪 long值。
  10. LongStream longs(long streamSize)
    返回一个流,产生给定的 streamSize数 long值。
  11. LongStream longs(long randomNumberOrigin, long randomNumberBound)
    返回一个有效的无限流伪 long值 long ,每个符合给定的起始(包括)和绑定(排他)。
  12. LongStream longs(long streamSize, long randomNumberOrigin, long randomNumberBound)
    返回一个流,产生给定的 streamSize数 long ,每个符合给定的起始(包括)和绑定(排他)。
  13. protected int next(int bits)
    生成下一个伪随机数。
  14. boolean nextBoolean()
    返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 boolean值。
  15. void nextBytes(byte[] bytes)
    生成随机字节并将它们放入用户提供的字节数组中。
  16. double nextDouble()
    返回下一个伪随机数,从这个随机数发生器的序列中 0.0和 1.0之间的 double值 0.0分布。
  17. float nextFloat()
    返回下一个伪随机数,从这个随机数发生器的序列中 0.0和 1.0之间的 float值 0.0分布。
  18. double nextGaussian()
    从该随机数发生器的序列返回下一个伪随机数,高斯(“正”)分布 double值,平均值为 0.0 ,标准差为 1.0 。
  19. int nextInt()
    返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 int值。
  20. int nextInt(int bound)
    返回伪随机的,均匀分布 int值介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。
  21. long nextLong()
    返回下一个伪,均匀分布 long从这个随机数生成器的序列值。
  22. void setSeed(long seed)
    使用单个 long种子设置该随机数生成器的种子。
//无参构造方法使用
Random random = new Random();
int num1 = random.nextInt();//产生任意int类型随机数
int num2 = random.nextInt(20);//产生[0,20)int类型随机数
Log.d("TAG", "num1----:" + num1);
Log.d("TAG", "num2----:" + num2);
 
float num3 = random.nextFloat();//产生[0.0,1.0)float类型随机数
Log.d("TAG", "num3----:" + num3);
 
long num4 = random.nextLong();//产生任意long类型随机数
Log.d("TAG", "num4----:" + num4);

double num5 = random.nextDouble();//产生[0.0,1.0)double类型随机数
Log.d("TAG", "num5----:" + num5);
 
boolean num6 = random.nextBoolean();//产生true false 随机布尔值
Log.d("TAG", "num6----:" + num6);

结果

num1----:-622470967
num2----:14
num3----:0.6668367
num4----:1014954804747680753
num5----:0.7908822895173502
num6----:false
	
num1----:2026663674
num2----:5
num3----:0.7280313
num4----:7710396352170122994
num5----:0.644316161195863
num6----:true
 
num1----:-1850071697
num2----:14
num3----:0.24932486
num4----:-9049237118974755317
num5----:0.8752749281741891
num6----:false
 
num1----:1044141443
num2----:15
num3----:0.20433605
num4----:-1239552944612942961
num5----:0.5209781249119385
num6----:true

时间日期类

第一代日期类 date类

Java常用API_第30张图片

    public static void main(String[] args) throws ParseException {
//1. 获取当前系统时间
//2. 这里的 Date 类是在 java.util 包
//3. 默认输出的日期格式是国外的方式, 因此通常需要对格式进行转换
        Date d1 = new Date(); //获取当前系统时间
        System.out.println("当前日期=" + d1);
        Date d2 = new Date(9234567); //通过指定毫秒数得到时间
        System.out.println("d2=" + d2); //获取某个时间对应的毫秒数
//1. 创建 SimpleDateFormat 对象,可以指定相应的格式
//2. 这里的格式使用的字母是规定好,不能乱写
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
        String format = sdf.format(d1); // format:将日期转换成指定格式的字符串
        System.out.println("当前日期=" + format);
//1. 可以把一个格式化的 String  转成对应的 Date
//2. 得到 Date 仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换
//3. 在把 String -> Date , 使用的 sdf 格式需要和你给的 String 的格式一样,否则会抛出转换异常
        String s = "1996年01月01日 10:20:30 星期一";
        Date parse = sdf.parse(s);
        System.out.println("parse=" + sdf.format(parse));
 }
 输出
当前日期=Sat Aug 28 17:35:54 CST 2021
d2=Thu Jan 01 10:33:54 CST 1970
当前日期=2021082805:35:54 星期六
parse=1996010110:20:30 星期一

第二代日期类 Calendar类(日期)

Java常用API_第31张图片

//1. Calendar 是一个抽象类, 并且构造器是 private
//2. 可以通过 getInstance() 来获取实例
//3. 提供大量的方法和字段提供给程序员
//4. Calendar 没有提供对应的格式化的类,因此需要程序员自己组合来输出(灵活)
//5. 如果我们需要按照 24 小时进制来获取时间, Calendar.HOUR ==改成=> Calendar.HOUR_OF_DAY
        Calendar c = Calendar.getInstance(); //创建日历类对象//比较简单,自由
        System.out.println("c=" + c);
//2.获取日历对象的某个日历字段
        System.out.println("年  :" + c.get(Calendar.YEAR));
// 这里为什么要 + 1,  因为 Calendar 返回月时候,是按照 0 开始编号
        System.out.println("月  :" + (c.get(Calendar.MONTH) + 1));
        System.out.println("日  :" + c.get(Calendar.DAY_OF_MONTH));
        System.out.println("小时:" + c.get(Calendar.HOUR));//Calendar.HOUR(12小时制) ==改成=> Calendar.HOUR_OF_DAY(24小时制)
        System.out.println("分钟:" + c.get(Calendar.MINUTE));
        System.out.println("秒  :" + c.get(Calendar.SECOND));
//Calender 没有专门的格式化方法,所以需要程序员自己来组合显示
        System.out.println(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH) +
                " " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND));

第三代日期类

在这里插入图片描述

LocalDate(日期/年月日); LocalTime(时间/时分秒) ;LocalDateTime(日期时间/年月日时分秒);

Java常用API_第32张图片

DateTimeFormatter 格式日期类

Java常用API_第33张图片

    public static void main(String[] args) {
//1. 使用 now() 返回表示当前日期时间的 对象
        LocalDateTime ldt = LocalDateTime.now(); //LocalDate.now();//LocalTime.now()
        System.out.println(ldt);
//2. 使用 DateTimeFormatter 对象来进行格式化
// 创建 DateTimeFormatter 对象
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String format = dateTimeFormatter.format(ldt);
        System.out.println("格式化的日期=" + format);
        System.out.println("年=" + ldt.getYear());
        System.out.println("月=" + ldt.getMonth());
        System.out.println("月=" + ldt.getMonthValue());
        System.out.println("日=" + ldt.getDayOfMonth());
        System.out.println("时=" + ldt.getHour());
        System.out.println("分=" + ldt.getMinute());
        System.out.println("秒=" + ldt.getSecond());
        LocalDate now = LocalDate.now(); //可以获取年月日
        LocalTime now2 = LocalTime.now();//获取到时分秒
//提供 plus  和 minus 方法可以对当前时间进行加或者减
//看看 890 天后,是什么时候 把 年月日-时分秒
        LocalDateTime localDateTime = ldt.plusDays(890);
        System.out.println("890 天后=" + dateTimeFormatter.format(localDateTime));
//看看在 3456 分钟前是什么时候,把 年月日-时分秒输出
        LocalDateTime localDateTime2 = ldt.minusMinutes(3456);
        System.out.println("3456 分钟前 日期=" + dateTimeFormatter.format(localDateTime2));
}
输出
2021-08-28T19:34:02.706
格式化的日期=2021-08-28 19:34:02=2021=AUGUST
月=8=28=19=34=2
890 天后=2024-02-04 19:34:02
3456 分钟前 日期=2021-08-26 09:58:02

Instant 时间戳

Java常用API_第34张图片

//1.通过 静态方法 now() 获取表示当前时间戳的对象
        Instant now = Instant.now();
        System.out.println(now);
//2. 通过 from  可以把 Instant 转成 Date
        Date date = Date.from(now);
//3. 通过 date 的 toInstant() 可以把 date 转成 Instant 对象
        Instant instant = date.toInstant();

Arrays 类

Arrays 类常见方法应用案例

Java常用API_第35张图片
Java常用API_第36张图片

    public static void main(String[] args) {
        Integer[] integers = {1, 20, 90};
//遍历数组
        for (int i = 0; i < integers.length; i++) {
            System.out.println(integers[i]);
        }
//一、 Arrays.toString 方法,显示数组
        System.out.println(Arrays.toString(integers));//[1, 20, 90]
//二、sort 方法的使用
        Integer arr[] = {1, -1, 7, 0, 89};
//定制排序  i2-i1 ==>从大到小   i1-i2==>从小到大
        Arrays.sort(arr, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Integer i1 = (Integer) o1;
                Integer i2 = (Integer) o2;
                return i2 - i1;
            }
        });//[89, 7, 1, 0, -1]
//  默认排序方法\自然排序
//        Arrays.sort(arr);//[-1, 0, 1, 7, 89]
        System.out.println("===排序后===");
        System.out.println(Arrays.toString(arr)); 
    }
 public static void main(String[] args) {
        {
            Integer[] arr = {1, 2, 90, 123, 567};
//三、 binarySearch 通过二分搜索法进行查找,要求必须排好
//1. 使用 binarySearch 二叉查找
//2. 要求该数组是有序的.  如果该数组是无序的,不能使用 binarySearch
//3. 如果数组中不存在该元素,就返回 return -(low + 1);	// key not found.
            int index = Arrays.binarySearch(arr, 567);
            System.out.println("index=" + index);
//四、 copyOf 数组元素的复制
//1. 从 arr 数组中,拷贝 arr.length 个元素到 newArr 数组中
//2. 如果拷贝的长度 > arr.length 就在新数组的后面 增加 null
//3. 如果拷贝长度 < 0 就抛出异常 NegativeArraySizeException
//4. 该方法的底层使用的是 System.arraycopy()
            Integer[] newArr = Arrays.copyOf(arr, arr.length);
            //Arrays.copyOf(arr, arr.length);中arr.length-1 输出[1, 2, 90, 123]
            System.out.println("==拷贝执行完毕后==");
            System.out.println(Arrays.toString(newArr));
//五、 fill 数组元素的填充
            Integer[] num = new Integer[]{9, 3, 2};
//1. 使用 99 去填充 num 数组,可以理解成是替换原来所有的元素
            Arrays.fill(num, 99);
            System.out.println("==num 数组填充后==");
            System.out.println(Arrays.toString(num));//[99, 99, 99]
//六、 equals 比较两个数组元素内容是否完全一致
            Integer[] arr2 = {1, 2, 90, 123};
//1. 如果 arr 和 arr2 数组的元素一样,则方法 true;
//2. 如果不是完全一样,就返回 false
            boolean equals = Arrays.equals(arr, arr2);
            System.out.println("equals=" + equals);
//七、 asList 将一组值,转换成 list集合
//1. asList 方法,会将 (2,3,4,5,6,1)数据转成一个 List 集合
//2. 返回的 asList  编译类型 List(接口)
//3. asList  运行类型 java.util.Arrays#ArrayList, 是 Arrays 类的
//	静态内部类 private static class ArrayList extends AbstractList
//	implements RandomAccess, java.io.Serializable
            List asList = Arrays.asList(2, 3, 4, 5, 6, 1);
            System.out.println("asList=" + asList);
            System.out.println("asList 的运行类型" + asList.getClass());
        }
    }

Arrays 类练习

public static void main(String[] args) {
        Book[] books = new Book[4];
        books[0] = new Book("红楼梦", 100);
        books[1] = new Book("金瓶梅新", 90);
        books[2] = new Book("青年文摘20年 ", 5);
        books[3] = new Book("java从入门到放弃", 300);
//price 从大到小\从大到小
        Arrays.sort(books, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
                double priceVal = book2.getPrice() - book1.getPrice();
                //如果发现返回结果和我们输出的不一致,就修改一下返回的 1  和 -1
                if (priceVal > 0) {
                    return -1;
                } else if (priceVal < 0) {
                    return 1;
                } else {
                    return 0;
                }
            }
          });
        Arrays.sort(books, new Comparator() {
            //这里是对 Book 数组排序,因此	o1  和 o2  就是 Book 对象
            @Override
            public int compare(Object o1, Object o2) {
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
//要求按照书名的长度来进行排序
                return book2.getName().length() - book1.getName().length();
            }
        });
        System.out.println(Arrays.toString(books));
    }
}
class Book {
    private String name;private double price;
    public Book(String name, double price) { this.name = name;this.price = price; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' + ", price=" + price +
                '}';
    }

包装类

包装类的分类

1)针对八种基本数据类型相应的引用类型—包装类
2)有了类的特点,就可以调用类中的方法。
在这里插入图片描述
Java常用API_第37张图片
在这里插入图片描述
在这里插入图片描述

包装类和基本数据的转换

在这里插入图片描述

public static void main(String[] args) {
      //演示 int <--> Integer 的装箱和拆箱
      //jdk5 前是手动装箱和拆箱
      //手动装箱 int->Integer int n1 = 100;
      Integer integer = new Integer(n1); 
      Integer integer1 = Integer.valueOf(n1);

      //手动拆箱
      //Integer -> int
      int i = integer.intValue();

      //jdk5 后,就可以自动装箱和自动拆箱
      int n2 = 200;
      //自动装箱 int->Integer
      Integer integer2 = n2; //底层使用的是 Integer.valueOf(n2)
      //自动拆箱 Integer->int
      int n3 = integer2; //底层仍然使用的是 intValue()方法
}

练习1

在这里插入图片描述

包装类型和String 类型的相互转换

public static void main(String[] args) {
     //包装类(Integer)->String Integer i = 100;//自动装箱
     //方式 1
     String str1 = i + "";
     //方式 2
     String str2 = i.toString();
     //方式 3
     String str3 = String.valueOf(i);

     //String -> 包装类(Integer) String str4 = "12345";
     Integer i2 = Integer.parseInt(str4);//使用到自动装箱
     Integer i3 = new Integer(str4);//构造器

     System.out.println("ok~~");
}

Integer 类和Character 类的常用方法

public static void main(String[] args) {
     System.out.println(Integer.MIN_VALUE); //返回最小值
     System.out.println(Integer.MAX_VALUE);//返回最大值
     
     System.out.println(Character.isDigit('a'));//判断是不是数字
     System.out.println(Character.isLetter('a'));//判断是不是字母
     System.out.println(Character.isUpperCase('a'));//判断是不是大写
     System.out.println(Character.isLowerCase('a'));//判断是不是小写

     System.out.println(Character.isWhitespace('a'));//判断是不是空格
     System.out.println(Character.toUpperCase('a'));//转成大写
     System.out.println(Character.toLowerCase('A'));//转成小写
}

Integer 类面试题

  • 1. 如果 i 在 IntegerCache.low(-128)~IntegerCache.high(127),就直接从数组返回
  • 2. 如果不在 -128~127,就直接 new Integer(i)
public static void main(String[] args) { 
     Integer i = new Integer(1); 
     Integer j = new Integer(1);
     System.out.println(i == j);	//False
     //所以,这里主要是看范围 -128 ~ 127  就是直接返回
     /*
     //1. 如果 i 在 IntegerCache.low(-128)~IntegerCache.high(127),就直接从数组返回
     //2. 如果不在 -128~127,就直接 new Integer(i) 
     public static Integer valueOf(int i) {
          if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
          return new Integer(i);
     }
     */
     Integer m = 1; //底层 Integer.valueOf(1); -> 阅读源码
     Integer n = 1;// 底 层 Integer.valueOf(1); 
     System.out.println(m == n); //T
     //所以,这里主要是看范围 -128 ~ 127  就是直接返回
     //,否则,就 new Integer(xx);
     Integer x = 128;//底层 Integer.valueOf(1); 
     Integer y = 128;//底层 Integer.valueOf(1); 
     System.out.println(x == y);//False


     //示例一
     Integer i1 = new Integer(127); 
     Integer i2 = new Integer(127);      
     System.out.println(i1 == i2);//F
     //示例二
     Integer i3 = new Integer(128); 
     Integer i4 = new Integer(128);      
     System.out.println(i3 == i4);//F
     //示例三
     Integer i5 = 127;//底层 Integer.valueOf(127) 
     Integer i6 = 127;//-128~127 
     System.out.println(i5 == i6); //T
     //示例四
     Integer i7 = 128;
     Integer i8 = 128; 
     System.out.println(i7 == i8);//F
     //示例五
     Integer i9 = 127; //Integer.valueOf(127) 
     Integer i10 = new Integer(127); 
     System.out.println(i9 == i10);//F
     // 示 例 六 
     Integer i11=127; 
     int i12=127;
     //只要有基本数据类型,判断的是
     //值是否相同
     System.out.println(i11==i12); //T
     //示例七
     Integer i13=128; 
     int i14=128;
     System.out.println(i13==i14);//T
}

你可能感兴趣的:(Java基础,java)