一、介绍

String:不可变的Unicode字符序列

    例如:"Java"   就是4个Unicode字符J,a,v,a组成的

Java没有内置的字符串类型,而是在标准的Java类库中提供了一个预定义的类String.每个用双引号括起来的字符串就是String类的一个实例.

当使用+,实际是产生新的对象

StringBuilder:可变字符序列,线程不安全,效率高(常用)
StringBuffer:可变字符序列,线程安全,效率低

(使用循环拼接字符串时,一定要用StringBuilder或者StringBuffer其中的一个)

二、查看String的一小部分源码

1
2
3
4
5
6
The <code>String</code> class represents character strings. All
 * string literals in Java programs, such as <code>"abc"</code>, are
 * implemented as instances of this class.
 * <p>
 * Strings are constant; their values cannot be changed after they
 * are created.

String类存在于java.lang包中。上述大概意思:String是一个字符串,String的字面量也是String的一个实例。String它的值在创建以后是不能变的.....

1
2
3
4
5
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    /** The value is used for character storage. */
    private final char value[];

可以看出外部类是不能直接访问到这个value属性的,这个char value[]不可变

以下是String的部分构造器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//默认构造器,当写下了String str =new String();的时候,其实内部是给了一个长度为0的char数组给value
    public String() {
      ...省略部分....
      this.value = new char[0];
    }
    //可以传递一个字符串,则直接把传递的字符串赋给了value
    public String(String original) {
      ...省略部分....
      this.value = v;
    }
    /**
    *也可以传递一个字符数组,例如:可以像下面这样
    *char[] c = {'a','b','c'};
    *String str = new String(c);
    */
    public String(char value[]) {
    int size = value.length;
    this.offset = 0;
    this.count = size;
    this.value = Arrays.copyOf(value, size);
    }

String重载了很多构造器,不一一查看了。

String的一些常用方法源码:还有很多其他的,不一一介绍了,使用起来都很简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//length是直接返回的count
public int length() {
   return count;
}
//isEmpty是直接判断count是否等于0
public boolean isEmpty() {
   return count == 0;
}
//charAt是取char[] value中相应索引的值,count不在范围抛出数组索引越界异常
public char charAt(int index) {
   if ((index < 0) || (index >= count)) {
       throw new StringIndexOutOfBoundsException(index);
   }
   return value[index + offset];
}
//substring
public String substring(int beginIndex) {
    return substring(beginIndex, count);
}
//开始索引小于0,大于当前对象总长度,或者结束索引大于总长度,都抛出越界异常
//否则,开始等于0,结束等于总长度,则重新new一个string对象
public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > count) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    if (beginIndex > endIndex) {
        throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
    }
    return ((beginIndex == 0) && (endIndex == count)) ? this :
        new String(offset + beginIndex, endIndex - beginIndex, value);
}
   
   
//常用的equals方法(重写了父类的equals方法),是先比较对象是否为同一个对象。然后比较其内容是否都相等。
public boolean equals(Object anObject) {
if (this == anObject) {//首先比较当前对象和传来的对象是不是同一个对象
   return true;
}
if (anObject instanceof String) {//如果传来的对象是String的一个实例
   String anotherString = (String)anObject;
   int n = count;
   if (n == anotherString.count) {
   char v1[] = value;
   char v2[] = anotherString.value;
   int i = offset;
   int j = anotherString.offset;
   while (n-- != 0) {//数组每个元素对应比较
       if (v1[i++] != v2[j++])//如果有一个元素不相等,返回false
       return false;
   }
   return true;
   }
}
return false;
}

length、isEmpty、charAt、substring等等的就不做测试了,主要测试equals方法

1
2
3
String str = new String("abcd");
String str2 = str;
System.out.println(str.equals(str2));//返回结果:true,因为str和str2都指向了同一个new String("abcd");对象
1
2
3
4
5
String str = new String("abcd");
String str2 = new String("abcd");
System.out.println(str.equals(str2));//返回结果:true,此时str和str2指向的不是同一个对象,但是内容相等
//但是如果直接==的话就是false
System.out.println(str==str2);//因为不是同一个对象

三、总结

1、String是由final修饰的class,不可修改。内部的属性都是private的,不给外部访问。

2、内部的主要操作就是操作的char value[]数组,这个value其实是可以修改的,但是jdk中没有提供接口供你修改。

3、字符串比较需要使用equals方法,两个对象比较使用==

4、部分常用方法,还有一些concat、replace、replaceFirst、replaceAll、split、toLowerCase、toUpperCase、trim、valueOf等等的方法

