目录

1.包装类

1.1 装箱和拆箱

1.2包装类方法

2.String

2.1 String的保存属性

2.2 String的创建方式

2.3 String关于“==”特性的比较

2.3.1 字符串的特性

2.3.2 编译器优化

2.3.3 地址比较

2.3.4 值比较

2.4 String常用方法

3.StringBuffer

3.1 StringBuffer常用方法

4. StringBuilder

5 String,StringBuffer,StringBuilder比较


1.包装类

基本数据类型 包装类

boolean

Boolean

char

Character

byte

Byte

short

Short

int

Integer

long

Long

float

Float

double

Double

(黄色包装类的父类:Number)

1.1 装箱和拆箱

装箱:基本数据类型->包装类,拆箱反之,自动装箱拆箱在(jdk5之后)才有

装箱:

  1. 手动装箱=new 包装类(基本数据类型变量) 或 包装类.valueOf()
  2. 自动装箱 直接赋值(实际走的还是valueof)

拆箱:

  1. 拆箱 手动(xxx name = (包装类对象).xxxvalue)
  2. 自动拆箱 直接赋值(走的还是xxxvalue)
class PackageClass_{public static void main(String[] args) {//手动装箱int a = 10;Integer A1 = new Integer(a);Integer A2 = Integer.valueOf(a);//自动装箱Integer A3 = a;//手动拆箱int a1 = A1.intValue();//自动拆箱int a3 = A3;}
}

1.2包装类方法

//手动拆箱到 xxx 基本数据类型
xxxValue();
//手动装箱到包装类 //String转换到包装类
valueOf((xxx) i);
//转换到String
toString();

2.String

  1. Unicode编码,一个字符占两个字节

  2. final 类,不能被继承

  3. 实现了serializable接口和comparable接口,具有串行化网络传输和进行数据比较的性质

2.1 String的保存属性

到了一个名为value的char数组里面,且是个final类型的,不可修改所开辟堆的地址,其中指向常量池空间(但是单个字符的内容是可以变化的,看final的介绍),string类的更新实际上是更新其指向内容在常量池的地址

2.2 String的创建方式

  1. 直接赋值(先从常量池查看有没有“xxx“的数据空间,有的话,直接指向,没有则重新创建然后指向,对象最后指向的是它的地址(常量池))

    常量池地址一样
            //直接赋值创建String str1 = "abc";String str4 = "abc";
    
  2. 使用构造器(先从堆中创建空间,堆的该空间里面维护value的属性,然后从常量值里找,没有则创建,将改地址赋值给value,堆的该地址指向创建的对象)

            //使用构造器String str2 = new String("abc");

2.3 String关于“==”特性的比较

2.3.1 字符串的特性

字符串不可变,一个字符串一旦被分配,其内容将不可变,一旦重新赋值等价于重新将地址赋给对象

改变str1的字符串,可见改变了value的指向地址

2.3.2 编译器优化

编译器会判断引用对象并进行优化,避免无用的创建对象;

    String str3 = "a" + "bc";

2.3.3 地址比较

字符串==比较:常量相加看池地址,变量相加看堆地址

public class PClass {public static void main(String[] args) {//直接赋值创建String str1 = "abc";//str1 = "abcd";String str4 = "abc";//使用构造器String str2 = new String("abc");String str3 = "a" + "bc";String str5 = new String("a");String str6 = new String("bc");String str7 = str5 +str6;System.out.println(str1 == str3); //trueSystem.out.println(str1 == str4); //trueSystem.out.println(str1 == str2); //falseSystem.out.println(str1 == str7); //falseSystem.out.println(str2 == str7); //false}

2.3.4 值比较

equals方法,或者intern()

        System.out.println(str1.equals(str7));System.out.println(str7.intern() == str2.intern());

2.4 String常用方法

equals   区分大小写,判断内容是否相等

equalslgnoreCase 忽略大小写的判断内容是否相等

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

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

lastIndexOf  获取字符在字符串中最后1次出现的索引,索引从0开始,如找不到,返回-1

substring  截取指定范围的子串

trim 去空格

charAt  获取某索引处的字符,注意不能使用Str[index]这种方式.

3.StringBuffer

