• String和StringBuffer的区别


    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");  //false
    7         System.out.println(s3=="ab");  //true
    8     }
    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 1
    10 Point 2
    11 Point 3
    12 Performing cleanup
    13 Initialization that requires cleanup
    14 Point 1
    15 Point 2
    16 Point 3
    17 End
    18 Performing cleanup

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

  • 相关阅读:
    HZNU1015: 矩阵排序
    The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemK:K-Nice
    The 6th Zhejiang Provincial Collegiate Programming Contest->Problem I:A Stack or A Queue?
    The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemF:80ers' Memory
    The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemB:Light Bulb
    The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemA:Second-price Auction
    The 5th Zhejiang Provincial Collegiate Programming Contest------ProblemK:Kinds of Fuwas
    The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemG:Give Me the Number
    The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemF:Faster, Higher, Stronger
    The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemE:Easy Task
  • 原文地址:https://www.cnblogs.com/dazuihou/p/3574246.html
Copyright © 2020-2023  润新知