整理一下才发现关于String 的问题还真不少,出了之前说过的toString()、valueOf()、.equals()之外,还有下面这些。
1、字符串发转,我们可以有两种方法实现字符串的反转,一种是利用字符串存储字符数据的原理,取出它的char(st.charAt(i))值,也可以用string.toCharArray方法将字符串转化成char数组,重新排列并保存。另一种是生成StringBuffer对象,利用StringBuffer的reverse方法。
这里又要提到String和StringBuffer的区别。这个不说也罢。不过,还有一种类型是StringBuilder,它与StringBuffer功能相似,只不过,StringBuilder线程是安全的,所以如果拼接字符串可能会涉及到线程安全问题时,应该使用StringBuilder。
2.,String是按照平台默认的字符串进行String对象的创建的。如果有特殊字符集设定的需求时,可以用String的带字符参数构造方法来创建,该方法包含两个参数,一个时byte数组,一个是字符集编码的字符串形式。比如:String a =new String("中国","GBK")。
3、还有一个问题是字符串对象池,前面有谈到==和.equals方法的区别。如果我们明白了字符串对象池的概念,那么之前的问题也就迎刃而解了。
从java5.0开始,java虚拟机在启动时会实例化9个对象池,分别用来存储8中基本类型的包装类对象和String对象。
我们先来看一下这个问题:
String str1="1111";
String str2=new String("1111");
这两种创建方法的区别就在于前者是在对象池中取对象,后者是直接生成新的对象。当在程序中使用到双引号引起来一个字符串时,JVM就回到String的对象池中检查是否有一个值相同的对象。如果有,就取现成的,没有就在对象池中创建,并返回其应用。
所以 如果String str3=“1111”,那么很明显,str1和str3是同一个对象,它们都是直接从对象池中取得的。其他封装类的对象池与类似,工作原理是一样的。
OK,就先这么多吧,以后遇到再整理啦~~~~~~