zoukankan      html  css  js  c++  java
  • java中你不知道的字符串知识!!!

    声明:这是上次写完String和StringBuffer后的补充(看上次的请复制链接在搜索栏粘贴访问)

    链接:http://www.cnblogs.com/ytsbk/p/7420581.html

    一、String、StringBuffer、StringBuilder三者的区别

    1.消耗内存

    a.当只进行一次简单的声明并不怎么用到的时候:

    例如:

    String s = "abc";//String s = new String("abc");
    StringBuffer sBuffer = new StringBuffer("abc");
    StringBuilder sBuilder = new StringBuilder("abc")

    结论a:String比起StringBuffer和StringBuilder看起来舒服,三者使用的内存也大致相同。

    b.当对一个字符串进行反复更改时:

    例如:

    public static void main(String[] args) {
            String s = null;
            double startTime = System.currentTimeMillis();
            for (int i = 0; i < 10000; i++) {
                for (int j = 0; j < 10; j++) {
                    s = s + "哈"; 
                }
            }
            double endTime = System.currentTimeMillis();
            System.out.println("String所用时间"+(endTime-startTime));
        }

    运行图:

    public static void main(String[] args) {
            StringBuffer sBuffer = new StringBuffer("a");
            double startTime = System.currentTimeMillis();
            for (int i = 0; i < 10000; i++) {
                for (int j = 0; j < 10; j++) {
                    sBuffer.append("哈");
                }
            }
            double endTime = System.currentTimeMillis();
            System.out.println("StringBuffer所用时间"+(endTime-startTime));
        }

    运行图:

    public static void main(String[] args) {
            StringBuilder sBuilder = new StringBuilder("a");
            double startTime = System.currentTimeMillis();
            for (int i = 0; i < 10000; i++) {
                for (int j = 0; j < 10; j++) {
                    sBuilder.append("哈");
                }
            }
            double endTime = System.currentTimeMillis();
            System.out.println("StringBuilder所用时间"+(endTime-startTime));
        }

    运行图:

    结论b:可以看出若进行多次操作时消耗的时间:String >>> StringBuilder>StringBuffer,可以知道他们三个在内存中所占用的空间也是相同的排序。

    2.线程安全与否

    结论:可以看到只有StringBuffer是线程安全的,String和StringBuilder是线程不安全的,从这里也可以看出StringBuilder比StringBuffer在一定情况下相对快的原因;

    所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,使用StringBuilder。

    二、第一眼看可能会出错的面试题!

    1.请看下面程序运行的结果

    StringBuffer sb = new StringBuffer("abc");
    StringBuffer sb1 = new StringBuffer("abc");
    System.out.println(sb);
    System.out.println(sb1);
    System.out.println(sb.equals(sb1));
    System.out.println(sb == sb1);

    请认真思考一下:记下自己的答案!!!往下看结果 

     运行图:

    有没有答对?

    小伙伴说 :“==”比较的是地址,两个不一样可以理解,但是为啥.equals()方法比较也是错的呢,不是说.equals()是比较内容的吗?

    其实这个是因为.equals()方法本来是Object类的方法,只是String类继承下来并把他重写了(下面有截图),但是StringBuffer他只继承但并没有重写

    而Object中的.equals()方法就是和“==”一样的!!!所以StringBuffer使用.equals和使用“==”是一样的,都是比较的首地址。

    String:

     Object:

    请接着看第二题↓

    2.请问程序运行的结果

    StringBuffer sb = new StringBuffer("abc");
    StringBuffer sb1 = sb.append("abc");
    System.out.println(sb1 == sb);
    System.out.println(sb1.equals(sb)); System.out.println(sb); System.out.println(sb1);

    请认真思考一下:记下自己的答案!!!往下看结果 

     

     

      

    运行结果:

    哈哈哈☺☺☺!有没有答对呢?

    原因就是append()方法会直接在堆内存的字符串上添加新的字符串,而栈内存中的引用一直都指的是原来的空间首地址;

    两个的引用都指向sb字符串的首地址。至于equal和“= =”还是上一个题的解释! 

    最后:写在这里是想把自己所学的分享给大家,方便大家学习,同时也有助于自己记忆,如果有哪里不对的恳请指正!祝大家身体健康,工作顺利!

  • 相关阅读:
    CSRF和XSS的区别
    xss攻击与防范
    GAN基础
    (转载)深度学习数据集
    Python问题解决记录
    Spark Mllib源码分析
    Spark MLlib框架详解
    Spark Structured Streaming框架(5)之进程管理
    Spark Structured Streaming框架(4)之窗口管理详解
    Spark Structured Streaming框架(3)之数据输出源详解
  • 原文地址:https://www.cnblogs.com/ytsbk/p/8676761.html
Copyright © 2011-2022 走看看