博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
String和StringBuffer的区别
阅读量:5300 次
发布时间:2019-06-14

本文共 2836 字,大约阅读时间需要 9 分钟。

String和StringBuffer的区别

      String和StringBuffer都可以存储和操作字符串,即包含多个字符的字符数据。String类表示内容不可以改变的字符串。而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候就可以使用StringBuffer。你可以使用StringBuffer来动态构造字符数据。另外,String覆盖了equals方法(也覆盖了hashCode方法),new String("abc").equals(new String("abc"))的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer("abc").equals(new StringBuffer("abc"))的结果为false。

 

StringBuffer与StringBuilder的区别

  StringBuffer和StringBuilder类都可以表示内容可以修改的字符串,StringBuilder是线程不安全的,即不同步的,运行效率高,如果一个字符串变量是在方法里面定义的,这种情况只可能有一个线程访问他,不存在不安全的因素,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多个线程环境下使用,那么最好用StringBuffer。

 

如何把一段逗号分隔的字符串转换成一个数组?

  用split(String regex):根据给定正则表达式的匹配拆分此字符串,返回字符串数组。regex——定界正则表达式。

 

数组有没有length()这个方法?String有没有length()这个方法?

  数组没有length()这个方法,有length的属性。String有length()这个方法。

 

下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

  在得到答案之前,请看如下代码:

1 public class Demo{2     public static void main(String args[]){3         String s1="a";4         String s2=s1+"b";  //s2的引用指向了新创建的对象“ab”5         String s3="a"+"b"; //s3的引用指向常量池中的“ab”6         System.out.println(s2=="ab");  //false7         System.out.println(s3=="ab");  //true8     }9 }

  第六行打印的结果为false,第七行打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。

  题目中的代码被编译器在编译时优化后,相当于直接定义了一个“abcd”的字符串,所以,所以,上面的代码应该只创建了一个String对象。

String s="a"+"b"+"c"+"d";System.out.println(s=="abcd");  //true

 

try{}里面有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?

  虽然网上流传的答案是return前,我觉得应该在return后。首先finally{}中的代码肯定会被执行的。finally被用来清理工作,在Java中,需要清理的资源包括:已经打开的文件或网络连接,在屏幕上画的图形,甚至可以是外部世界的某个开关。

  引自Thinking in Java:

    在return中使用finally

    因为finally子句总是会执行的,所以在一个方法中,可以从多个点返回,并且可以保证重要的清理工作仍旧会执行:

1 public class MultipleReturns{ 2     public static void f(int i){ 3         System.out.println("Initialization that requires cleanup"); 4         try{ 5             System.out.println("Point 1"); 6             if(i==1) return;        7             System.out.println("Point 2"); 8             if(i==2) return; 9             System.out.println("Point 3");10             if(i==3) return;11             System.out.println("End");12             return;13         }finally{14             System.out.println("Performing cleanup");15         }16        }17         public static void main(String[] args){18             for(int i=1;i<=4;i++){19                  f(i);20             }21         }}

输出结果:

1 Initialization that requires cleanup 2 Point 1 3 Performing cleanup 4 Initialization that requires cleanup 5 Point 1 6 Point 2 7 Performing cleanup 8 Initialization that requires cleanup 9 Point 110 Point 211 Point 312 Performing cleanup13 Initialization that requires cleanup14 Point 115 Point 216 Point 317 End18 Performing cleanup

     所以,try{}里的return不是让函数马上结束返回,而是return语句执行后,将结果放置进函数栈中,此时函数并不是马上返回,而是要执行完finally语句后才真正返回。

 

转载于:https://www.cnblogs.com/dazuihou/p/3574246.html

你可能感兴趣的文章
闭包理解
查看>>
asp.net C#后台实现下载文件的几种方法(全)
查看>>
Web前端开发工程师的具备条件
查看>>
实用Android开发工具和资源精选
查看>>
TileMap
查看>>
JS属性大全
查看>>
java复制文件
查看>>
第一册:lesson seventy nine.
查看>>
GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
查看>>
团队作业
查看>>
数据持久化时的小bug
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>