回顾总结11

常用类

包装类Wrapper

Byte、Short、Integer、Long、Float、Double这六个对象是继承自Number,Number继承于Object

Boolean、Character直接继承于Object

八大基本类型对象都有实现Comparable、Serializable接口

Serializable接口:串行化(序列化),可以在网络上传输

Comparable接口:对象可以相互进行比较

Integer自动装箱,范围在-128~127之间使用的是Integer缓存数组(通过调用Integer.valueOf()方法),每次从数组里取值。不论取多少次,值都是相同一个。
不在缓存数组里则是new 一个新的Integer对象。

如果有基本数据类型和包装类进行比较判断,则比较的都是基本数据类型。

String

details

常用的构造器
  1. String()
  2. String(String original)
  3. String(char[] a)
  4. String(char[] a,int startIndex,int count)
  5. String(byte[] b)
String是final类,不能被继承
String本质

是char[]字符数组,该数组是final类型,不可以被修改。指的是地址不能被修改,数组value不能指向新的对象。
String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是在更改地址,效率较低。

创建对象的区别
  1. 直接赋值 String s = "hsp";
    • 先从常量池查看是否有"hsp"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址。没有堆的中间商赚差价。
  2. 调用构造器 String s2 = new String("hsp");
    • 先在堆中创建空间,里面维护了value属性,指向常量池的"hsp"空间,如果常量池没有"hsp",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
intern方法

返回的是常量池的对象(地址)
根据创建对象方式的不同,String地址的表现形式不一样

  • 直接赋值:直接指向常量池中的对象,栈中存储的地址是常量池中对象的地址。intern返回的也是常量池中对象的地址。
  • new 对象:栈中存储的是堆中char数组对象的地址,char数组对象中存储的是常量池中对象的地址。intern返回的是常量池中的地址,栈中存储的是char数组对象的地址
hashcode、==、equals

hashcode返回的是对象的地址。最终对象的地址。对于String来说,就是常量池中对象的地址。

==比较的是地址,栈中存储的地址(地址也是值的一种)

equals比较的是值,最终指向的值

String相加
  • 如果是常量相加 如(String c = "pansy" + "study")看的是常量池。(会直接在常量池创建一个"pansystudy"的常量对象,和正常的String直接赋值一样)
  • 如果是变量相加 如(String a = "pansy"; String b = "study"; c = a + b;)看的是堆(有变量对象参与的字符串相加,会使用到StringBuilder对象,最终会使用new获取一个新的String对象来返回给c)
String常用方法
  1. equals:区分大小写,判断内容是否相等

  2. equalsIgnoreCase:不区分大小写,判断内容是否相等

  3. length:获取字符的个数,字符串的长度

  4. indexOf:获取字符在字符串中第一次出现的索引,索引从0开始,如果找不到,返回-1

  5. lastIndexOf:获取字符在字符串中最后一次出现的索引

  6. substring:截取指定范围的字符串的子串

  7. trim:去前后空格

  8. charAt:获取某索引出的字符,不能使用Str[index]这种方式

  9. toUpperCase:返回转换成大写的字符串

  10. toLowerCase:返回转换成小写的字符串

  11. concat:拼接字符串

  12. compareTo:比较两个字符串的大小

    • 一个一个字符进行判断,如果不相同,返回两个字符差值
    • 如果都相同,返回字符串长度差值
  13. toCharArray:转换成字符数组

  14. format:格式字符串,%s 字符串 %c 字符 %d 整型 %.2f 浮点型

    %s、%c、%d、%.2f等是占位符,由后面的变量来替换

  15. replace:返回替换字符串中的字符

  16. split:分割字符串,对于某些分割字符,我们需要转义,比如|等

    返回数组,以参数作为分割符

StringBuffer

  1. StringBuffer类是继承AbstractStringBuffer类

  2. 实现了Serializaable接口

  3. 父类AbstractStringBuffer有属性char[] value,不是final修饰的

    该value存放字符串内容,存放位置在堆中
    --------相比于String,String是直接继承自Object类,自己有char[] value,是final的,不可被修改,该value存放字符串内容,存放位置在常量池中

  4. StringBuffer是被final修饰的,不能被继承

    StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上就是更新值,不用每一次更新地址(创建新对象),效率较高

StringBuffer构造器

  1. StringBuffer()

    无参构造器,不带字符的字符串缓冲区,初始容量为16个字符

  2. StringBuffer(CharSequence seq)

    构造一个字符串缓冲区,包含与指定的CharSequence相同的字符

  3. StringBuffer(int capacity)

    构造一个不带字符,具有指定初始容量的字符串缓冲区。大小为传进来的capacity值

  4. StringBuffer(String str)

    构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容

    大小为指定字符串长度+16

与String的转换

String--------->StringBuffer

//1.使用构造器
String str = "study java";
StringBuffer stringBuffer1 = new StringBuffer(str);
//2.使用append方法
StringBuffer stringBuffer2 = new StringBuffer();
stringBuffer2 = stringBuffer2.append(str);

StringBuffer-------->String

//1.使用StringBuffer提供的toString方法
String s3 = stringBuffer2.toString();
//2.使用构造器
String s4 = new String(StringBuffer2);

StringBuffer常用方法

  1. 增append
  2. 删delete(start,end)
  3. 改replace(start,end,string)左闭右开
  4. 查indexOf
  5. 插insert
  6. 获取长度length

StringBuilder

一个可变的字符序列,此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全的)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候,如果可能,简易优先采用该类,因为在大多数实现中,它比StringBuffer要快。

常用方法

  1. append
  2. insert

可以重载这些方法,用来接受任意类型的数据

对比总结

  1. StringBuilder和StringBuffer非常相似,StringBuilder是StringBuffer的扩展。均代表可变的字符序列,而且方法也一样
  2. String:不可变字符序列,效率低,重用率高。
  3. StringBuffer:可变字符序列,效率较高(增删),线程安全
  4. StringBuilder:可变字符序列,效率最高,线程不安全
  5. 因为String是不可变的,每一次修改都是创建新的字符串对象,如果对String做大量修改的操作,会导致大量副本字符串对象存留在内存中,降低效率。这样的操作放到循环中,会极大影响程序的性能。不要使用String

使用场景

  1. 如果字符串存在大量的修改操作,一般使用StringBuffer和StringBuilder
  2. 如果字符串存在大量的修改操作,并且在单线程的情况,使用StringBuilder
  3. 如果字符串存在大量的修改操作,并且在多线程的情况,使用StringBuffer
  4. 如果字符串很少修改,被多个对象引用,使用String,比如配置信息等
上一篇:每日三道面试题,通往*的道路2


下一篇:【Java】String、StringBuffer、StringBuilder