        StringBuffer sb1 = new StringBuffer(10);
  1. 线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。

    不是final因此存放在堆中(ToString返回的最后一个值的缓存。每当StringBuffer被修改时清除。)
  2. 字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。
  3. StringBuffer的主要StringBufferappendinsert方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。 append方法总是在缓冲区的末尾添加这些字符; insert方法将insert添加到指定点。
  4. 例如,如果z是指当前内容为"start"的字符串缓冲区对象,那么方法调用z.append("le")将使字符串缓冲区包含"startle" ,而z.insert(4, "le")会将字符串缓冲区更改为包含"starlet" 。
  5. 一般情况下,如果某人是指的一个实例StringBuffer ,则sb.append(x)具有相同的效果sb.insert(sb.length(), x) 。
  6. 每当涉及源序列(例如从源序列追加或插入)的操作发生时,该类仅在执行操作的字符串缓冲器上进行同步,而不在源上。 请注意,虽然StringBuffer被设计为可以安全地从多个线程并发使用,但如果构造函数或appendinsert操作被传递通过线程共享的源序列,则调用代码必须确保该操作具有一致且不变的视图在操作期间的源序列。 呼叫者通过使用不可变的源序列,或者不跨线程共享源序列,可以在呼叫期间持有锁来满足这一点。
  7. 每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。(更新是更新内容,当容器量不够时才会更新地址,所以效率较高)
  8. 除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException 。
  9. 从版本JDK 5开始,这个类别已经被一个等级类补充了,这个类被设计为使用一个线程StringBuilder 。 StringBuilder应该使用StringBuilder类,因为它支持所有相同的操作,但它更快,因为它不执行同步。

3.1 StringBuffer常用方法

主要是增(append)删(delete)查(indexOf)改(replace)插(insert)

StringBuffer append(boolean b)

将 boolean参数的字符串表示附加到序列中。

StringBuffer append(char c)

将 char参数的字符串表示附加到此序列。

StringBuffer append(char[] str)

将 char数组参数的字符串表示附加到此序列。

StringBuffer append(char[] str, int offset, int len)

将 char数组参数的子阵列的字符串表示附加到此序列。

StringBuffer append(CharSequence s)

追加指定的 CharSequence到这个序列。

StringBuffer append(CharSequence s, int start, int end)

追加指定的序列 CharSequence到这个序列。

StringBuffer append(double d)

将 double参数的字符串表示附加到此序列。

StringBuffer append(float f)

将 float参数的字符串表示附加到此序列。

StringBuffer append(int i)

将 int参数的字符串表示附加到此序列。

StringBuffer append(long lng)

将 long参数的字符串表示附加到此序列。

StringBuffer append(Object obj)

追加 Object参数的字符串表示。

StringBuffer append(String str)

将指定的字符串附加到此字符序列。

StringBuffer append(StringBuffer sb)

将指定 StringBuffer这个序列。

StringBuffer appendCodePoint(int codePoint)

将 codePoint参数的字符串表示法附加到此序列。

int capacity()

返回当前容量。

char charAt(int index)

返回 char在指定索引在这个序列值。

int codePointAt(int index)

返回指定索引处的字符(Unicode代码点)。

int codePointBefore(int index)

返回指定索引之前的字符(Unicode代码点)。

int codePointCount(int beginIndex, int endIndex)

返回此序列指定文本范围内的Unicode代码点数。

StringBuffer delete(int start, int end)

删除此序列的子字符串中的字符。

StringBuffer deleteCharAt(int index)

删除 char在这个序列中的指定位置。

void ensureCapacity(int minimumCapacity)

确保容量至少等于规定的最小值。

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

字符从该序列复制到目标字符数组 dst 。

int indexOf(String str)

返回指定子字符串第一次出现的字符串内的索引。

int indexOf(String str, int fromIndex)

返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。

StringBuffer insert(int offset, boolean b)

在此序列中插入 boolean参数的字符串表示形式。

StringBuffer insert(int offset, char c)

在此序列中插入 char参数的字符串表示形式。

StringBuffer insert(int offset, char[] str)

在此序列中插入 char数组参数的字符串表示形式。

StringBuffer insert(int index, char[] str, int offset, int len)

在此序列中插入 str数组参数的子阵列的字符串表示形式。

StringBuffer insert(int dstOffset, CharSequence s)

将指定的 CharSequence这个序列。

StringBuffer insert(int dstOffset, CharSequence s, int start, int end)

将指定的子序列 CharSequence这个序列。

StringBuffer insert(int offset, double d)

在此序列中插入 double参数的字符串表示形式。

StringBuffer insert(int offset, float f)

在此序列中插入 float参数的字符串表示形式。

StringBuffer insert(int offset, int i)

将第二个 int参数的字符串表示插入到此序列中。

StringBuffer insert(int offset, long l)

在此序列中插入 long参数的字符串表示形式。

StringBuffer insert(int offset, Object obj)

将 Object参数的字符串表示插入到此字符序列中。

StringBuffer insert(int offset, String str)

将字符串插入到此字符序列中。

int lastIndexOf(String str)

返回指定子字符串最右边出现的字符串内的索引。

int lastIndexOf(String str, int fromIndex)

返回指定子字符串最后一次出现的字符串中的索引。

int length()

返回长度(字符数)。

int offsetByCodePoints(int index, int codePointOffset)

返回此序列中与 index ( codePointOffset代码点偏移的索引。

StringBuffer replace(int start, int end, String str)

用指定的String中的字符替换此序列的子字符串中的 String 。

StringBuffer reverse()

导致该字符序列被序列的相反代替。

void setCharAt(int index, char ch)

指定索引处的字符设置为 ch 。

void setLength(int newLength)

设置字符序列的长度。

CharSequence subSequence(int start, int end)

返回一个新的字符序列,该序列是该序列的子序列。

String substring(int start)

返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。

String substring(int start, int end)

返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。

String toString()

返回表示此顺序中的数据的字符串。

void trimToSize()

尝试减少用于字符序列的存储。

4. StringBuilder

  1. 一个可变的字符序列。 此类提供与StringBuffer的API,但不保证同步。 此类设计用作简易替换为StringBuffer在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况)。 在可能的情况下,建议使用这个类别优先于StringBuffer ,因为它在大多数实现中将更快。
  2. StringBuilder的主要StringBuilderappendinsert方法,它们是重载的,以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入字符串构建器。 append方法始终在构建器的末尾添加这些字符; insert方法将insert添加到指定点。
  3. 例如,如果z引用当前内容为“ start ”的字符串构建器对象,那么方法调用z.append("le")将导致字符串构建器包含“ startle ”,而z.insert(4, "le")会将字符串构建器更改为包含“ starlet ”。
  4. 一般情况下,如果某人是指的一个实例StringBuilder ,则sb.append(x)具有相同的效果sb.insert(sb.length(), x) 。
  5. 每个字符串构建器都有一个容量。 只要字符串构建器中包含的字符序列的长度不超过容量,则不需要分配新的内部缓冲区。 如果内部缓冲区溢出,则会自动变大。
  6. StringBuilder的StringBuilder不能安全使用多线程。 如果需要同步, 那么建议使用StringBuffer (推荐单线程使用,效率最高)。
  7. 除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException 。

5 String,StringBuffer,StringBuilder比较

String StringBuffer StringBuilder
字符序列可变性 F T T
复用率
效率 最低 中等 最高
线程安全 -- 多线程 不同步
方法 String自己的方法  StringBuffer和StringBuilder方法一样
适合使用场景 多对象引用,且修改次数少

1.大量修改操作

2.多线程

1.大量修改操作

2.单线程

复用率:指常量池有相同内容的字符串可以不用再开辟常量池,直接指向该字符串

10.包装类,String,StringBuilder,StringBuffer相关推荐

