• String的点点滴滴


    一、String 的 equals()到底比较的是什么?equals() 与 == 的区别? 

    当使用关系运算符==比较两个对象时,是比较两个对象使用的内存地址和内容是否相同,如果两个对象使用的是同一个内存地址,并且内容相同,则结果为true,否则结果为false

           当使用对象的equals( )方法比较两个对象时,是比较两个对象的内容是否相同。而与对象的内存地址无关,如果两个对象的内容相同,则结果为true,否则结果为false
     
    例如:
      String str1 = new String("hello"); 
      String str2 = new String("hello");
      String str3 = str2;
    图解:
     
    代码:
     1 public class CompareObjectDemo {
     2      public static void main(String[] args) {
     3           String str1 = new String("hello");
     4           String str2 = new String("hello");
     5           String str3 = str2;
     6          //用==比较
     7          System.out.println("str1 == str2的比较结果为:
    	" + (str1 == str2));
     8         System.out.println("str2 == str3的比较结果为:
    	" + (str2 == str3));
     9        //用equals比较
    10        System.out.println("str1.equals(str2)的比较结果为:
    	" +str1.equals(str2));
    11        System.out.println("str2.equals(str3)的比较结果为:
    	" +str2.equals(str3));
    12      }
    13 }        
    结果:
     
    注意:在Java中,如果将同一个字符串常量赋值给多个字符串变量来创建字符串对象,则这些字符串对象具有相同的地址,因为同一个字符串常量在内存中的地址是不变的,所以多个对象共用同一个内存地址
     
    又如:
     
    String str1 = "hello";
    String str2 = "hello";
    String str3 = str2;
    图解:
     
    代码:
     1 public class CompareObjectDemo {
     2      public static void main(String[] args) {
     3           String str1 = "hello";
     4           String str2 = "hello";
     5           String str3 =str2;
     6  
     7           //用==比较
     8           System.out.println("str1 == str2的比较结果为:
    	" + (str1 == str2));
     9           System.out.println("str2 == str3的比较结果为:
    	" + (str2 == str3));
    10          //用equals比较
    11          System.out.println("str1.equals(str2)的比较结果为:
    	" +str1.equals(str2));
    12          System.out.println("str2.equals(str3)的比较结果为:
    	" +str2.equals(str3));
    13      }
    14 }    
    结果为:
     
     
     
    二、String、StringBuffer、StringBuilder 它们的不同之处
    (1)效率: String < StringBuffer < StringBuilder .
    为什么?有没有想过?
    每次改变String 的值, 底层重新创建了一个新的String对象,如:String str = ""; Str +="xpw"; Str +="yuanmeng"; 前面对str 进行了两次叠加,也创建了两个String对象,并不是简单同一个String对象。所以,不断地改变、string的值,会不断地创建对象,这肯定要耗时;另外,创建对象,也需要占用一定的内存吧,而且StringBuffer和StringBuilder 每次改变String值,不会重新创建新的对象,可以采用append(str)改变str值。所以有时在程序调优时,有必要采用Stringbuffer 或者 StringBuilder进行替换。
    那么,StringBuffer为什么效率上会比StringBuilder慢?读过源代码的同学,想必知道了吧,StringBuffer它是线性安全的,就是说它的底层相关方法有Synchronize修饰,在并发时,如果多个线程要访问共享变量,不能简单地同时访问,一旦有一个线程锁住当前对象,其它线程就必须等;而StringBuiler是非线性安全的,允许多个线程同时访问,所以在效率上,StringBuilder 》 StringBuffer。
     
    (2)StringBuffer:线性安全
     
       StringBuider:非线性安全
    注意:在并发时,要使用StringBuffer比较好,非并发,考虑到效率问题,尽量使用StringBuilder
     
    三、String 与 其它  基本类型数据的转换
     
     1 /**
     2      * String -> other  type
     3      */
     4     public static void testString2OtherType(){
     5         String s1 = "121";
     6         int parseInt = Integer.parseInt(s1);
     7         System.out.println(parseInt);
     8         
     9         String s2 = "12.1";
    10         double parseDouble = Double.parseDouble(s2);
    11         System.out.println(parseDouble);
    12         
    13         String s3 = "12.1f";
    14         float parseFloat = Float.parseFloat(s3);
    15         System.out.println(parseFloat);
    16         
    17         String s4 = "false";
    18         boolean parseBoolean = Boolean.parseBoolean(s4);
    19         System.out.println(parseBoolean);
    20         
    21         //或者使用如下也可
    22         Integer i = Integer.valueOf(s1);
    23         System.out.println(i);
    24         
    25         Double d = Double.valueOf(s2);
    26         System.out.println(d);
    27         
    28         //...
    29     }
    30     
    31     /**
    32      *  other  type --> String
    33      */
    34     public static void otherType2String(){
    35         int i = 38;
    36         String s1 = String.valueOf(i);
    37         System.out.println(s1);
    38         
    39         float f = 38.38f;
    40         String s2 = String.valueOf(f);
    41         System.out.println(s2);
    42         
    43         //...
    44     }

    四、[很好用] 字符串分割 split

     1     public static void main(String[] args) {
     2         String src = "hello world,I love you";
     3         StringDemo.testStringSplit(src);
     4     }    
     5 
     6         public static void testStringSplit(String src){
     7         
     8         String[] strArray = src.split("\W");//按照单词来划分,具体的正则表达式可以参考Pattern类,里面有详细介绍
     9         
    10         for(String s : strArray){
    11             System.out.println(s);
    12         }
    13     }

    结果

    hello
    world
    I
    love
    you
  • 相关阅读:
    STM32F103ZET6 PWM输出
    STM32F103ZET6串口通信
    STM32F103ZET6系统定时器SysTick
    STM32F103ZET6的基本定时器
    npm 安装vue cli脚手架报错 npm err code EEXIST 或者 npm err cb<> never called 解决方案
    Java调用第三方http接口的方式
    机器学习算法原理解析
    Spark MLlib 机器学习
    Spark SQL基本概念与基本用法
    HBase基本概念与基本使用
  • 原文地址:https://www.cnblogs.com/chenmo-xpw/p/3947368.html
Copyright © 2020-2023  润新知