2021-7-31API Object String StringBuffer/StringBuilder复习

API

Application Programming Interface,应用程序接口,是一些预先定义的函数。目的是提供应用程序和开发人员基于某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节

Java.util包是java的工具包,包含各种实用工具类、集合类,日期时间工具等

Java.lang包是java的核心,包含了java的基础类。包含Object类,class类,string类,基本数字类等最基本的类,这个包无需导入,默认会自动导入

Object类是所有Java类的祖先,也就是"*父类"

如果想要查看对象的属性值,需要重写toString(),否则打印的是地址值,

return getClass().getName() + "@" + Integer.toHexString(hashCode());
如果要判断两个对象间的所有属性值相同,比较结果为true,就需要重写equals()
//  否则使用的就是Object的默认实现,通过==比较的是两个对象的地址值,不是属性

常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。

当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用

String

String是一个封装char[]数组的对象,字符串不可变,被finall修饰,是常量

String str="abc" 等效于: char data[]={'a','b','c'},如果是第一次使用字符串,java会在字符串堆中常量池创建一个对象,如果再次使用相同的内容时,会直接访问堆中常量池存在的对象

package cn.tedu.test;

import java.util.Arrays;

public class TestString {
    public static void main(String[] args) {
        char[] a={'a','b','c'};
        String s1=new String(a);
        String s11=new String(a);
        System.out.println(s1.equals(s11));//true
        System.out.println(s1==s11);//false,没有高效的效果
        String s2 = "abc";
        String s222=new String("abc");
        String s22 = "abc";
        System.out.println(s22==s222);//false
        System.out.println(s2==s22);//true,有高效的效果
        //获取指定下标的元素
        System.out.println(s2.charAt(0));//a,0开始
        //用于拼接指定字符串,但不会改变原来的字符串
        System.out.println(s2.concat("我爱你"));//abc我爱你
       //判断是否为指定元素开头或结尾
        System.out.println(s2.startsWith("a"));//可以判断开头的多个元素
        System.out.println(s2.endsWith("c"));//可以判断结尾相邻的多个元素
        //判断该字符首次出现的位置
        System.out.println(s2.indexOf("d"));//返回下标,未曾含有此字符返回-1
        //判断该字符最后一次出现的位置
        System.out.println(s2.lastIndexOf("c"));
        //按照要求指定分割字符串,返回值类型是String[]
        System.out.println(Arrays.toString(s2.split("b")));//[a, c]
        //如果指定一个下标,那就从指定位置开始截图,包含指定下标,到结束
        //如果指定2个下标,那就截图下标之间的,含头不含尾
        System.out.println(s2.substring(1));//bc
        System.out.println(s2.substring(0,2));//ab
        //把指定字符串转大小写
        System.out.println(s2.toUpperCase());//ABC
        System.out.println(s2.toLowerCase());//abc
        String s3="  a  b  c  ";
        System.out.println(s3.trim());//只能去除首尾
        //转为String类型
        System.out.println("20"+10);
        System.out.println(String.valueOf(80)+10);
    }
}

StringBuilder/StringBuffer

1封装了char[]

2是可变的字符序列

3提供一组可以对字符内容修改的方法"+"

4常用append()来代替字符串做字符串连接"+"

5内部字符数组默认初始容量是16:super(str.length()+16);

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

1.在线程安全上:

StringBuffer是旧版本提供的,线程安全的@since JDK1.0

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

2。执行效率上

StringBuilder>StringBuffer>String

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

package cn.tedu.test;

import java.util.Arrays;

public class StringBu {
    public static void main(String[] args) {
        method1();
        method2();
        method3();
    }
    //StringBuffer拼接10000000次
    public static void method1(){
        String str = "abcdefghijklmnopqrstuvwxyzf";
        StringBuffer sb = new StringBuffer();
        long t1 = System.currentTimeMillis();
        for (int i=0; i<10000000;i++){
          sb.append(str);
        }
        long t2 = System.currentTimeMillis();
        System.out.println(t2-t1);
    }
    //StringBuilder拼接10000000次
    public static void method2(){
        String str = "abcdefghijklmnopqrstuvwxyzf";
        StringBuilder stringBuilder = new StringBuilder();
        long t1=System.currentTimeMillis();
        for (int i = 0; i <10000000 ; i++) {
            stringBuilder.append(str);
        }
        long t2=System.currentTimeMillis();
        System.out.println(t2-t1);
    }
    //String拼接10000
    public static void method3() {
        String str = "abcdefghijklmnopqrstuvwxyzf";
        String result ="";
        long t1=System.currentTimeMillis();
        for (int i = 0; i <10000 ; i++) {
           result=result+str;
        }
        long t2=System.currentTimeMillis();
        System.out.println(t2-t1);
    }
}

==和equals的区别

String中equals方法被重写,当物理地址不同时,会进一步比较值

==比较的是值,

==如果比较的是基本数据类型,比较的则是变量值

==如果比较的是引用数据类型,比较的则是地址值

 equals比较的是引用数据类型

 如果没有重写hashCode和equals方法,比较的是地址值,因为Object的equals方法中使用是==
 如果重写hashcode和equals方法,则比较的是内容

例如;两个String字符串进行比较时,比较的是内容,因为String底层重写了equals方法进行内容的比较
 

上一篇:java中Clob转String代码


下一篇:Java——StringBuffer,String总结