Java之String类

来源:互联网 发布:java redis 连接池 编辑:程序博客网 时间:2024/05/17 03:30

   一直觉得string就是一个字符串啦,有什么好学的,在仔细研究了一下之后才发现自己一点都不了解String。

在文章的开始呢首先给大家推荐一个博客:

http://www.cnblogs.com/ITtangtang/p/3976820.html

大神写的很仔细,很深入,很值得阅读,我呢就在这里班门弄斧啦。


1.首先呢我们看一下String类是怎么创建的吧

在Java中String被当做对象来处理

     String str1=“hello”;

     String str2=new String();//创建一个空的字符串对象

     String str3=new String(“Hello”);

2.字符串的不变性

     字符串在创建后就不能改变了,不是说值不能改了,只是修改值的本质是创建了一个新的对象,所指向的内存    空间是不一样的。我们举个例子:

String str1=“hello ”;

        str1=str1+“world”;

   这个操作呢,不是我们想的在str1后面加一个就“world”就好了,而是又另找了一个位置,新创建一个对象指向“hello world”,原来的内存区域的“hello”就在某个垃圾回收周期被系统给回收啦,这也就是我们所说的String的不变性。

3.String常用方法

int length()//返回当前字符串的长度

int indexOf(char ch)//返回字符ch在字符串中第一次出现的位置

int indexOf(String str)//返回子串str在该字符串中第一次出现的位置

int lastIndexOf(char ch)//返回字符ch在该字符串中最后一次出现的位置

int lastIndexOf(String str)//返回子串str在该字符串中最后一次出现的位置

String substring(int beginIndex)//获取从beginIndex到字符串结尾的子串

String sunstring(int beginIndex,int endIndex)//获取从beginIndex到endIndex的子串

String strim()//返回除去前后空格的字符串

Boolean equals(Object obj)//将该字符串与指定对象比较

String toLowerCase()//转换为小写字母

String toUpperCase()//转换为大写字母

char charAt(int index)//返回指定位置的字符

byte[] getByte()//将字符串转换为byte数组

Sring split(String regec,int limit)//将字符串分割为子字符串,返回字符串数组

我们再看一下这些方法具体怎么用吧,很简单的,跟我们创建一个类的对象,然后调用这个类的方法是一样一样的,我们在例子中看一下吧

String str1=new String("HELLO WORLD!");//创建一个字符串对象System.out.println("str1的长度是:"+str1.length());System.out.println("!第一次出现的位置是:"+str1.indexOf('!'));//如果没有找到的话就返回-1,还有就是位置是从0开始编号的
是不是很简单,也很好用呀,还有一点需要注意,在使用substring方法的时候我们要清楚,获取的范围是从beginIndex到endIndex,但是endIndex位置上的字符是不包括在内的。

4.比较两个字符串是否相等
    说到判断两个字符串是否相等,不知道你是怎么想的,反正我第一反应就是用“==”啦,但是还真不能就这么随随便便的使用这个方法。

    用“==”比较两个字符串,比较的是两个字符串对象在内存中的首地址是否相同,即是否是同一字符串,如果是的话就返回“true”,否则返回“false”。所以两个字符串的内容相同返回的不一定是true。

    还有一个方法就是equal方法,这个方法才是真正来比较两个字符串的内容的,内容相等就返回“true”,否则返回“false”。

    我们知道,使用new创建的两个字符串对象肯定是指向不同的内存区域,那“==”有什么用呢,我们还是在例子中解释一下吧。

String str1="hello";String str2="hello";//str1和str2都是常量,保存在字符串常量池中,而且共享一个对象String str3=new String("hello");System.out.println("str1==str2为:"+str1==str2);//trueSystem.out.println("str1.equal(str3)为:"+str1.equal(str3));//true;System.out.println("str1==str3为:"+str1==str3);//false


还有就是String str2=str1,以这种形式创建str2时,str2和str1指向的地址是一样的。

5.StringBuilder类和StringBuffer类

    首先我们说一下这两个类和String的关系吧,也没什么关系,都是平等的地位,用于处理字符串的。我们在之前说过,String对象具有不变性,对其进行改变时就会创建新的对象,有时需要创建一些临时对象,这样做在一般情况下没什么问题,但是如果对字符串的操作比较频繁时可能需要创建大量的临时对象,这可能就要出问题啦,这个时候StringBuilder类和StringBuffer类就派上用场啦。

那StringBuilder类和StringBuffer类有什么区别呢?

他们基本相似,不同之处就是,StringBuffer是线程安全的,StringBuilder没有实现线程安全功能,所以性能略高。

StringBuilder类还提供了一些方法哦

StringBuilder append(参数)//追加内容到字符串后面

StringBuilder insert(位置,参数)//在指定位置插入内容

String toString()//把StringBuilder转换为String对象

int length()

6.基本数据类型和String之间的转换

基本数据类型转换为字符串的三种方法:

(1)使用包装类的toString()方法

(2)使用String类的valueOf()方法

(3)用一个空字符串加上基本数据类型,结构就是基本数据类型对应的字符串类型

字符串类型转换为基本数据类型:

(1)调用包装类的parseXxx方法

(2)调用包装类的valueOf方法转换为基本类型的包装类,会自动拆箱。

例:

String str=“1”

int a=Integer.parseInt(str);//方法1

int b=Integer.valueOf(str);//方法2

 

顺便再说一下基本类型和包装类型之间的转换

int i=1;

Integer x=new Integer(i);//手动装箱

Integer y=i;//自动装箱

 

int m=x.intValue();//手动拆箱

int n=x;//自动拆箱

其他的大致都是一样的,就不一一赘述了


 

好了,我说的就是这些了,欢迎大家指正!


最后的最后再附一个大神写的关于JVM的链接

http://blog.csdn.net/ithomer/article/details/9936743