  1. String StringBuilder StringBuffer 包装类 Date 类 枚举类

    String,StringBuilder,StringBuffer直接的区别是: String 不可变长的字符序列 StringBuilder 可变长的字符序列,线程不安全的,效率较高 StringB ...

  2. String StringBuilder StringBuffer三者之间的区别~~~

    String StringBuilder  StringBuffer三者之间的区别~~~ String是字符串常量,它是典型的immutable类,被声明final class,所有的属性都是fina ...

  3. String ,StringBuilder,StringBuffer的区分

    String ,StringBuilder,StringBuffer的区分 一.区别 String是字符串常量,而StringBuffer和StringBuilder是字符串变量.由String创建的 ...

  4. Java 集合 --- String, StringBuilder, StringBuffer

    Java 集合 --- String, StringBuilder, StringBuffer String String的声明方式 String的不可变性 对比两个String StringBuil ...

  5. String,Stringbuilder,Stringbuffer及正则表达式

    掌握String StringBuilder StringBuffer类的区别 一.String String是不可变类,一旦String对象被创建之后,包含对象中的字符串序列都是不可改变的,直到类被 ...

  6. String , StringBuilder , StringBuffer

    String 首先从String底层看起 从底层代码被final修饰,我们能看出来,String是只读字符串,他的成员方法也都默认为final方法.所以String所引用的字符串内容不能被改变 Str ...

