JAVA——字符串String

来源:互联网 发布:日本对中国文化知乎 编辑:程序博客网 时间:2024/06/10 23:10

【1】Stirng

  • 要明确String不属于JAVA中的八大基本数据类型中的一种,而是一个特殊的类,而且创建的String对象是不可变的。通过查看JDK文档会发现几乎每一个修改String对象的操作,实际上都是创建了一个全新的String对象。
  • 由于字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,在Permanent Generation中专门有一块区域用来存储字符串常量池(一组指针指向Heap中的String对象的内存地址)。
    这里写图片描述

  • 在java中,一个对象变量并没有实际包含一个对象,而是仅仅引用一个对象。任何对象变量的值都是对存储在另外一个地方的一个对象的引用。

  • new操作符的返回值也是一个引用。如Date deadline = new Date();有两个部分。表达式new Date()创建了一个Date类型的实例对象,这个实例对象存储在对内存中的,并且它的返回值是对新创建对象的引用(从C语言讲,这个值就是Date类型的实例对象所在对内存的首地址[个人观点]),这个引用存储在变量deadline中(变量deadline存在占内存中)。
  • String类没有提供用于修改字符串本身的方法。

  • null,new String(),“ ”这三者的区别:

(1)java中,每个用双引号括起来的字符串都是String类的一个实例。

String str1 = "";string str2 = "hello";

(2)空串""是长度为0的字符串,如String实例对象str1。空串是一个java对象,有自己的长度(0)和内容(空)。有时候检查字符串是否为空:

if(str.length() == 0){}或if(str.equals("")){}

(3)String变量还可以存放一个特殊的值,就是null。即在初始化字符串对象之前,它的值为null。

String str3 = null;

此处显示的将对象的变量值设置为null,表明这个对象变量目前没有引用任何对象,即这个变量里没有储存任何对象的首地址。

不能在一个null值上调用方法:

birthday = null;String s = birthday.toString();//runtime error!

要检查一个字符串是否为空,要使用一下条件:

if (str == null){}

有时候要检查一个字符串既不是null也不是空串,这时就要使用以下条件:

if (str!=null && str.length()!=0){}

【2】字符串创建过程

【2-1】创建字符串对象的几种方法:

(1)通过字面量的形式:String str = “abc”;
(2)通过new方式:String str = new String(“abc”);
(3)字面量+字面量:String str = “aa” + “bb”;
(4)变量+字面量:String str1 = “aa”; String str2 = str1 + “bb”;

【2-2】关于创建String对象过程的内存分配

http://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html
http://blog.csdn.net/xiabing082/article/details/49759071

【3】字符串常量池(String Constant Pool)

  • 字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,在Permanent Generation中专门有一块区域用来存储字符串常量池(一组指针指向Heap中的String对象的内存地址)。

  • 每当创建一个字符串对象时,首先就会检查字符串池中是否存在面值相等的字符串,如果有,则不再创建,直接放回字符串池中对该对象的引用,若没有则创建然后放入到字符串池中并且返回新建对象的引用。这个机制是非常有用的,因为可以提高效率,减少了内存空间的占用。所以在使用字符串的过程中,推荐使用直接赋值(即String s=”aa”),除非有必要才会新建一个String对象(即String s = new String(”aa”))。

  • JVM内部细节之三:字符串及字符串常量池

  • java中的String类常量池详解

  • java字符串池和字符串堆内存分配

【4】不可变String对象

  • 所属包:java.lang.String; 注意:字符串中的单个字符的索引和数组元素的索引类似,都是从0开始。

  • String对象是不可以被改变的。查看jdk文档,可以发现,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String类对象,以包含修改后的字符串内容。而最初的String对象则丝毫不动。

    -子串:String类的substring()方法可以从一个较大的字符串提取一个子串。查看API文档,String类:
    这里写图片描述

  • 方法substring()支持重载,对于方法substring(int beginIndex),beginIndex表示从原字符串从索引第beginIndex开始,一直取到原字符串结束提取子串(包括第beginIndex个字符)。

String str = "hello";String substr = str.substring(3);//变量substr所引用的字符串对象是:lo
  • 对于方法substring(int beginIndex, int endInedx),表示该方法截取从beginIndex到endIndex-1之间的字符串(包括第beginIndex个字符,包括第endIndex-1个字符)。
String str = "hello";String substr = str.substring(1,3);//变量substr所引用的字符串对象是:el
  • 在前面提到,String类没有提供用于修改字符串本身的方法。字符串”hello”永远包含字符h,e,l,l,o的代码单元序列,不能修改其中的任何一个字符。
  • 如果想把str指向的内容修改为”help!”,就不能直接将str的最后两个位置的字符修改为‘p’和‘!’。因为,String对象是不可修改的。
