zoukankan      html  css  js  c++  java
  • String系列

    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这个数据,其实是指向了相同地址。但是如果超过了这个范围的话,这数据就不是共享的了,指向的不是相同地址。所以就不相等了。

  • 相关阅读:
    异步与回调的设计哲学
    CTF之PHP黑魔法总结
    图片隐写分离
    phpMyadmin各版本漏洞
    python 多线程
    order by name 注入
    Python lambda
    Python os.popen() 方法
    你和大牛差了啥
    Error: failure: repodata/repomd.xml from fedora: [Errno 256] No more mirrors to try.
  • 原文地址:https://www.cnblogs.com/wangsong/p/5256217.html
Copyright © 2011-2022 走看看