1
2
3
4
5
6
7
8
9
10
11
12
//长度:直接返回count属性
public int length()
//是否空:直接return count==0
public boolean isEmpty()
//根据指定索引获取字符:如果index<0或者index>count都抛出*StringIndexOutOfBoundsException,否则直接返回char数组中对应的值
public char charAt(int index)
//如果传来的和调用的是同一个对象,返回true
//然后遍历比较,如果传来对象的其中一个值跟调用的对象不等,就返回false
public boolean equals(Object anObject)
//substring先判断beginIndex < 0,beginIndex < 0,beginIndex >endIndex都会抛出异常
//否则(beginIndex == 0) && (endIndex == count)成立的话直接返回this,不成立则new String
public String substring(int beginIndex, int endIndex)

5、值得一提的是,String的toString方法是直接返回的this

6、String对象个数问题:

1
2
3
4
5
6
7
8
String str="a";//总共一个对象a
String str2=new String("a");//总共两个对象:一个new String,一个a
 
String str="a";//这里一个对象
for(int i=0;i<10;i++){
   str = str + i;//这里每循环一次都会创建一个对象
}
//以上执行完会出现11个对象

Java常用类:String的更多相关文章

  1. Java 常用类String类、StringBuffer类

    常用类 String类.StringBuffer类 String代表不可变的字符序列 "xxxxxxx"为该类的对象 举例(1) public class Test { publi ...

  2. 深入理解Java常用类----String

         Java中字符串的操作可谓是最常见的操作了,String这个类它封装了有关字符串操作的大部分方法,从构建一个字符串对象到对字符串的各种操作都封装在该类中,本篇我们通过阅读String类的源码 ...

  3. 深入理解Java常用类----String(二)

    上篇介绍了String类的构造器,获取内部属性等方法,最后留下了最常用的局部操作函数没有介绍,本篇将接着上篇内容,从这些最常见的函数的操作说起,看看我们日常经常使用的这些方法的内部是怎么实现的.第一个 ...

  4. java常用类-String类

    * 字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. * 通过查看API,我们可以知道 * A:字符串字面值"abc"也可以看成是一个字符串对象. * B:字符串是 ...

  5. java常用类String

    String: String类: 代表字符串 是一个final类,代表不可变的字符序列 字符串是常量,用双引号引起来表示.值在创建后不可更改 String对象的字符内容是存储在一个字符数组Value[ ...

  6. Java常用类String的面试题汇总

    比较两个字符串时使用"=="还是equals()方法? 当然是equals方法."=="测试的是两个对象的引用是否相同,而equals()比较的是两个字符串的值 ...

  7. Java常用API(String类)

    Java常用API(String类) 概述: java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例 1. ...

  8. Java常用类:包装类,String,日期类,Math,File,枚举类

    Java常用类:包装类,String,日期类,Math,File,枚举类

  9. Java基础 —— Java常用类

    Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@&quo ...

  10. Java常用类学习笔记总结

    Java常用类 java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String ...

随机推荐

  1. poj 3072(最短路)

    题目链接:http://poj.org/problem?id=3072 一涉及稍微计算几何方面的东西就要做好久,一开始先用SPFA写的,可能是由于松弛次数过多导致精度损失,郁闷了好久,然后改成Dijk ...

  2. hdu 2413(最大匹配+二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2413 思路:由于要求最少的时间,可以考虑二分,然后就是满足在limit时间下,如果地球战舰数目比外星战 ...

  3. iOS多线程 GCD

    iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main que ...

  4. 算法导论:Trie字典树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  5. Junit单元测试学习笔记二

    我们使用Eclipse自动生成了一个测试框架,在这篇文章中,我们来仔细分析一下这个测试框架中的每一个细节,知其然更要知其所以然,才能更加熟练地应用JUnit4. 一.     包含必要地Package ...

  6. [iOS问题归总]SourceTree+osChina版本管理出现的问题

    1.commit失败(1) 解决办法: 把爆红的路径的文件删除掉, 重新commit 2. push时候, 有100MB限制 解决办法: Git只允许上传最大100MB的文件,如果超过,则会被serv ...

  7. Hibernate常见错误整理

    Hibernate常见错误合集   1.错误:object references an unsaved transient instance - save the transient instance ...

  8. 纯js实现瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...

  9. 生成n对括号的所有合法排列

    实例 n = 3,所有的合法序列 ((()))  (()()) (())() ()(()) ()()() 思路 针对一个长度为2n的合法排列,第1到2n个位置都满足如下规则 左括号的个数≥右括号的个数 ...

  10. framwork NHibernate

    NHibernate 一.NHibernate 1.HQL  curd语句总结 . 查询整个映射对象所有字段 ? //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String ...