  7. stringbuffer常用方法_Java 处理字符串常用的类:String StringBuilder StringBuffer

    在Android/Java开发中,用来处理字符串常用的类有3种: String.StringBuilder.StringBuffer. 它们的异同点: 1) 都是 final 类, 都不允许被继承; ...

  8. String StringBuilder StringBuffer

    1,String 是不可变类 immutable 不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值.如JDK内部自带的很多不可变类:八大包装类和String等.     ...

  9. Java回顾-String/StringBuilder/StringBuffer

    一.String的特点 1.String类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 2.String是一个final类,代表不可变字 ...

  10. String StringBuilder StringBuffer 对比 总结得非常好

    转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...

最新文章

  1. 索引贴——移动开发(.Net CF 停止更新)
  2. DL之MobileNetV2:MobileNetV2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  3. Spark 运行模式 standalong yarn
  4. 抚摸斯蒂芬·金 (图)
  5. node --- koa、Mongoose、vue联系知识梳理
  6. gateway 过滤器执行顺序_Gateway网关源码解析—路由(1.1)之RouteDefinitionLocator一览...
  7. IoU-aware的目标检测,显著提高定位精度
  8. java web redis_java web网页版redis客户端工具
  9. 修改Android中的文件权限
  10. php pos 接收,PHP开发中php pos()函数的使用详解
  11. python 将一个列表切割成随机指定长度的多个列表
  12. 不同类型变量与零值比较
  13. 理解Java - JDK动态代理原理
  14. Atitit 提升开发效率的方法 提升语言级别 目录 1. 提升语言级别到4gl 1 1.1. 语言的代际关系 sql 》script 》java 1 1.2. 使用4gl dsl语言与api 1
  15. IE8开发者工具 有打开却看不见
  16. 来电弹屏--线程间操作无效: 从不是创建控件的线程访问它
  17. 谁说码农不懂浪漫?(js写的'老婆生日快乐'特效)
  18. 网上学python靠谱吗?
  19. Linux的.a、.so和.o文件
  20. P41 网络编程入门

热门文章

  1. R语言 igraph——图挖掘助力社会网络分析
  2. 电动吸鼻器要做CCC认证吗?
  3. 1; XHTML 基本知识
  4. java 答题卡_试题八(共15分)阅读以下说明和Java程序代码,将应填入(n) 处的字句写在答题纸的对应栏内。[说明]在 - 赏学吧...
  5. eureka注册中心发现服务,调用依然出现java.lang.IllegalStateException: No instances available for XXX
  6. 基于JAVA携手同游旅游社交平台计算机毕业设计源码+系统+数据库+lw文档+部署
  7. 一半是 BAT 大厂被裁 iOS ,扛不住了
  8. python图像人类检测_Python 超简单实现人类面部情绪的识别
  9. 【密码学】PRP和PRF
  10. 佳能相机快门卡死的简易维修方法