String str = "hello";String substr = str.substring(0,3) + "p!";//变量substr所引用的字符串对象是:help!
String str = "hello";String STR = upcase(str);//print(str)时,打印出hello//print(STR)时,打印出HELLO
  • 当把str传给upcase()方法时,实际传递的是引用的一个拷贝。其实,每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在原来的物理位置上,一直没被动过。

  • 对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己的。

【4-1】为什么说Java的String对象是不可变的?

https://www.zhihu.com/question/20618891
http://blog.csdn.net/zhangjg_blog/article/details/18319521

【5】字符串的使用

【5-1】字符串比较

  • boolean equals(Object other)
    —–【String 中的equals方法】Compares this string to the specified object. 用于比较两个引用变量所指向的对象的内容是否相等(并不会比较连个引用变量相等),如果相等,返回ture。

  • boolean equalsIgnoreCase(Stirng other)
    —–Compares this String to another String, ignoring case considerations.如果字符串与other相等(忽略大小写),返回ture。

  • int compareTo(String other)
    —–按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0。Compares two strings lexicographically.

  • int compareToignoreCase(String other)
    —–比较方式与compareTo()一样,只是忽略大小写。Compares two strings lexicographically, ignoring case differences.

  • 更详细的equals方法,见 java提高篇(十二)—–equals()

【5-2】字符串查找

  • int indexOf(String str)
    —–返回与字符串str匹配的第一个子串的第一次出现的索引。这个位置从索引0开始计算。如果在原始中不存在str,返回-1。
  • int indexOf(Stirng str, int fromIndex)
    —返回与字符串str匹配的第一个子串的第一次出现的索引。这个位置从索引formIndex开始计算。如果在原始中不存在str,返回-1。
  • int indexOf(int ch)
    —–返回指定字符在字符串中第一次出现处的索引,这个位置从索引0开始计算。如果此字符串中没有这样的字符,则返回 -1。
  • int indexOf(int ch, int fromIndex)
    —–返回指定字符在字符串中第一次出现处的索引,这个位置从索引formIndex开始计算。如果在原始中不存在str,返回-1。
package he.qiang;import java.lang.String;public class StringTest {    public static void main(String[] args)     {        String str = "helloawllo";        System.out.println(str.indexOf("llo"));        System.out.println(str.indexOf("llo",3));        System.out.println(str.indexOf('l'));        System.out.println(str.indexOf('l',3));    }}

这里写图片描述

  • int lastIndexOf(String str)
  • int lastIndexOf(String str, int fromIndex)
  • int lastIndexOf(int ch)
  • int lastIndexOf(int ch, int fromIndex)
    —–返回与字符串str或指定字符匹配的最后一个子串的开始位置。这个位置从原始串尾端开始计算。
    —–fromIndex表示截取原字符串的前fromIndex个字符作为子字符串,再从这个子串里查找子串。
package he.qiang;import java.lang.String;public class StringTest {    public static void main(String[] args)     {        String str = "llohelloawlloasd";        System.out.println(str.lastIndexOf("llo"));        System.out.println(str.lastIndexOf("llo",7));        System.out.println(str.lastIndexOf('l'));        System.out.println(str.lastIndexOf('l',3));    }}

这里写图片描述

【5-3】字符串判别

  • boolean startsWith(String prefix)
    —–如果字符串以prefix字符串开始,返回true。
  • boolean endsWith(String suffix)
    —–如果字符串以suffix字符串结尾,返回true。
  • int length()
    —–返回字符串的长度。

【5-4】字符串截取与替换—–>返回一个新的字符串

  • String replace(CharSequence oldString, CharSequence newString)
    —–返回一个新的字符串。这个字符串用newString代替原始字符串中所有的oldString。可以用String或StringBuilder对象作为CharSequence参数。

  • String replace(char oldChar,char newChar)
    —–返回一个新的字符串,将原String对象中的字符oldChar替换成新的newChar后生成一个新的字符串。

  • String replaceAll(String regex,String replacement)
    —–用正则表达式实现对字符串的匹配。注意replaceAll第一个参数为正则表达式。

  • String substring(int beginIndex)

  • String substring(int beginIndex, int endIndex)
    —–返回一个新的字符串,这个字符串包含原始字符串中从beginIndex到串尾或endIndex-1的所有字符。

  • String toLowerCase()
    —–返回一个新的字符串。这个字符串将原始字符串中的所有大写字母改成了小写字母。

  • String toUpperCase()
    —–返回一个新的字符串。这个字符串将原始字符串中的所有小写字母改成了写写字母。

  • String trim()
    —–返回一个新的字符串,这个字符串将删除了原始字符串头部和尾部的空格。然而,不能删除字符串中间的空格。

1 0
原创粉丝点击