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 特点
- 封装了char[]数组
- 是<mark>可变</mark>的<mark>字符</mark>序列
- <mark>提供了一组可以对字符内容修改的方法</mark>
- 常用append()来代替字符串做字符串连接
- 内部字符数组默认初始容量是16
super(str.length() + 16);
- 如果大于16会尝试将扩容,新数组大小原来的变成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 创建对象
1、new 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 创建对象
1、new 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的区别
- 在线程安全上
-
<mark>StringBuffer是旧版本就提供的,线程安全的</mark>。@since JDK1.0
-
StringBuilder是jdk1.5后产生,线程不安全的。@since 1.5
-
<mark>在执行效率上,StringBuilder > StringBuffer > String</mark>
-
源码体现:本质上<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 简单了解内部类的分类
如:静态内部类和非静态内部类
- <java中的静态类 - 心得>:https://blog.csdn.net/LawssssCat/article/details/102942298
- 理解LinkedList的Node为什么是静态内部类。(我当初是从内存方面理解的)