API :Application Programming Interface
应用编程接口,一切可以调用的东西都是API。

java.lang包,这个包会自动导入。
java.lang.Object
java.lang.String
java.lang.StringBuilder/StringBuffer
正则表达式
包装类等

1 Object

1.1 概念

所有对象的顶级父类
存在于java.lang包中,这个包不需要我们手动导包

public class Object
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

1.2 常用方法

1.2.1 toString()

默认返回 类名@地址 的格式,来展示对象的地址值,如:a00000.Student@a0834e7。

如果想看属性值我们可以重写这个方法,重写后返回的就是把属性值拼接成一个字符串。

如:Student [name=苏大强, age=20, id=10001]

1.2.2 equals(Object obj)

当前对象和参数对象比较大小,默认是比较内存地址,如果要比较对象的属性,可以重写该方法。

1.2.3 hashCode()

返回该对象的哈希码值。

1.3 测试

创建day09工程
创建cn.tedu.api包
创建Test1_Object.java

package cn.tedu.api;
//这个类用来测试Object的方法
//总结:
//1、toString():默认输出对象的地址值,如果想看对象的属性值,需要重写
//2、hashCode():获取对象在内存中的哈希码值(对象在内存中的编码)
//3、equals():默认使用==比较,判断两个对象是否相等
public class Test1_Object {
    public static void main(String[] args) {
       //TODO 创建Person对象测试
       Person p = new Person("jack",20,"北京");
//cn.tedu.api.Person@15db9742 -- 默认调用了Object类的toString(),拼接成了字符串
       System.out.println(p);
//想要输出对象的每个属性的值拼接成了字符串,重写父类Object的toString()
//Person [name=jack, age=20, addr=北京]
       System.out.println(p);
       //hashCode():获取对象在内存中的哈希码值
       System.out.println(p.hashCode());//366712642
       Person p2 = new Person("rose",18,"河北");
       //equals():判断两个对象是否相等,默认使用==比较
       //==:如果比对象,比的是两个对象的地址值
       System.out.println(p.equals(p2));//false
	}
}
//创建Person类
class Person extends Object{
    private String name;
    private int age;
    private String addr;
    //构造:source - 倒数第三个 - ok
    public Person() {}
    public Person(String name, int age, String addr) {
       this.name = name;
       this.age = age;
       this.addr = addr;
    }
     //get()/set()
    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;
    }
    public String getAddr() {
       return addr;
    }
    public void setAddr(String addr) {
       this.addr = addr;
    }
    //重写Object提供的toString():source-倒数第四个-OK
    @Override
    public String toString() {
       return "Person [name=" + name + ", age=" + age + ", addr=" + addr + "]";
    }
}

2 String

2.1 特点

2.1.1 是一个封装char[]数组的对象

2.1.2 字符串不可变

2.2 创建String对象

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

String()
          //初始化一个新创建的 String 对象,使其表示一个空字符序列。
String(char[] value)
          //分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。

方式2:

String name = ”abc”;

2.3 常见方法

char charAt(int index)
          返回指定索引处的 char 值。
          
boolean endsWith(String suffix)
          测试此字符串是否以指定的后缀结束。
          
boolean equals(Object anObject)
          将此字符串与指定的对象比较
          
byte[] getBytes()
          使用平台的默认字符集将此 String 编码为 byte 序列,并将结果
          存储到一个新的 byte 数组中。
          
byte[] getBytes(Charset charset)
          使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
          
 int indexOf(String str)
          返回指定子字符串在此字符串中第一次出现处的索引。
          
 int lastIndexOf(int ch)
          返回指定字符在此字符串中最后一次出现处的索引
          
 int length()
          返回此字符串的长度。
          
 String[] split(String regex)
          根据给定正则表达式的匹配拆分此字符串。
          
 String substring(int beginIndex)
          返回一个新的字符串,它是此字符串的一个子字符串。
          
 String substring(int beginIndex, int endIndex)
          返回一个新字符串,它是此字符串的一个子字符串。

