API
概念
API(Application Programming Interface,应用程序接口)是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节.
API是一种通用功能集,有时公司会将API作为其公共开放系统,也就是公司制定自己的系统接口标准,当需要进行系统整合,自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码.
Java.util
包是java中的工具包,包含各种实用工具类/集合类/日期时间工具等各种常用工具包import java.util.Scanner;
import java.util.Arrays;
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()
用于指示其他某个对象是否与当前对象“相等”
重写前比较两个对象地址值是否相等,底层使用==判断
重写后比较的四两个对象的:类型、属性、属性值
示例代码
package cn.tedu.api;
import java.util.Objects;
/**
* 用于测试顶级父类Object
*/
public class TestObject {
public static void main(String[] args) {
Student student = new Student();
Student student1 = new Student("桂宏宇",28);
Student student2 = new Student("桂宏宇",28);
/*
重写前输出地址值
重写后输出对象属性与属性值
*/
System.out.println(student);
System.out.println(student1);
/*
使用equals测试重写前两个对象地址值是否相等,底层使用==判断
重写后比较是的两个对象的类型+属性+属性值
*/
System.out.println(student1 == student2);//false
System.out.println(student1.equals(student2));//true
System.out.println(student1 == student2);//false
/*
测试hashcode方法
返回该对象的哈希码值,用来区分不同的对象,不同对象生成的哈希码值不同
*/
System.out.println(student.hashCode());
System.out.println(student1.hashCode());
}
}
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
String
概念
String是一个封装char[]数组的对象,字符串不可变
通过下图中的底层实现可以看出:被final修饰,是常量String str = “abc”
; 等效于:char data[] = {‘a’, ‘b’, ‘c’};
创建String对象的方式
方式一:String(char[] value)
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
方式二: String str = “abc”;
- 如果是第一次使用字符串,java会在字符串堆中常量池创建一个对象。
- 再次使用相同的内容时,会直接访问堆中常量池中存在的对象。
示例代码
package cn.tedu.api;
public class TestString {
public static void main(String[] args) {
/*
字符串底层维护的是char[]数组,存放在堆中
*/
char[] value = {'a','b','c'};
String s1 = new String(value);//触发含参构造来创建String对象
String s11 = new String(value);//触发含参构造来创建String对象
/*
底层也会new String(),存放在堆中的常量池中,效率高
*/
String s2 = "abc";
String s22 = "abc";
String s3 = "aaa";
/*
"=="比较的时两个对象的地址值
equals()默认实现比较也是地址值,但String类重写了此方法,
不再比较地址值,而是比较内容,无论任何创建方式,只要串内容一致,equals()就会返回true
*/
System.out.println(s1 == s2);//false
System.out.println(s1 == s11);//false
System.out.println(s2 == s22);//true
System.out.println(s2 == s3);//false
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s11));//true
System.out.println(s2.equals(s3));//false
}
}
常见方法
int hashCode() 返回此字符串的哈希码。
boolean equals(Object anObject) 将此字符串与指定的对象比较,比较的是重写后的串的具体内容
String toString() 返回此对象本身(它已经是一个字符串!)
length()-查看字符串的长度
charAt()—获取指定下标处位置上的字符
indexOf()返回指定字符在此字符串中第一次出现的索引
lastIndexOf()-某个字符最后一次出现的位置
concat()将指定字符串连接\拼接达到此字符串的结尾,不会改变原串
substring(int beginIndex, int endIndex)-截取子串,返回一个新子串,从执定下标开始,到结束下标为止,但不包含结束下标[1,5)
substring(int beginIndex) 返回一个新子串,从指定下标处开始,包含指定下标
equals()-判断两个串是否相等,注意String重写了Object的此方法,所以内容相同就返回true
startsWith()-判断是不是以指定元素开头
endsWith()–判断是不是以指定元素数结尾
split()—以指定字符分割
trim()-去掉首尾两端的空格
getBytes()-把串转换成数组
toUpperCase()-变成全大写
toLowerCase()-变成全小写
String.valueOf(10)-把int类型的10转换成String类型
示例代码
package cn.tedu.api;
import java.util.Arrays;
import java.util.Locale;
/**
* 测试String常用方法
*/
public class TestString2 {
public static void main(String[] args) {
String s = "abc";
char[] value = {'a','b','c','d'};
String ss = new String(value);
/*
测试常用方法
*/
System.out.println(s.charAt(0));//a,获取指定下标处的字符
String s2 = s.concat("桂宏宇");//用于拼接字符串,但不会改变原字符串
System.out.println(s);//abc,不会改变原串
System.out.println(s2);//abc桂宏宇,打印的是拼接后s2指向的串abc桂宏宇
System.out.println(s.concat("桂宏宇"));//abc桂宏宇
System.out.println(s.endsWith("宇"));//false,判断是否以指定元素结尾
System.out.println(s.startsWith("a"));//true,判断是否以指定元素开头
System.out.println(s.length());//3,获取字符串长度与数组的length不同,数组的length为属性
System.out.println(s == ss);//false,比较地址值
System.out.println(s.equals(ss));//true,比较内容
System.out.println(s.indexOf("b"));//1,获取指定元素首次出现的下标值
ss = "abcbb";
System.out.println(ss.lastIndexOf("b"));//获取指定元素最后一次出现的下标值
//根据指定规则分割字符串,返回值类型为数组String[],需要使用数组工具类打印
String s3 = "a b c d e";
System.out.println(s3.split(" "));//[Ljava.lang.String;@1b6d3586
System.out.println(Arrays.toString(s3.split(" ")));
/*
根据下标截取子串,如果只有一个下标,从指定位置处开始截取,包含指定下标位置的元素
若有两给下表,截取这两个下标之间的字串,含头不含尾
*/
System.out.println(s3.substring(3));// c d e
System.out.println(s3.substring(1,5));// b c
System.out.println(s3.toUpperCase());//A B C D E,把指定字符串转换为全大写
System.out.println(s3.toLowerCase());//a b c d e,把指定字符串转换为全小写
s3 = " abcde ";
System.out.println(s3.trim());//abcde,去除指定字符串的首尾空格
System.out.println(String.valueOf(10));//10,转换为字符串10
System.out.println("20" + 10);//2010,字符串拼接
System.out.println(String.valueOf(20) + 21);//2021
}
}
StringBuilder/StringBuffer
特点
封装了char[]数组
是可变的字符序列
提供了一组可以对字符内容修改的方法
常用append()来代替字符串做字符串连接”+”
内部字符数组默认初始容量是16:super(str.length() + 16);
如果大于16会尝试将扩容,新数组大小原来的变成2倍+2,容量如果还不够,直接扩充到需要的容量大小。int newCapacity = value.length * 2 + 2;
StringBuffer 1.0出道线程安全,StringBuilder1.5出道线程不安全
方法
append()
示例代码
package cn.tedu.api;
/**
* 联系字符串拼接
*/
public class TestString3 {
public static void main(String[] args) {
//需求,拼接打印26个小写字母1w次
String str = "abcdefghijklmnopqrstuvwxyz";
//method(str);//普通字符串拼接
method2(str);//高效字符串拼接
}
private static void method2(String str) {
StringBuilder sb = new StringBuilder();
StringBuffer sb2 = new StringBuffer();
System.out.println(sb);
long t1 = System.currentTimeMillis();
for (int i = 0;i < 10000;i++){
//sb.append(str);
sb2.append(str);
}
long t2 = System.currentTimeMillis();
System.out.println("拼接结果为" + sb2);
System.out.println(t1);
System.out.println(t2);
System.out.println("花费时间为" + (t2-t1));
}
private static void method(String str) {
String str2 = "";
long t1 = System.currentTimeMillis();
for (int i = 0;i < 10000;i++){
str2 += str;
}
long t2 = System.currentTimeMillis();
System.out.println("拼接结果为" + str2);
System.out.println(t1);
System.out.println(t2);
System.out.println("花费时间为" + (t2-t1));
}
}