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);//falseSystem.out.println(student1.equals(student2));//trueSystem.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() {}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic 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);}@Overridepublic 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);//falseSystem.out.println(s1 == s11);//falseSystem.out.println(s2 == s22);//trueSystem.out.println(s2 == s3);//falseSystem.out.println(s1.equals(s2));//trueSystem.out.println(s1.equals(s11));//trueSystem.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的此方法,所以内容相同就返回truestartsWith()-判断是不是以指定元素开头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;@1b6d3586System.out.println(Arrays.toString(s3.split(" ")));/*根据下标截取子串,如果只有一个下标,从指定位置处开始截取,包含指定下标位置的元素若有两给下表,截取这两个下标之间的字串,含头不含尾*/System.out.println(s3.substring(3));// c d eSystem.out.println(s3.substring(1,5));// b cSystem.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,转换为字符串10System.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));}}