static String valueOf(int i)
          返回 int 参数的字符串表示形式。

2.4 测试

package cn.tedu.api;
import java.util.Arrays;
//这个类用来测试字符串
public class Test2_String {
    public static void main(String[] args) {
       //1、创建字符串对象
       char[] c = {'h','e','L','e','o'};
       String str = new String(c) ;//在堆内存中开辟空间
// String str2 = "hello" ; //在堆内存中的常量池中
       //2、常见方法测试
       System.out.println(str.charAt(2));//L,获取指定下标对应的字符
       System.out.println(str.endsWith("o"));//true,判断字符串是否以指定字符串结尾
       System.out.println(str.indexOf("l"));//3,第一次出现指定字符串的下标
       System.out.println(str.lastIndexOf("e"));//3,最后一次出现指定字符串的下标
       System.out.println(str.length());//5,字符串长度
       System.out.println(str.substring(2));//Leo,从下标为2的位置开始截取
       System.out.println(str.substring(2, 4));//Le,从2开始到4结束[2,4)--含头不含尾
       //valueOf(??) -- 参数的类型转换,把参数转成String类型
       System.out.println(String.valueOf(100)+1);//把整数类型的100转成String类型
       byte[] bs = str.getBytes();//把字符串转成byte[]
       System.out.println(Arrays.toString(bs));
       str = "1|2|3|4|5|";
       String[] s = str.split("\\|");//按照指定字符切割字符串,\\在java里是转义符
       System.out.println(Arrays.toString(s));
    }
}

3 StringBuilder/StringBuffer

3.1 特点

  1. 封装了char[]数组
  2. 是<mark>可变</mark>的<mark>字符</mark>序列
  3. <mark>提供了一组可以对字符内容修改的方法</mark>
  4. 常用append()来代替字符串做字符串连接
  5. 内部字符数组默认初始容量是16

super(str.length() + 16);

  1. 如果大于16会尝试将扩容,新数组大小原来的变成2倍+2
  2. 容量如果还不够,直接扩充到需要的容量大小。

int newCapacity = value.length * 2 + 2;

3.2 常见方法

append()

3.3 练习:测试字符串连接效率

package cn.edut.tarena.demo1;

import org.junit.Test;

public class Demo_StringBuffer {
	@Test
	public void test001() {
		int time = 30000;
		Long ss = System.currentTimeMillis();
		method("sb,",time);
		Long se = System.currentTimeMillis();
		System.out.println("StringBuffer:"+time+"次拼接时间:"+(se-ss));
		
		ss = System.currentTimeMillis();
		method2("sb,",time);
		se = System.currentTimeMillis();
		System.out.println("String:"+time+"次拼接时间:"+(se-ss));
		
	}
	
	public static String method(String s , int time){
		StringBuffer sb = new StringBuffer(s);
		for(int i=0 ; i<time ; i++) {
			sb.append(s);
			//sb.append(sb) 会堆溢出
		}
		return sb.toString();
	}
	public static String method2(String s , int time){
		String sb = new String(s);
		for(int i=0 ; i<time ; i++) {
			sb+= (s);
		}
		return sb.toString();
	}
}


<mark>String+每次都会创建一个新的对象 =》 在堆中创建空间,分配地址,等等。。因此拼接效率非常低。</mark>

3.4 区别:StringBuffer和StringBuilder

StringBuffer 线程安全、出生早
Stringbuilder 不保证线程安全,出生晚

单线程字符串拼接,用谁都行。

4 包装类

把基本类型进行包装,提供更加完善的功能。

4.1 与基本类型的对应关系

4.2 Number

数字包装类的抽象父类。
提供了各种获取值的方式。

4.2.1 子类:

4.2.2 常用的方法:

4.3 Integer

4.3.1 创建对象

1new Integer(5);

2、Integer.valueOf(5);
//在Integer类中,包含256个Integer缓存对象,范围是 -128到127。
//使用valueOf()时,如果指定范围内的值,访问缓存对象,而不新建;
//如果指定范围外的值,直接新建对象。

