API

概念

API(Application Programming Interface,应用程序接口)是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节.
API是一种通用功能集,有时公司会将API作为其公共开放系统,也就是公司制定自己的系统接口标准,当需要进行系统整合,自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码.

  1. Java.util包是java中的工具包,包含各种实用工具类/集合类/日期时间工具等各种常用工具包
    import java.util.Scanner;
    import java.util.Arrays;
  2. java.lang包是java的核心,包含了java基础类
    包括基本Object类/Class类/String类/基本数学类等最基本的类,这个包无需导入,默认会自动导入
    import java.lang.Object;
    import java.lang.String;
    import java.lang.StringBuilder/StringBuffer;
    正则表达式
    包装类等等

Object

概念

Object类是所有Java类的祖先,也就是说我们所说的”顶级父类”
它存在于java.lang.Object,这个包不需要我们手动导包
需要注意的是:每个类都使用Object作为超类.所有对象(包括数组)都实现这个类的方法.
在不明确给出超类的情况下,Java会自动把Object类作为要定义类的超类.

常用方法

toString()

用于返回对应对象的字符串表示

重写前为地址值

重写后为对象属性与属性值

hashCode()

用于返回对应对象的哈希码值

返回该对象的哈希码值,用来区分不同的对象,不同对象生成的哈希码值不同,但是有时候也存在不同对象哈希码值相同的特殊情况,称之为”哈希碰撞”现象。

equals()

用于指示其他某个对象是否与当前对象“相等”

重写前比较两个对象地址值是否相等,底层使用==判断

重写后比较的四两个对象的:类型、属性、属性值

示例代码

  1. package cn.tedu.api;
  2. import java.util.Objects;
  3. /**
  4. * 用于测试顶级父类Object
  5. */
  6. public class TestObject {
  7. public static void main(String[] args) {
  8. Student student = new Student();
  9. Student student1 = new Student("桂宏宇",28);
  10. Student student2 = new Student("桂宏宇",28);
  11. /*
  12. 重写前输出地址值
  13. 重写后输出对象属性与属性值
  14. */
  15. System.out.println(student);
  16. System.out.println(student1);
  17. /*
  18. 使用equals测试重写前两个对象地址值是否相等,底层使用==判断
  19. 重写后比较是的两个对象的类型+属性+属性值
  20. */
  21. System.out.println(student1 == student2);//false
  22. System.out.println(student1.equals(student2));//true
  23. System.out.println(student1 == student2);//false
  24. /*
  25. 测试hashcode方法
  26. 返回该对象的哈希码值,用来区分不同的对象,不同对象生成的哈希码值不同
  27. */
  28. System.out.println(student.hashCode());
  29. System.out.println(student1.hashCode());
  30. }
  31. }
  32. class Student {
  33. String name;
  34. int age;
  35. public Student(String name, int age) {
  36. this.name = name;
  37. this.age = age;
  38. }
  39. public Student() {
  40. }
  41. @Override
  42. public String toString() {
  43. return "Student{" +
  44. "name='" + name + '\'' +
  45. ", age=" + age +
  46. '}';
  47. }
  48. @Override
  49. public boolean equals(Object o) {
  50. if (this == o) return true;
  51. if (o == null || getClass() != o.getClass()) return false;
  52. Student student = (Student) o;
  53. return age == student.age && Objects.equals(name, student.name);
  54. }
  55. @Override
  56. public int hashCode() {
  57. return Objects.hash(name, age);
  58. }
  59. }

String

概念

String是一个封装char[]数组的对象,字符串不可变
通过下图中的底层实现可以看出:被final修饰,是常量
String str = “abc”; 等效于:char data[] = {‘a’, ‘b’, ‘c’};
image-20210714143916674.png

创建String对象的方式

方式一:
String(char[] value) 分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
方式二: String str = “abc”;

  1. 如果是第一次使用字符串,java会在字符串堆中常量池创建一个对象。
  2. 再次使用相同的内容时,会直接访问堆中常量池中存在的对象。

image-20210714144107015.png

示例代码

  1. package cn.tedu.api;
  2. public class TestString {
  3. public static void main(String[] args) {
  4. /*
  5. 字符串底层维护的是char[]数组,存放在堆中
  6. */
  7. char[] value = {'a','b','c'};
  8. String s1 = new String(value);//触发含参构造来创建String对象
  9. String s11 = new String(value);//触发含参构造来创建String对象
  10. /*
  11. 底层也会new String(),存放在堆中的常量池中,效率高
  12. */
  13. String s2 = "abc";
  14. String s22 = "abc";
  15. String s3 = "aaa";
  16. /*
  17. "=="比较的时两个对象的地址值
  18. equals()默认实现比较也是地址值,但String类重写了此方法,
  19. 不再比较地址值,而是比较内容,无论任何创建方式,只要串内容一致,equals()就会返回true
  20. */
  21. System.out.println(s1 == s2);//false
  22. System.out.println(s1 == s11);//false
  23. System.out.println(s2 == s22);//true
  24. System.out.println(s2 == s3);//false
  25. System.out.println(s1.equals(s2));//true
  26. System.out.println(s1.equals(s11));//true
  27. System.out.println(s2.equals(s3));//false
  28. }
  29. }

