Object类介绍

所有**类**都直接或间接的继承Object类,Object类是所有类的**根基类**,它里面定义的都是一个非常基础的方法,这些方法,通常都不适用,往往要**重写**
这个类是java.lang包下的一个类,直接使用无需导包。
所有java对象都拥有Object类的属性方法
作为参数,可以接受任何对象
作为返回值,可返回任何对象

常用方法

toString() : String

作用:打印对象的信息

  • **重写前**:打印的是**全类名+@+16进制的hashcode()** ```java public class Student { private String name; private int age;

    public Student() { }

    public Student(String name, int age) {

    1. this.name = name;
    2. this.age = age;

    }

    public String getName() {

    1. return name;

    }

    public int getAge() {

    1. return age;

    }

    public void setName(String name) {

    1. this.name = name;

    }

    public void setAge(int age) {

    1. this.age = age;

    }

}

  1. ```java
  2. public class Test02 {
  3. public static void main(String[] args) {
  4. String str = "abc";
  5. System.out.println(str.toString());
  6. Student s = new Student("哈哈",34);
  7. System.out.println(s.toString());//Student@1b6d3586
  8. }
  9. }
  • **重写后**:打印的是**对象中的属性值**

    1. public class Student {
    2. private String name;
    3. private int age;
    4. public Student() {
    5. }
    6. public Student(String name, int age) {
    7. this.name = name;
    8. this.age = age;
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public int getAge() {
    14. return age;
    15. }
    16. public void setName(String name) {
    17. this.name = name;
    18. }
    19. public void setAge(int age) {
    20. this.age = age;
    21. }
    22. @Override
    23. public String toString() {
    24. return "Student{" +
    25. "name='" + name + '\'' +
    26. ", age=" + age +
    27. '}';
    28. }
    29. }
    1. public class Test02 {
    2. public static void main(String[] args) {
    3. String str = "abc";
    4. System.out.println(str.toString());
    5. Student s = new Student("哈哈",34);
    6. System.out.println(s.toString());
    7. }
    8. }

equals( Object other) : boolean

作用:比较两个对象是否相等,**默认比较的是地址**,如果对象需要比较**属性值**,则需**重写**

  • **重写前****比较的是对象中的地址值**

    1. public class Student {
    2. private String name;
    3. private int age;
    4. public Student() {
    5. }
    6. public Student(String name, int age) {
    7. this.name = name;
    8. this.age = age;
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public int getAge() {
    14. return age;
    15. }
    16. public void setName(String name) {
    17. this.name = name;
    18. }
    19. public void setAge(int age) {
    20. this.age = age;
    21. }
    22. @Override
    23. public String toString() {
    24. return "Student{" +
    25. "name='" + name + '\'' +
    26. ", age=" + age +
    27. '}';
    28. }
    29. }
    1. public class Test05 {
    2. public static void main(String[] args) {
    3. String s1 = "abc";
    4. String s2 = "abc";
    5. System.out.println(s1.equals(s2));//true
    6. Student stu1 = new Student("哈哈",35);
    7. Student stu2 = new Student("哈哈",35);
    8. System.out.println(stu1.equals(stu2));//false
    9. }
    10. }
  • **重写后****比较的是对象中的属性值** ```java public class Student { private String name; private int age;

    public Student() { }

    public Student(String name, int age) {

    1. this.name = name;
    2. this.age = age;

    }

    public String getName() {

    1. return name;

    }

    public int getAge() {

    1. return age;

    }

    public void setName(String name) {

    1. this.name = name;

    }

    public void setAge(int age) {

    1. this.age = age;

    }

    @Override public String toString() {

    1. return "Student{" +
    2. "name='" + name + '\'' +
    3. ", age=" + age +
    4. '}';

    }

    @Override public boolean equals(Object o) {

    1. if (this == o) return true;
    2. if (o == null || getClass() != o.getClass()) return false;
    3. Student student = (Student) o;
    4. return age == student.age && Objects.equals(name, student.name);

    }

}

  1. ```java
  2. public class Test05 {
  3. public static void main(String[] args) {
  4. String s1 = "abc";
  5. String s2 = "abc";
  6. System.out.println(s1.equals(s2));//true
  7. Student stu1 = new Student("哈哈",35);
  8. Student stu2 = new Student("哈哈",35);
  9. System.out.println(stu1.equals(stu2));//true
  10. }
  11. }

hashCode() : int

作用:获得该对象的哈希码,hashcode折射出的是该对象的**地址信息**(并不是直接地址)**用比较地址来判断是不是属于同一个对象**

  1. public class TestPerson {
  2. public static void main(String[] args) {
  3. Person p1 = new Person();
  4. System.out.println(p1.hashCode());//内存地址:1872034366
  5. Person p2 = new Person();
  6. System.out.println(p2.hashCode());//内存地址:1581781576
  7. }
  8. }

不同对象的 hashcode 是不同的。两个对象不相等 那么 hashcode也应该不同。

getClass() :Class

作用:获得**对象类型信息**,比如获得类名属性信息方法信息等。

  1. public class TestPerson {
  2. public static void main(String[] args) {
  3. Person person = new Person();
  4. Class<? extends Person> aClass = person.getClass();
  5. System.out.println(aClass);//class com.xixi.Person
  6. //这个类型有那些属性
  7. Field[] arr = aClass.getDeclaredFields();
  8. for(Field xx :arr){
  9. System.out.println(xx.getName());//name age
  10. }
  11. }
  12. }

finalize():void

  • 当对象被判断为垃圾对象时,由**jvm**自动调用此方法,用以标记垃圾对象,进入回收队列
  • 垃圾对象:没有有效引用指向改对象时,为垃圾对象
  • 垃圾回收:有GC销毁垃圾对象,次方数据存储空间
  • 自动回收机制:jvm的内存耗尽,一次性回收所有垃圾对象
  • 手动回收机制:使用System.gc();通过jvm执行垃圾回收 ```java class Student extends Person{ @Override protected void finalize() throws Throwable{
    1. System.out.println("GG");
    }

}

  1. ```java
  2. public class TestStudent {
  3. public static void main(String[] args) {
  4. Student student = new Student();
  5. student = null;
  6. System.gc();//调用gc,触发jvm垃圾对象回收
  7. }
  8. }

调用垃圾回收,需先重写

clone( ) : Object

复制一个对象的方法。通常一个对象要支持克隆需要实现一个 Cloneable 接口,否则引发 CloneNotSupportedException 。如果不实现这个接口,需要手动创建对象填充属性值。

Cloneable 是一个标志接口,用于标识一个类是否支持克隆。

  1. class Foo implements Cloneable {
  2. String name;
  3. int age;
  4. public Foo(){
  5. }
  6. public Foo(String name, int age) {
  7. this.name = name;
  8. this.age = age;
  9. }
  10. @Override
  11. protected Object clone() throws CloneNotSupportedException {
  12. return super.clone();
  13. }
  14. }

Objectst类介绍

equals()方法

作用:比较两个**对象是否相同**,但是加了一些**健壮性的判断**

  1. public class Test04 {
  2. public static void main(String[] args) {
  3. String s1 = null;
  4. String s2 = "abc";
  5. //System.out.println(s1.equals(s2));//NullPointerException
  6. boolean result = Objects.equals(s1, s2);
  7. System.out.println(result);
  8. }
  9. }

System.out.println(s1.equals(s2))打印输出结构会报**空指针异常**,但是**Objects.equals**可打印输出结果

String类:

不可变字符串

概述

**java.lang.String**类代表字符串
程序当中所有的**双引号**字符串,都是String类的对象。(就算没有new,也照样是)

字符串的特点

  • 字符串的**内容永不可变**
  • 正是因为字符串不可改变,所以字符串是可以**共享使用**
  • 字符串效果上相当于是**char[]**字符数组,但是底层原理是**byte[]**字节数组

字符串的构造方法和直接创建

三种构造方法

  • public String() 创建一个空白的字符串,不含任何内容 ```java public class Demo01 { public static void main(String[] args) {
    1. //使用空参构造
    2. String s = new String();//小括号留空,表示啥字符都没有
    3. System.out.println("第一个字符串:"+s);
    }
  1. - `public String(char[] array)` 根据字符数组的内容,来创建对应的字符串
  2. ```java
  3. public class Demo02 {
  4. public static void main(String[] args) {
  5. //根据自发数组创建字符串
  6. char[] charArray = {'A','B'};
  7. String s = new String(charArray);
  8. System.out.println(s);
  9. }
  10. }
  • public String(byte[] array) 根据字节数组的内容,来创建对应的字符串
    1. public class Demo03 {
    2. public static void main(String[] args) {
    3. //根据字节数组创建字符串
    4. byte[] byteArray = {97,98,99};
    5. String s = new String(byteArray);
    6. System.out.println(s);
    7. }
    8. }

直接创建:
String str = "heihei";

  1. public class Demo04 {
  2. public static void main(String[] args) {
  3. String str = "heihei";
  4. System.out.println(str);
  5. }
  6. }

注意:直接写上双引号,就是字符串对象

字符串常量池

字符串常量池:程序当中直接写上的双引号字符串,就在字符串常量池中

基本数据类型**==**是进行【数值】的比较
引用数据类型:**==**是进行【地址值】的比较

  1. public class Demo05 {
  2. public static void main(String[] args) {
  3. String str1 = "abc";
  4. String str2 = "abc";
  5. char[] charArray = {'a','b','c'};
  6. String str3 = new String(charArray);
  7. System.out.println(str1==str2);//true
  8. System.out.println(str1==str3);//false
  9. System.out.println(str2==str3);//false
  10. }
  11. }

image.png

字符串比较方法

==是进行对象的【地址值】比较,如果确实需要字符串的【内容】比较,可以使用2个方法

public bollean equals(Object obj); 参数可以是任何对象,只有参数是一个字符并且内容相同,才是true,否则false

注意事项:

  • 任何对象都能用Object进行接收
  • equals方法具有对称性,也就是a.equals(b)b.equals(a)效果一样
  • 如果比较双方一个常量一个变量,推荐把常量字符串写在前面 。

    1. 推荐:`"abc".equals(str)`<br /> 不推荐:`str.equals("abc")`<br /> 原因:<br /> String str5 = null;<br /> System._out_.println_(_"abc.equals(str5)"_)_;//false<br /> System._out_.println_(_str5.equals_(_"abc"_))_;//NullPointerException 空指针异常
  • public boolean equalsIgnoreCase_(_String str_)_ 忽略大小写,进行内容比较,只有英文字母区分大小写,其他都不区分

    1. String strA = "Java";
    2. String strB = "java";
    3. System.out.println(strA.equals(strB));//false 严格区分大小写
    4. System.out.println(strA.equalsIgnoreCase(strB))//true
    1. public class test1 {
    2. public static void main(String[] args) {
    3. String a = new String("ab"); // a 为一个引用
    4. String b = new String("ab"); // b为另一个引用,对象的内容一样
    5. String aa = "ab"; // 放在常量池中
    6. String bb = "ab"; // 从常量池中查找
    7. if (aa == bb) // true
    8. System.out.println("aa==bb");
    9. if (a == b) // false,非同一对象
    10. System.out.println("a==b");
    11. if (a.equals(b)) // true
    12. System.out.println("aEQb");
    13. if (42 == 42.0) { // true
    14. System.out.println("true");
    15. }
    16. }
    17. }

字符串获取方法

  • public int length 获取字符串长度

    1. public class Demo07 {
    2. public static void main(String[] args) {
    3. //获取字符串长度
    4. int length = "agsiwnemekke".length();
    5. System.out.println("字符串的长度:"+length);
    6. }
    7. }
  • public String concat(String str) 将当前字符串和参数字符串拼接成为新的字符串

    1. public class Demo07 {
    2. public static void main(String[] args) {
    3. String str1 = "hello";
    4. String str2 = "world";
    5. String str3 = str1.concat(str2);//拼接字符串
    6. System.out.println(str1);//hello
    7. System.out.println(str2);//world
    8. System.out.println(str3);//helloworld
    9. }
    10. }
  • �public char charAt(int index) 获取指定索引位置的单个字符

    1. public class Demo07 {
    2. public static void main(String[] args) {
    3. char c = "hello".charAt(2);
    4. System.out.println("在2号索引位置的字符是:"+c);
    5. }
    6. }
  • public int indexOf(String str) 查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1

    1. public class Demo07 {
    2. public static void main(String[] args) {
    3. String s = "hehhhleowond";
    4. int index = s.indexOf("le");
    5. System.out.println("第一次索引值"+index);//5
    6. System.out.println("helloworld".indexOf("abc"));//-1 因为不存在abc
    7. }
    8. }

字符串截取方法

public String Substring(int index) 截取从参赛位置一直到字符串末尾,繁华新的字符串
public String substring(int begin,int end) 截取从begin到end中间的字符串
备注:
[begin,end)包含左边,不包含右边

  1. public class Demo08SubString {
  2. public static void main(String[] args) {
  3. String str1 = "HelloWorld";
  4. String str2 = str1.substring(6);
  5. System.out.println(str1);//HelloWorld
  6. System.out.println(str2);//orld
  7. String str3 = str1.substring(3,7);
  8. System.out.println(str3);//loWo
  9. }
  10. }
  1. public class Demo09SubString {
  2. public static void main(String[] args) {
  3. String str1 = "Hello";
  4. System.out.println(str1);//Hello
  5. str1 = "Java";
  6. System.out.println(str1);//Java
  7. }
  8. }

上面Demo09SubString这种写法,字符串内容仍然是没有改变的
str1保存的是地址值,相当于str1地址值Hello的0x99,后来地址值变成了Java的0x77�

字符串转换方法

public char[] toCharArray() 将当前字符串拆分成为字符数组作为返回值

  1. public class DemoStringConvert {
  2. public static void main(String[] args) {
  3. char[] chars = "Hello".toCharArray();
  4. System.out.println(chars[0]);//H
  5. System.out.println(chars.length);//5
  6. }
  7. }

public byte[] getBytes() 获取当前字符串底层的字节数组

  1. public class DemoStringConvert {
  2. public static void main(String[] args) {
  3. byte[] bytes = "abc".getBytes();
  4. for (int i = 0; i < bytes.length; i++) {
  5. System.out.println(bytes[i]);
  6. }
  7. }
  8. }

public String replace(CharSequence oldString,CharSequence newString) 所有老字符串替换成新的字符串

  1. public class DemoStringConvert {
  2. public static void main(String[] args) {
  3. String str1 = "How do you do";
  4. String str2 = str1.replace("o","*");
  5. System.out.println(str1);//How do you do
  6. System.out.println(str2);//H*w d* y*u d*
  7. }
  8. }

分割字符串方法

public String split(String regex)按照参数的规则,将字符串切分若干部分

注意事项:
split方法的参数其实是一个正则表达式
如果按照英文句点.进行分割,必须写成\\.

  1. public class Demo05StringSplit {
  2. public static void main(String[] args) {
  3. String str1 = "aaa,bbb,ccc";
  4. String[] array1 = str1.split(",");
  5. for (int i = 0; i < array1.length; i++) {
  6. System.out.println(array1[i]);
  7. }
  8. System.out.println("===============");
  9. String str2 = "aaa bbb ccc";
  10. String[] array2 = str2.split(" ");
  11. for (int i = 0; i < array2.length; i++) {
  12. System.out.println(array2[i]);
  13. }
  14. System.out.println("===============");
  15. String str3 = "XXX.YYY.ZZZ";
  16. String[] array3 = str3.split("\\.");
  17. System.out.println(array3.length); // 0
  18. for (int i = 0; i < array3.length; i++) {
  19. System.out.println(array3[i]);
  20. }
  21. }
  22. }

常用API练习

  1. public class StringApiDemo {
  2. public static void main(String[] args) {
  3. String s1 = "爸爸,的快乐你不懂,爸爸hehe嗒";
  4. String s2 = "卢俊义,40,男,cosplay";
  5. String s3 = "PHP是世上最好的语音java不服";
  6. String s4 = "苍老师经典集合.mp4";
  7. String s5 = " hellojava ";
  8. System.out.println("-------1.获得字符串长度 length():int -------------------");
  9. System.out.println(s1.length());
  10. System.out.println("-------2.根据下标获取字符 charAt(int index):char -------------------");
  11. System.out.println(s1.charAt(3));
  12. System.out.println("-------3.获得子串首次出现的下标,存在返回该下标,不存在返回-1 indexOf(String son [,int fromIndex] ):int -------------------");
  13. System.out.println(s1.indexOf("快乐"));
  14. System.out.println("-------4.反向查找 lastIndexOf(String son [,int fromIndex] ):String -------------------");
  15. System.out.println(s1.lastIndexOf("爸爸",6));
  16. System.out.println("-------5.截取字符串 substring(int star [, int end] ):String -------------------");
  17. System.out.println(s1.substring(3, 8));
  18. System.out.println("-------6.将旧的字符串替换成新的字符串 replace( String old,String new ):String -------------------");
  19. System.out.println(s1.replace("爸爸", "爷爷"));
  20. System.out.println("-------7.拆分 split( String flg ):String[] -------------------");
  21. String[] arr = s2.split(",");
  22. System.out.println(arr[0]);
  23. System.out.println(arr[1]);
  24. System.out.println(arr[2]);
  25. System.out.println(arr[3]);
  26. System.out.println("-------8.大小写转换 toUpperCase():String toLowerCase():String -------------------");
  27. System.out.println(s3.toLowerCase());
  28. System.out.println(s3.toUpperCase());
  29. System.out.println("-------9.起始和结尾 startWidth(String prefix ):boolean endsWith(String sufix ):boolean -------------------");
  30. System.out.println(s4.startsWith("王老师"));
  31. System.out.println(s4.endsWith("mp4"));
  32. System.out.println("-------10.字符串转数组 toCharArray():char[]-------------------");
  33. char[] chars = s4.toCharArray();
  34. System.out.println(Arrays.toString(chars));
  35. System.out.println("-------11.去空格 trim():String 前后空格 -------------------");
  36. System.out.println(s5.trim());
  37. System.out.println("-------12.字符串连接 concat(String other):String ---------------");
  38. String s6 = "hello";
  39. String s7 = "hello";
  40. System.out.println(s6.concat(s7));
  41. System.out.println("--------13.包含 contains(String str):boolean ");
  42. System.out.println( s3.contains("java2") );
  43. System.out.println("---------14 比较值相等 equals(String other):boolean -------");
  44. String s8="2TsQ";
  45. String s9="2tsq";
  46. System.out.println(s8.equals(s9));
  47. System.out.println(s8.equalsIgnoreCase(s9));
  48. System.out.println("---------15 比较字符大小 compareTo(String other):int ----- ");
  49. String s10 = "z";
  50. String s11 = "a";
  51. int n = s10.compareTo(s11);
  52. System.out.println(n);
  53. System.out.println("----------16 静态方法 String.valueOf(Object obj):String -----------");
  54. int age = 10;
  55. String xx = String.valueOf(age);
  56. System.out.println(xx+10);
  57. }
  58. }

习题

题目:定义一个方法,把数组{1,2,3}按照指定格式拼接成一个字符串。格式参照如下:[word1#word2#word3]。

分析:
1. 首先准备一个int[]数组,内容是:1、2、3
2. 定义一个方法,用来将数组变成字符串
三要素
返回值类型:String
方法名称:fromArrayToString
参数列表:int[]
3. 格式:[word1#word2#word3]
用到:for循环、字符串拼接、每个数组元素之前都有一个word字样、分隔使用的是#、区分一下是不是最后一个
4. 调用方法,得到返回值,并打印结果字符串

  1. public class Demo06StringPractise {
  2. public static void main(String[] args) {
  3. int[] array = {1, 2, 3, 4};
  4. String result = fromArrayToString(array);
  5. System.out.println(result);
  6. }
  7. public static String fromArrayToString(int[] array) {
  8. String str = "[";
  9. for (int i = 0; i < array.length; i++) {
  10. if (i == array.length - 1) {
  11. str += "word" + array[i] + "]";
  12. } else {
  13. str += "word" + array[i] + "#";
  14. }
  15. }
  16. return str;
  17. }
  18. }

题目:键盘输入一个字符串,并且统计其中各种字符出现的次数。
种类有:大写字母、小写字母、数字、其他

思路:1. 既然用到键盘输入,肯定是Scanner
2. 键盘输入的是字符串,那么:String str = sc.next();
3. 定义四个变量,分别代表四种字符各自的出现次数。
4. 需要对字符串一个字、一个字检查,String—>char[],方法就是toCharArray()
5. 遍历char[]字符数组,对当前字符的种类进行判断,并且用四个变量进行++动作。
6. 打印输出四个变量,分别代表四种字符出现次数。

可变字符串

StringBuilder 可变字符串

为了解决 StringBuffer 效率问题,java 1.5 再推出这个StringBuilder,StringBuilder这个类是线程不安全的。

  1. public class StringBuilderDemo {
  2. public static void main(String[] args) {
  3. StringBuilder ss = new StringBuilder("静夜诗");
  4. ss.append("床前明月光,疑是地上霜,");
  5. ss.append("举头望明月,低头思故乡。");
  6. ss.insert(3,"李白");
  7. ss.insert(5,"\n");
  8. System.out.println(ss);
  9. }
  10. }

核心方法是 追加新内容的方法 append(Object xx )

StringBuffer 可变字符串

这类是JDK1.0推出的可变字符串,这个类被设计为线程安全的,这个类的效率低。

  1. public class StringBufferDemo {
  2. public static void main(String[] args) {
  3. StringBuffer ss = new StringBuffer("静夜诗");
  4. ss.append("床前明月光,疑是地上霜,");
  5. ss.append("举头望明月,低头思故乡。");
  6. ss.insert(3,"李白");
  7. ss.insert(5,"\n");
  8. System.out.println(ss);
  9. }
  10. }

String StringBuilder StringBuffer 区别

  1. 可变性 String 是不可变 ,其他两个是可变的
  2. 安全性 StringBuffer 线程安全的。StringBulder不安全。 String视为安全的,他的方法都是建立副本,不再原有的基础上做修改。

包装类

java中有**基本数据类型****引用类型**,如果要把基本数据类型变成引用类型,那么需要**一次包装**,java中就给出了基本数据类型对应的包装。

基本数据类型包装类

byte short int long float double char boolean
Byte Short Integer Long Float Double Character Boolean
Number

Number 核心方法

Number 类是6个数值包装类的父类,它提供了6个拆箱方法

byte [**byteValue**](../../java/lang/Number.html#byteValue())()
byte
形式返回指定的数值。
abstract double [**doubleValue**](../../java/lang/Number.html#doubleValue())()
double
形式返回指定的数值。
abstract float [**floatValue**](../../java/lang/Number.html#floatValue())()
float
形式返回指定的数值。
abstract int [**intValue**](../../java/lang/Number.html#intValue())()
int
形式返回指定的数值。
abstract long [**longValue**](../../java/lang/Number.html#longValue())()
long
形式返回指定的数值。
short [**shortValue**](../../java/lang/Number.html#shortValue())()
short
形式返回指定的数值。

装箱拆箱

**装箱**: 把一个基本数类型 变成引用数据类型
**拆箱**: 把一个引用数据类型变成 基本数据类型

  1. public class WarpperDemo {
  2. public static void main(String[] args) {
  3. // JDK.1.5以前 手动完成 装箱 和 拆箱
  4. // 装箱: 把一个基本数类型变成 引用 数据类型
  5. int num = 100; // 基本数据类型
  6. Integer numPlus = new Integer( num ); // 引用数据类型
  7. // 拆箱: 把引用数据类型变成 基本 数据类型
  8. Integer nPlus = new Integer(100); //引用类型
  9. int n = nPlus.intValue(); // 基本数据类型
  10. }
  11. }

自动装箱与拆箱[jdk5+]

  1. public class WarpperDemo {
  2. public static void main(String[] args) {
  3. //JDK 1.5+ 自动 装箱拆箱 , 使转换更容易。
  4. int x = 10;
  5. Integer xPlus = x; //自动装箱
  6. Integer yPlus = 100;
  7. int y = yPlus; //自动拆箱
  8. }
  9. }

包装类提供的方法

使用包装类,提供的静态方法完成一些简单功能。

  1. public class WarpperApi {
  2. public static void main(String[] args) {
  3. // 1. 查看类型的 取值区间
  4. System.out.println( Integer.MIN_VALUE+ "-"+ Integer.MAX_VALUE );
  5. // 2. 转进制
  6. System.out.println(Integer.toBinaryString(10));
  7. System.out.println(Integer.toHexString(10));
  8. // 3. 比较大小
  9. System.out.println(Integer.max(10, 50));
  10. System.out.println(Integer.min(10, 50));
  11. System.out.println(Integer.compare(10, 3));
  12. }
  13. }

数值类型与字符串转换[掌握]

开发中很多时候,需要把**字符串类型 转成 数值类型**,比如需要把 String “99.8” 变成 double 99.8 。
字符串转数值类型,需要找到对应的包装类型,比如要转**int 找Integer** 转d**ouble就找Double**。 包装类提供 parseByte() parseShort() parseInt() parseLong() parseFloat() parseDouble 。

  1. public class WarpperApi {
  2. public static void main(String[] args) {
  3. System.out.println("------------------ 数值 ==> String ----------------------");
  4. int a = 10;
  5. String b = a + "";
  6. System.out.println(b);//10
  7. System.out.println("------------------ String ==> 数值 ----------------------");
  8. int i = Integer.parseInt(b);
  9. System.out.println(i);//10
  10. }
  11. }

BigDecimal

由于java中浮点数计算不精确,可以使用BigDecimal解决问题,需要注意的是必须以字符串方式构造BigDecimal。
BigDecimal 提供了API来计算:

  1. add( BigDecimal other ):BigDecimal
  2. subtract( BigDecimal other ):BigDecimal
  3. multiply( BigDecimal other ):BigDecimal
  4. divide( BigDecimal other ,int scale , int rondModel ):BigDecimal

重点说明:
对于除法,因为存在无限循环小数,所以可能会引发异常,通过 参数 scale 控制小数点位数, rondModel控制取舍策略。
常用取舍策略:
ROUND_UP = 0
ROUND_DOWN =1
ROUND_CEILING =2
ROUND_FLOOR = 3
ROUND_HALF_UP = 4 四舍五入

  1. public class BigDecimalDemo {
  2. public static void main(String[] args) {
  3. double a = 1.0;
  4. double b = 0.9;
  5. System.out.println(a-b);//0.99999999998 不精确
  6. //包装
  7. BigDecimal n1 = new BigDecimal( String.valueOf(a) );
  8. BigDecimal n2 = new BigDecimal( String.valueOf(b) );
  9. System.out.println("-------加法------");
  10. BigDecimal result1 = n1.add(n2);
  11. System.out.println(result1.doubleValue());
  12. System.out.println("-------减法------");
  13. BigDecimal result2 = n1.subtract(n2);
  14. System.out.println(result2.doubleValue());
  15. System.out.println("-------乘法--------");
  16. BigDecimal result3 = n1.multiply(n2);
  17. System.out.println(result3.doubleValue());
  18. System.out.println("-------除法--------");
  19. BigDecimal result4 = n1.divide(n2,2,BigDecimal.ROUND_HALF_UP);
  20. System.out.println(result4.doubleValue());
  21. }
  22. }

BigInteger

当运算数据非常大的情况下,基本数据类型无法完成运算,比如两个long的最大值相加,没有办法直接运算,这时可以借助 BigInter包装类使用API运算,API与BigDecimal完全一致

  1. // 大数运算
  2. public class BigInteDemo {
  3. public static void main(String[] args) {
  4. long x1 = 9223372036854775807L;
  5. long x2 = 9223372036854775807L;
  6. BigInteger n1 = new BigInteger( String.valueOf(x1) );
  7. BigInteger n2 = new BigInteger( String.valueOf(x2) );
  8. BigInteger result = n1.add(n2);
  9. System.out.println(ru); //18446744073709551614
  10. }
  11. }

大数运算 不可拆箱,因为可能超过 类型的范围。但是可以转字符串,保存这个字符串,日后可以继续运算。

日期相关类

Date类

Date类是用来描述时间的。一个时刻,一个瞬间都是 **Date**的实例。在java.util包中。

创建对象

  1. **系统时间对象**
  2. **毫秒数指定时间对象**
  3. ~~ 年月日直接对象(过期)~~

    1. public class TestDate {
    2. public static void main(String[] args) {
    3. //获得当前系统时间对应Date 对象
    4. Date date = new Date();
    5. System.out.println(date.toLocaleString);//2021-8-1 10:42:50 当前时间
    6. //构造一个指定时间的对象
    7. Date date2 = new Date(3000L);
    8. System.out.println(date2.toLocaleString);//1970-1-1 8:00:03
    9. //过期了
    10. Date date3 = new Date(2021-1900,11,10);
    11. System.out.println(date3.toLocaleString);
    12. }
    13. }

    常用方法

  4. getTime():long 获得时间毫秒值

  5. after(Date when ): 判断是否在指定日期前
  6. before( Date when ):判断是否在指定日期后
  7. getXXX():int 获得年、月、日 过期了,不推荐使用

    1. public class TestDateApi {
    2. public static void main(String[] args) {
    3. Date date = new Date();
    4. //1. 获得时间的毫秒数
    5. long time = date.getTime();
    6. System.out.println(time);
    7. //2. 日期比较 after before
    8. Date date2= new Date(1618191582373L);
    9. boolean after = date.before(date2);
    10. System.out.println(after);
    11. //3. 过期的方法
    12. System.out.println(date.getYear()+1900);
    13. System.out.println(date.getMonth()+1);
    14. System.out.println(date.getDate());
    15. }
    16. }

SimpleDateFormat 类[掌握]

是一个简单的日期格式化工具类,可以把**日期对象通过 日期的格式符号 转换成一个字符串**

创建对象

  1. //SimpleDateFormat sdf = new SimpleDateFormat("包含格式符号的模板字符串");
  2. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

格式符号: y: 年 M: 月 d: 日 h: 时 m: 分 s: 秒

核心方法 format(Date date)

根据指定格式转换成日期对象

  1. public class TestSimpleDateFormat {
  2. public static void main(String[] args) {
  3. Date date = new Date();
  4. //格式化输出
  5. /**
  6. * 格式模板 yyyy-MM-dd hh:mm:ss
  7. * y:年 M:月 d:日 h:时 m:分 s:秒
  8. */
  9. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  10. String strDate = sdf.format(date);
  11. System.out.println(strDate);
  12. }
  13. }

开发中,可以通过 常量接口 定义各种格式化模板 public interface Paten { //常规格式
_public static final String _DATE
= “yyyy-MM-dd”; public static final String DATE_TIME = “yyyy-MM-dd hh:mm:ss”; public static final String TIME = “hh:mm:ss”; //中文格式
_public static final String _DATE_CHINA
= “yyyy年MM月dd日”; public static final String DATE_TIME_CHINA = “yyyy年MM月dd日 hh:mm:ss”; //自定义格式
_public static final String _DATE_STYLE
= “dd/MM/yyyy”; }

核心方法 parse( String str )

根据指定格式解析字符串,把**一个字符串** **转换成 日期对象**,往往用户输入的都是字符串,即便是一个时间也是以一个字符串输入的比如 2008-10-10,而程序中需要的是一个对象。

  1. public class Test02 {
  2. public static void main(String[] args) throws ParseException {
  3. Date d = new Date();
  4. System.out.println(d.toLocaleString());
  5. //创建日期格式化对象
  6. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
  7. String format = sdf.format(d);
  8. System.out.println(format);//2021年08月01日 11:18:56
  9. String str = "2021年08月01日 11:18:56";
  10. Date parse = sdf.parse(str);
  11. System.out.println(parse);//Sun Aug 01 11:18:56 CST 2021
  12. }

Calander 类

日历类,Date 绝大部分api过期了,很多功能就需要借助 Calander 完成。日历除了当前时间以外,还存储了与此相关的其他信息(日历字段)和处理日期一些方法。位于java.util包

创建

  1. public class TestCalendar {
  2. public static void main(String[] args) {
  3. //获得实例
  4. Calendar calendar = Calendar.getInstance();
  5. }
  6. }

核心方法

  1. get( int field):int; 获取指定日历字段信息
  2. set( int field , int value ); 将指定日历字段设置为指定的值
  3. add( int field , int amount)
  4. getActualMaximum(int field)
  5. getActualMinimum(int field) ```java package case1.calander;

import java.util.Calendar;

public class TestCalendar {

  1. public static void main(String[] args) {
  2. //获得实例
  3. Calendar calendar = Calendar.getInstance();
  4. // get(int x):int 获得日历字段
  5. int year = calendar.get(Calendar.YEAR);
  6. int month = calendar.get(Calendar.MONTH);
  7. int day = calendar.get(Calendar.DATE);
  8. int h = calendar.get(Calendar.HOUR);
  9. int m = calendar.get(Calendar.MINUTE);
  10. int s = calendar.get(Calendar.SECOND);
  11. System.out.println( year );
  12. System.out.println( month+1);
  13. System.out.println( day );
  14. System.out.println("------------------------------");
  15. System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
  16. System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
  17. // set( int field , int value ): 修改日历字段值
  18. // calendar.set( Calendar.YEAR , 2099);
  19. // add( int filed, int amont ): 增加日历字段值
  20. calendar.add(Calendar.MONTH,1);
  21. // 获得当月最大实际日历信息
  22. // int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
  23. // int minDay = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
  24. //System.out.println(maxDay+" "+minDay);
  25. }

}

  1. <a name="hquO2"></a>
  2. #### 日历案例
  3. ```java
  4. package case1.calander;
  5. import java.util.Calendar;
  6. import java.util.Map;
  7. //日历
  8. public class DisplayCalendar {
  9. public static void main(String[] args) {
  10. //获得日历
  11. Calendar calendar = Calendar.getInstance();
  12. calendar.set(2021,5,1);
  13. //输出日历头部
  14. String[] days = {"一","二","三","四","五","六","日"};
  15. for ( String day : days){
  16. System.out.print(day+"\t");
  17. }
  18. System.out.println();
  19. //输出日历身体
  20. int min = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
  21. int max = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
  22. int xq = calendar.get(Calendar.DAY_OF_WEEK);
  23. //输出首行空格
  24. for(int i=1; i<=xq-2;i++){
  25. System.out.print("\t");
  26. }
  27. // 输出全部号数
  28. for(int i=min; i<=max; i++){
  29. System.out.print(i+"\t");
  30. calendar.set(Calendar.DAY_OF_MONTH,i); //把日历指向这一天
  31. int x= calendar.get(Calendar.DAY_OF_WEEK) ; //如果这一天是星期天 则换行
  32. if (x==1){
  33. System.out.println();
  34. }
  35. }
  36. }
  37. }

其他的类

Arrays

它是一个数组的工具类,提供很多数组操作的方法。
核心方法:

  1. package case1.arrays;
  2. import java.util.Arrays;
  3. // 数组工具类
  4. public class TestArrays {
  5. public static void main(String[] args) {
  6. int[] arr = {45,29,16,5,20,23,22,9,4};
  7. // 1. toString(T[] arr) // 数组转字符串
  8. System.out.println( Arrays.toString(arr) );
  9. // 2. sort(T[] ) // 排序
  10. Arrays.sort(arr);
  11. System.out.println( Arrays.toString(arr));
  12. // 3. binarySearch(T[] T key) // 二分查找
  13. System.out.println(Arrays.binarySearch(arr, 20));
  14. // 4. copyOf(int[] arr , int len) // 数组拷贝
  15. int[] newArr = Arrays.copyOf(arr, 5);
  16. System.out.println(Arrays.toString(newArr));
  17. // 5. copyOfRange(T[] arr, int from, int to) // 数组区间拷贝
  18. int[] newArr2 = Arrays.copyOfRange(arr, 3, 7);
  19. System.out.println(Arrays.toString(newArr2));
  20. // 6. equals(T[] a1, T[] a2) // 两数组相等比较
  21. int[] xrr = {1,2,3};
  22. int[] yrr = {1,2,3,4};
  23. System.out.println(Arrays.equals(xrr, yrr));
  24. // 7 .fill(T[] arr , int value) // 数组元素填充
  25. int[] zrr = new int[10];
  26. Arrays.fill( zrr,2,5, -1 );
  27. System.out.println(Arrays.toString(zrr));
  28. }
  29. }

Random

这类是一个生成伪随机数类,底层原理使用 使用线性同余公式 ,生成的数字,如果种子相同,进行相同次数的调用得到的值是相同的。
nextInt( int n): int 生成一个0-N之间的整数
nextDouble() :double 生成一个浮点数
nextBoolean(): boolean 生成一个Boolean值

  1. public class TestRandom {
  2. public static void main(String[] args) {
  3. Random rd = new Random(100);// 100为随机数种子
  4. for (int i= 0; i<4; i++){
  5. int num = rd.nextInt(100);
  6. System.out.println(num);
  7. }
  8. }
  9. }

UUID

这个类用于生成 唯一字符串序列

  1. public class TestUUID {
  2. public static void main(String[] args) {
  3. //获得一个随机的UUID
  4. UUID uuid = UUID.randomUUID();
  5. //获得UUID字符串
  6. String uuidStr = uuid.toString();
  7. //替换 -
  8. uuidStr = uuidStr.replace("-","");
  9. System.out.println(uuidStr);
  10. }
  11. }

Math

它是一个数学工具类,提供了数学计算上的一些方法。全部是静态方法。

  1. public class TestMath {
  2. public static void main(String[] args) {
  3. System.out.println(Math.PI); // 获得 PI
  4. System.out.println(Math.abs(-100)); // 计算绝对值
  5. System.out.println(Math.pow(2, 11));// 计算次方
  6. System.out.println( (int)(Math.random()*10) ); // 随机数0.0-1.0间
  7. System.out.println(Math.round(3.7)); // 四舍五入
  8. System.out.println(Math.floor(3.9)); // 向下取整
  9. System.out.println(Math.ceil(3.1)); // 向上取整
  10. System.out.println(Math.sqrt(81)); // 开平方根
  11. }
  12. }

Runtime

它的对象表示运行环境的对象,通过这个对象可以获得,运行平台的相关信息。

  1. public class TestRuntime {
  2. public static void main(String[] args) throws IOException {
  3. //获得实例
  4. Runtime runtime = Runtime.getRuntime();
  5. //获得运行环境信息
  6. int n = runtime.availableProcessors(); // 获得处理器个数的
  7. System.out.println(n);
  8. //runtime.exec("C:/Program Files (x86)/Tencent/QQLive/QQLive.exe"); //打开一些软件
  9. //runtime.exit(0); //立即退出
  10. long freeMemory = runtime.freeMemory();
  11. System.out.println(freeMemory/1024/1024); // 返回 Java 虚拟机中的空闲内存量。
  12. long maxMemory = runtime.maxMemory(); // 返回 Java 虚拟机试图使用的最大内存量。
  13. System.out.println(maxMemory/1024/1024);
  14. long totalMemory = runtime.totalMemory(); // 返回 Java 虚拟机中的内存总量。
  15. System.out.println(totalMemory/1024/1024);
  16. System.out.println("over");
  17. }
  18. }

System

System 类包含一些有用的类字段和方法。它不能被实例化。
System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。

  1. public class TestSystem {
  2. public static void main(String[] args) {
  3. // 输入流
  4. Scanner sc = new Scanner( System.in );
  5. //输出流
  6. System.out.println( "hello");
  7. //错误,打印错误信息
  8. System.err.println("world");
  9. // 读取环境变量
  10. Map<String, String> info = System.getenv();
  11. System.out.println(info.get("KEY"));
  12. }
  13. }