4.3.2 常见方法

static int parseInt(String s)
// 将字符串参数作为有符号的十进制整数进行解析。

static Integer valueOf(String s)
   // 返回保存指定的 String 的值的 Integer 对象。 

4.4 Double

4.4.1 创建对象

1new Double(3.14)

2、Double.valueOf(3.14)//和 new 没有区别

4.4.2 方法

static double parseDouble(String s)

          返回一个新的 double 值,该值被初始化为用指定 String 表示的值,这与 Double 类的 valueOf 方法一样。

static Double valueOf(double d)

          返回表示指定的 double 值的 Double 实例。

5 日期类Date

5.1 概述

存在于java.util.Date包。
用来封装一个毫秒值表示一个精确的时间点。
从1970-1-1 0点开始的毫秒值。

5.2 创建对象

new Date()://封装的是系统当前时间的毫秒值

new Date(900000000000L)://封装指定的时间点

5.3 常用方法

getTime():取内部毫秒值

setTime():存取内部毫秒值

getMonth():获取当前月份

getHours():获取当前小时

compareTo(Date):当前对象与参数对象比较。当前对象大返回正数,小返回负数,相同0

5.4 练习1:测试日期类的常用方法

在这里插入代码片

6 日期工具SimpleDateFormat

6.1 概述

日期格式化工具,可以把Date对象格式化成字符串,也可以日期字符串解析成Date对象。

6.2 创建对象

new SimpleDateFormat(格式)

格式:yyyy-MM-dd HH:mm:ss

MM/dd/yyyy..

6.3 常见方法

format(Date):把Date格式化成字符串

parse(String):把String解析成Date

6.4 练习1 :计算存活天数

接收用户输入的出生日期,计算存活天数
↓↓↓ 实现的代码 ↓↓↓↓
https://blog.csdn.net/LawssssCat/article/details/103032454
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

8 拓展

8.1 == 和 equals 的区别

1、 当使用 = = {==} ==比较时,如果相比较的两个变量是引用类型,那么<mark>比较的是两者的物理地值(内存地址)</mark>,如果相比较的两个变量都是数值类型,那么比较的是具体数值是否相等。

2、 当使用equals()方法进行比较时,比较的结果实际上<mark>取决于equals()方法的具体实现</mark>

众所周知,任何类都继承自Object类,因此所有的类均具有Object类的特性,比如String、integer等,他们在自己的类中重写了equals()方法,此时他们进行的是数值的比较,而在Object类的默认实现中,equals()方法的底层是通过==来实现的。

8.2 StringBuilder和StringBuffer的区别

  1. 在线程安全上
  • <mark>StringBuffer是旧版本就提供的,线程安全的</mark>。@since JDK1.0

  • StringBuilder是jdk1.5后产生,线程不安全的。@since 1.5

  1. <mark>在执行效率上,StringBuilder > StringBuffer > String</mark>

  2. 源码体现:本质上<mark>都是在调用父类抽象类AbstractStringBuilder</mark>来干活,<mark>只不过Buffer把代码加了同步关键字</mark>,使得程序可以保证线程安全问题。

8.3 自动装箱和自动拆箱

<mark>自动装箱:把基本类型包装成一包装类的对象</mark>

Integer a = 5;//a是引用类型,引用了包装对象的地址。

编译器会完成对象的自动装箱:

Integer a = Integer.valueOf(5);

<mark>自动拆箱:从包装对象汇总,自动去除基本类型值</mark>

  int i = a;//a现在是包装类型,没法给变量赋值,需要把5取出来。

编译器会完成自动拆箱:

int i = a.intValue();

8.4 简单了解内部类的分类

如:静态内部类和非静态内部类

  1. <java中的静态类 - 心得>:https://blog.csdn.net/LawssssCat/article/details/102942298
  2. 理解LinkedList的Node为什么是静态内部类。(我当初是从内存方面理解的)