String 简介

String 是java中的字符串,它继承于CharSequence。
String类所包含的API接口非常多。为了便于今后的使用,我对String的API进行了分类,并都给出的演示程序。

String 和 CharSequence 关系
String 继承于CharSequence,也就是说String也是CharSequence类型。
CharSequence是一个接口,它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口。除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接口。
需要说明的是,CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过字符数组实现的!

StringBuilder和 StringBuffer的区别

StringBuilder和 StringBuffer都是可变的字符序列。它们都继承于AbstractStringBuilder,实现了CharSequence接口。
但是,StringBuilder是非线程安全的,而StringBuffer是线程安全的。

它们之间的关系图如下: 

String 函数列表 

 

StringBuilder 简介

StringBuilder默认是构造一个char[16]
当容量不够时,会扩容newCapacity = value.length * 2 + 2;调用Arrays.copyOf(value, newCapacity);
 

StringBuilder 是一个可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。
StringBuffer 也是继承于AbstractStringBuilder的子类;但是,StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的。

一、定义:

1、从概念上讲,java字符串就是Unicode字符序列。每个用双引号括起来的字符串都是String类的一个实例。

Java字符串由char序列组成,也就是说,String的最小单位是char类型的字符。字符数据类型是一个采用UTF-16的编码表示Unicode代码点的代码单元。(大多数的常用Unicode字符使用一个代码单元就可以表示,而付诸字符需要一对代码单元表示。具体内容,请自行查阅相关资料或者百度,本人不在此赘述了。)

2、格式:

  1. String a = ”abc”;//存储在StringPool中
  2. String b = new String(”abc”)://存储在堆内存中
 

3、StringPool(字符串池):

在java的内存分配中,存在着一个方法区,这里有一个常量池,是存放那些常量等不变的值,StringPool即字符串池就是存在于这里,它是一个存放字符串的公共存储池。字符变量指向存储池中的相应位置。如果是通过复制一个字符串变量,原始的字符串和复制的字符串将共享这个相同的字符串。

二、特点:

1、String是一种特殊的数据类型,可创建对象。

2、通过String创建的对象分别可存在于字符串池(StringPool)和堆内存中

3、String是一个final的类型,即不可被继承修改,一经初始化就终生不可改变。(要改变也是改变的引用变量)

4、StringPool中的数据可共享,即两个引用变量可指向同一个字符串池中的字符串

5、Java中的任何对象都可写成字符串的形式。

注:字符串不可变的原因:

a. 可以想得出,每种固定的东西是不会改变的,1就是1,也就是说你若想改变,只得改变这个引用变量所指向的地址。

b. 编译器可以让字符串共享数据。所以不必改变字符串,直接改变变量即可。

c. java的开发者认为共享数据的效率要远远胜于提取、拼接字符串的效率。程序中对字符串的修改操作很少,更多的是对字符串进行比较。

与常量池相关的:

先看段小程序:

  1. class IntegerDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. Integer m = 128;
  6. Integer n = 128;
  7. System.out.println("128--m==n :" + (m==n));
  8. Integer a = 127;
  9. Integer b = 127;
  10. System.out.println("127--a==b :" + (a==b));
  11. }
  12. }

其实说起来,这个Integer和int的关系有点像String和StringBuilder的关系。

java为了优化内存,提高性能,就单开了一片内存池(pool),也就是说,在这里共享了那些固定不变的数据(我个人理解),如数字和字符串等等,这也是一种对象。

 

重点说Integer和int,在内存池中定义他们的范围是-128 ~ 127,这里的数是共享的,其实共享的是地址,就是变量指向的地址。(题外话:变量其实都是指向的地址,地址才是代表一块内存的空间的。)java为了提高效率,初始化了-128--127之间的整数对象,所以,如果写Integer a =100的话,是在内存池中创建了一个变量为a的对象,再写b=100,就共享了100这个数据,其实是指向了相同地址。但是如果超过了这个范围的话,这数据就不是共享的了,指向的不是相同地址。所以就不相等了。

String系列的更多相关文章

  1. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  2. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  3. Java String系列

    String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1) StringBuilder 详解 (String ...

  4. String系列-----AbstractStringBuilder

    1. AbstractStringBuilder是StringBuffer和StringBuilder的父类 package com.amazing.jdk.string_2017_12_31; im ...

  5. String系列-----String

    jdk源码学习之String,手动实现一个String package com.amazing.jdk.string_2017_12_31; import java.io.Serializable; ...

  6. StringBuilder 详解 (String系列之2)

    本章介绍StringBuilder以及它的API的详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string02.html StringB ...

  7. StringBuffer 详解 (String系列之3)

    本章介绍StringBuffer以及它的API的详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string03.html StringBu ...

  8. 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())

    在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数 ...

  9. 实战c++中的string系列--不要使用memset初始化string(一定别这么干)

    參考链接: http://www.cppblog.com/qinqing1984/archive/2009/08/07/92479.html 百度百科第一次这么给力: void *memset(voi ...

随机推荐

  1. ORA-01654 索引 无法通过 表空间扩展

    "ORA-01654: 索引VGSM.AUDIT_DATA_I无法通过8192(在表空间KLDB中)扩展"   1.有可能是索引表空间不够 select sum(bytes/102 ...

  2. Openvswitch原理与代码分析(5): 内核中的流表flow table操作

      当一个数据包到达网卡的时候,首先要经过内核Openvswitch.ko,流表Flow Table在内核中有一份,通过key查找内核中的flow table,即可以得到action,然后执行acti ...

  3. S1700

  4. Populating Next Right Pointers in Each Node II--leetcode难题讲解系列

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  5. C# 实现字符串去重

    方法一 注:需要.net 3.5框架的支持 string s = "101,102,103,104,105,101,102,103,104,105,106,107,101,108" ...

  6. Qt label加边框

    myLabel->setStyleSheet("border:1px solid black"); 简要说明:border就是边缘.px是像素,1px就是边框的宽度.soli ...

  7. SQL截取字段字符串的方法

    set @str='WX15-53-H-53-99-15-335-23'; select @str as '字符串' select len(@str) as '字符长度' select charind ...

  8. 【转】Velocity模板(VM)语言介绍

    http://www.blogjava.net/caizh2009/archive/2010/08/20/329495.html Velocity是什么? Velocity是一个基于java的模板引擎 ...

  9. JavaScript 属性描述符

    属性描述符(Property Descriptor)是 ES5 之后出现的概念,顾名思义,它用于描述属性应该是什么样,例如是否只读,能否枚举,能否可配置等.所有对象属性均可使用属性描述符来定义. 属性 ...

  10. Sass学习之路:Sass、Compass安装与命令行

    导言 CSS不是一门真正意义上的编程语言,很多编程语言理所当然的特性(比如变量),都不被支持.同时再开发模块化的web项目的时候,也要避免相互干扰.为了弥补CSS的这些不足,就产生了CSS预处理器,S ...