A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 鸭梨的生活 中级黑马   /  2014-5-17 18:24  /  1729 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不明白。。。。。。。。。。。。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!欢迎继续来论坛学习~

查看全部评分

8 个回复

倒序浏览
在java中有3个类来负责字符的操作。 1.Character 是进行单个字符操作的, 2.String 对一串字符进行操作。不可变类。 3.StringBuffer 也是对一串字符进行操作,但是可变类。 String: 是对象不是原始类型. 为不可变对象,一旦被创建,就不能修改它的值. 对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. String 是final类,即不能被继承. StringBuffer: 是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 它只能通过构造函数来建立, StringBuffer sb = new StringBuffer(); note:不能通过付值符号对他进行付值.  sb = "welcome to here!";//error 对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer 中付值的时候可以通过它的append方法. sb.append("hello"); 字符串连接操作中StringBuffer的效率要比String高: String str = new String("welcome to "); str += "here"; 的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后 再将StringBuffer toSting(); 这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣. 并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值. 这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.  看看以下代码: 将26个英文字母重复加了5000次,         String tempstr = "abcdefghijklmnopqrstuvwxyz";         int times = 5000;         long lstart1 = System.currentTimeMillis();         String str = "";         for (int i = 0; i < times; i++) {             str += tempstr;         }         long lend1 = System.currentTimeMillis();         long time = (lend1 - lstart1);         System.out.println(time); 可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。 也就是46秒。 我们再看看以下代码         String tempstr = "abcdefghijklmnopqrstuvwxyz";         int times = 5000;         long lstart2 = System.currentTimeMillis();         StringBuffer sb = new StringBuffer();         for (int i = 0; i < times; i++) {             sb.append(tempstr);         }         long lend2 = System.currentTimeMillis();         long time2 = (lend2 - lstart2);         System.out.println(time2); 得到的结果为 16 有时还是 0 所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。   根据上面所说: str += "here"; 的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后 再将StringBuffer toSting(); 所以str += "here";可以等同于 StringBuffer sb = new StringBuffer(str); sb.append("here"); str = sb.toString(); 所以上面直接利用"+"来连接String的代码可以基本等同于以下代码         String tempstr = "abcdefghijklmnopqrstuvwxyz";         int times = 5000;         long lstart2 = System.currentTimeMillis();         String str = "";         for (int i = 0; i < times; i++) {             StringBuffer sb = new StringBuffer(str);             sb.append(tempstr);             str = sb.toString();         }         long lend2 = System.currentTimeMillis();         long time2 = (lend2 - lstart2);         System.out.println(time2); 平均执行时间为46922左右,也就是46秒。   总结: 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高

点评

同学,下次记得把答案格式整理清楚哦。  发表于 2014-5-18 11:33
回复 使用道具 举报
哈哈。。。。。。。。。。。。。。。
回复 使用道具 举报
嘿嘿。。。。。。。。。。一起学习
回复 使用道具 举报
* String类适用于描述字符串事物:
* 那么他那提供了多个方法,对字符串进行操作。
*
* 常见操作有哪些呢?
1. 获取
*                 1.1        字符串中包含的字符数,也就是字符串的长度?
*                         int length();获取长度
*                 1.2 根据位置获取位置上某个字符?
*                         char charAt(int index);
*                 1.3 根据字符获取该字符在字符串中的位置。
*                         int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。
*                         int indexOf(int ch, int formIndex); 从formIndex指定位置开始,获取ch在字符串中的位置。
*                
*                         int indexOf(String str);返回的是str在字符串中第一次出现的位置。
*                         int indexOf(String str, int formIndex);从formIndex指定位置开始,获取str在字符串中出现的位置。
*
*                         int lastIndexOf(int ch);
*
* 2. 判断
*                 2.1 字符串中是否包含某一个字符串?
*                         boolean contains(str);
*                         特殊之处:indexOf(str):可以索引str第一次出现的位置,如果返回-1。
*                         表示该str不在字符串中存在,所以也可以用于对指定判断是否包含。
*
*                         if(str.indexOf("aa")!=-1)
*                         该方法即可以判断,又可以获取出现的位置
*
*                 2.2 字符串中是否有内容?
*                         boolean isEmpty();原理就是判断长度是否为0
*
*                 2.3 字符串是否以指定内容开头?
*                         boolean startswith(str);
*
*                 2.4 字符串是否以指定内容结尾?
*                         boolean endswith(str);
*
*                 2.5 判断字符串的内容是否相同?复写了Object类中的equals方法
*                         boolean equlas(str);
*
*                 2.6 判断内容是否相同,并忽略大小写?
*                         boolean equalsIgnoreCase();
*                        
*
*                
*                        
*/


StringBuffer(是一个容器)
* 特点:-------------------------
* 1,长度是可以变化的。
* 2,可以操作多个数据类型。。、
* 3,最终会通过toString方法变成字符串
* 1, 存储
*                 StringBuffer append();将指定数据作为参数添加到已有数据结尾处。
*                 StringBuffer insert(index,数据);可以将数据插入到指定index位置
*
* 2, 删除。
*                 StringBuffer delete(start,end);删除缓冲区中的数据,包含start,不包含end
*                 StringBuffer deleteCharAt(index);删除指定位置的字符。
*
* 3,获取。
*                 char charAt(int index);//查单个字符
*                 int indexOf(String str);//查多个字符
*                 int lastIndexOf(String str);//从后往前查
*                 int length();
*                 String substring(int start,int end);//获取从指定位置开始到结尾处之前的字符
*
* 4,修改。
*                 StringBuffer replace(start,end,String);
*                 void setCharAt(int index, char ch);
*
* 5,反转.
*                 StringBuffer reverse();
*
* 6,将指定缓冲区数据,存储到指定数组中。
*                 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);               
*
* JDK1.5版本之后出现了StringBuilder
* ---------------------
* StringBuffer是线程同步。
* StringBuilder是线程不同步。
* -------------------
* 以后开发建议使用StringBuilder

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我觉得你想问的应该是String和StringBuffer的区别吧,String的话,是一个字符串一旦被定义之后他的值就不能再被改变,而String
回复 使用道具 举报
ID1003 中级黑马 2014-5-17 20:10:27
7#
而StringBuffer的值是可以改变的,所以在以后通过定义一个字符串来接收其他字符串的时候就要定义StringBuffer而不是String了。
回复 使用道具 举报
墨香 中级黑马 2014-5-17 22:40:44
8#
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做
在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马