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

本文详细介绍了Java中的API,特别是字符串相关的概念,如String、StringBuilder和StringBuffer的使用和性能对比。讲解了如何通过API进行字符串操作,如比较、拼接、截取等,并探讨了equals()与==的区别。同时,还讨论了对象的哈希码和常量池的概念。在性能方面,展示了在大量字符串连接操作中StringBuilder优于StringBuffer和直接使用+的情况。
摘要由CSDN通过智能技术生成

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方法进行内容的比较
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人系统开发经验充足,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值