一直觉得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);//true
System.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