常见方法

  1. int hashCode() 返回此字符串的哈希码。
  2. boolean equals(Object anObject) 将此字符串与指定的对象比较,比较的是重写后的串的具体内容
  3. String toString() 返回此对象本身(它已经是一个字符串!)
  4. length()-查看字符串的长度
  5. charAt()—获取指定下标处位置上的字符
  6. indexOf()返回指定字符在此字符串中第一次出现的索引
  7. lastIndexOf()-某个字符最后一次出现的位置
  8. concat()将指定字符串连接\拼接达到此字符串的结尾,不会改变原串
  9. substring(int beginIndex, int endIndex)-截取子串,返回一个新子串,从执定下标开始,到结束下标为止,但不包含结束下标[1,5)
  10. substring(int beginIndex) 返回一个新子串,从指定下标处开始,包含指定下标
  11. equals()-判断两个串是否相等,注意String重写了Object的此方法,所以内容相同就返回true
  12. startsWith()-判断是不是以指定元素开头
  13. endsWith()–判断是不是以指定元素数结尾
  14. split()—以指定字符分割
  15. trim()-去掉首尾两端的空格
  16. getBytes()-把串转换成数组
  17. toUpperCase()-变成全大写
  18. toLowerCase()-变成全小写
  19. String.valueOf(10)-把int类型的10转换成String类型

示例代码

  1. package cn.tedu.api;
  2. import java.util.Arrays;
  3. import java.util.Locale;
  4. /**
  5. * 测试String常用方法
  6. */
  7. public class TestString2 {
  8. public static void main(String[] args) {
  9. String s = "abc";
  10. char[] value = {'a','b','c','d'};
  11. String ss = new String(value);
  12. /*
  13. 测试常用方法
  14. */
  15. System.out.println(s.charAt(0));//a,获取指定下标处的字符
  16. String s2 = s.concat("桂宏宇");//用于拼接字符串,但不会改变原字符串
  17. System.out.println(s);//abc,不会改变原串
  18. System.out.println(s2);//abc桂宏宇,打印的是拼接后s2指向的串abc桂宏宇
  19. System.out.println(s.concat("桂宏宇"));//abc桂宏宇
  20. System.out.println(s.endsWith("宇"));//false,判断是否以指定元素结尾
  21. System.out.println(s.startsWith("a"));//true,判断是否以指定元素开头
  22. System.out.println(s.length());//3,获取字符串长度与数组的length不同,数组的length为属性
  23. System.out.println(s == ss);//false,比较地址值
  24. System.out.println(s.equals(ss));//true,比较内容
  25. System.out.println(s.indexOf("b"));//1,获取指定元素首次出现的下标值
  26. ss = "abcbb";
  27. System.out.println(ss.lastIndexOf("b"));//获取指定元素最后一次出现的下标值
  28. //根据指定规则分割字符串,返回值类型为数组String[],需要使用数组工具类打印
  29. String s3 = "a b c d e";
  30. System.out.println(s3.split(" "));//[Ljava.lang.String;@1b6d3586
  31. System.out.println(Arrays.toString(s3.split(" ")));
  32. /*
  33. 根据下标截取子串,如果只有一个下标,从指定位置处开始截取,包含指定下标位置的元素
  34. 若有两给下表,截取这两个下标之间的字串,含头不含尾
  35. */
  36. System.out.println(s3.substring(3));// c d e
  37. System.out.println(s3.substring(1,5));// b c
  38. System.out.println(s3.toUpperCase());//A B C D E,把指定字符串转换为全大写
  39. System.out.println(s3.toLowerCase());//a b c d e,把指定字符串转换为全小写
  40. s3 = " abcde ";
  41. System.out.println(s3.trim());//abcde,去除指定字符串的首尾空格
  42. System.out.println(String.valueOf(10));//10,转换为字符串10
  43. System.out.println("20" + 10);//2010,字符串拼接
  44. System.out.println(String.valueOf(20) + 21);//2021
  45. }
  46. }

StringBuilder/StringBuffer

特点

封装了char[]数组
是可变的字符序列
提供了一组可以对字符内容修改的方法
常用append()来代替字符串做字符串连接”+”
内部字符数组默认初始容量是16:super(str.length() + 16);
如果大于16会尝试将扩容,新数组大小原来的变成2倍+2,容量如果还不够,直接扩充到需要的容量大小。int newCapacity = value.length * 2 + 2;
StringBuffer 1.0出道线程安全,StringBuilder1.5出道线程不安全

方法

append()

示例代码

  1. package cn.tedu.api;
  2. /**
  3. * 联系字符串拼接
  4. */
  5. public class TestString3 {
  6. public static void main(String[] args) {
  7. //需求,拼接打印26个小写字母1w次
  8. String str = "abcdefghijklmnopqrstuvwxyz";
  9. //method(str);//普通字符串拼接
  10. method2(str);//高效字符串拼接
  11. }
  12. private static void method2(String str) {
  13. StringBuilder sb = new StringBuilder();
  14. StringBuffer sb2 = new StringBuffer();
  15. System.out.println(sb);
  16. long t1 = System.currentTimeMillis();
  17. for (int i = 0;i < 10000;i++){
  18. //sb.append(str);
  19. sb2.append(str);
  20. }
  21. long t2 = System.currentTimeMillis();
  22. System.out.println("拼接结果为" + sb2);
  23. System.out.println(t1);
  24. System.out.println(t2);
  25. System.out.println("花费时间为" + (t2-t1));
  26. }
  27. private static void method(String str) {
  28. String str2 = "";
  29. long t1 = System.currentTimeMillis();
  30. for (int i = 0;i < 10000;i++){
  31. str2 += str;
  32. }
  33. long t2 = System.currentTimeMillis();
  34. System.out.println("拼接结果为" + str2);
  35. System.out.println(t1);
  36. System.out.println(t2);
  37. System.out.println("花费时间为" + (t2-t1));
  38. }
  39. }