• Java基础——String


    前言

      从去年八月末开始工作一年了,有了大半年的java开发经验,自认为比在大学时期编码能强了很多,但是基础方面概念模糊的地方感觉越来越多了 (;´д`)ゞ

    所以,我准备把这些问题以及工作中遇到的问题总结,记录下来,造福自己和大家~ヾ(o・ω・)ノ   当然,如果大家发现我哪里写的有错误,欢迎在下方评论指出来。

    那我们开始吧!

    String

      1.String是一个final类,不能被继承

      2.String底层维护是一个数组,静态创造一个字符串时,此字符串存在于String池,当下一个String对象也是静态创建的时候,先去String池里找是否有和新对象一样的,

    如果有,指向新对象,否则创建新对象。

      下面内容引用 https://blog.csdn.net/weixin_38722500/article/details/81134952 以解释第二条

      (1)

    1 String str1 = "abc"; 
    2 System.out.println(str1 == "abc"); 

      步骤:

      1)栈中开辟一块空间存放引用str1

      2)String池中开辟一块空间,存放String常量"abc"

      3)引用str1指向池中String常量"abc"

      4)str1所指代地址即常量"abc"所在地址,输出为true

      (2)

    1 String str2 = new String("abc"); 
    2 System.out.println(str2 == "abc"); 

      步骤:

      1)栈中开辟一块空间存放引用str2

      2)堆中开辟一块空间存放一个新建的String对象"abc" 

      3)引用str2指向堆中的新建的String对象"abc" 

      4)str2所指代地址即常量"abc"所在地址,而常量"abc"地址在池中,输出为false 

      (3)

    1 String str3 = new String("abc"); 
    2 System.out.println(str3 == str2); 

      步骤:

      1)栈中开辟一块空间存放引用str3

      2)堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象

      3)引用str3指向另外新建的那个String对象 

      4)str3和str2指向堆中不同的String对象,地址也不相同,输出为false 

      (4)

    1 String str4 = "a" + "b"; 
    2 System.out.println(str4 == "ab"); 

      步骤:

      1)栈中开辟一块空间存放引用str3

      2)根据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"ab" 

      3)引用str4指向池中常量"ab"

      4)str4所指即池中常量"ab",输出为true 

      (5)

    1 final String s = "a"; 
    2 String str5 = s + "b"; 
    3 System.out.println(str5 == "ab"); 

      同(4)

      (6)

    1 String s1 = "a"; 
    2 String s2 = "b"; 
    3 String str6 = s1 + s2; 
    4 System.out.println(str6 == "ab"); 

      步骤:

      1)栈中开辟一块空间存放引用s1,s1指向池中String常量"a"

      2)栈中开辟一块空间存放引用s2,s2指向池中String常量"b"

      3)栈中开辟一块空间存放引用str5

      4)s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象

      5)  引用str6指向堆中(s1 + s2)所还原的新String对象

      6)  str6指向的对象在堆中,而常量"ab"在池中,输出为false 

      (7)

    1 String str7 = "abc".substring(0, 2); 

      步骤:

      1)栈中开辟一块空间存放str7

      2)substring()方法还原一个新的String对象"ab"(不同于str6所指),堆中开辟一块空间存放此对象

      3)引用str7指向堆中的新String对象

         (8)

    1  String str8 = "abc".toUpperCase(); 

      步骤:

      1)栈中开辟一块空间存放str8

      2)toUpperCase()方法还原一个新的String对象"ABC",池中并未开辟新的空间存放String常量"ABC" 

      3)引用str8指向堆中的新String对象

      

      呼,这部分终于结束了,我们继续(ง •̀_•́)ง 

      3.几个常用方法:

     1 //1.charAt()方法:根据下标返回对应字符
     2 char c = str.charAt(2);
     3 System.out.println(c);
     4 
     5 //2.substring()方法:截取字符串
     6 1<=string<4  (左边包含右边不包含)
     7 String s = "abcde";
     8 String s1= s.substring(1,4);
     9 System.out.println(s1);
    10 
    11 //3.toUpperCase():变大写 toLowerCase():变小写
    12 String s = "aBc";
    13 System.out.println(s.toUpperCase());
    14 System.out.println(s.toLowerCase());
    15 
    16 //4.trim():去除字符串两边空格
    17 String s1 = "   abcde             ";
    18 String s2 = s1.trim();
    19 System.out.println(s2.length);
    20 System.out.println(s1.length);
    21 System.out.println(s1.charAt(0));
    22 
    23 //5.indexOf():搜索指定字符串,如果能找到返回起始下标,
    24 //找不到返回-1 , 不可以隔着查  如搜索bd  会返回-1
    25 String s = "abcde";
    26 int a = s.indexOf("bc");
    27 System.out.println(a);
    28          
    29 //6.startsWith():判断是否以某字符串开头
    30 //endsWith():判断是否以某字符串结尾
    31 String s = "abcde";
    32 boolean a = s.startsWith("ab");
    33 boolean b = s.endsWith("de");
    34 System.out.println(a);
    35 System.out.println(b);
    36 
    37 //7.字符串有两种创建方法
    38 //字面值赋值:字符串使用频率 太高,java对String做了优化   
    39 //建议这样:
    40 Sting s1 = "abc";
    41 //不建议new关键字创建:
    42 String s2 = new String("abc");
    43          
    44 //8.判断字符串相等的方法
    45 boolean boo = s1.equals(s2);
    46 System.out.println(boo);
    47          
    48 //9. = , == , equald的区别:         
    49 //   =  :赋值
    50 //   == :比较对象是否相同
    51 //   equals :比较两个对象内容是否相同 

      4.String ,StringBuffer 以及 StringBuilder区别:
       1)String长度不可以改变
       2)StringBuffer和StringBuilder长度可以改变
       3)StringBuffer线程安全,执行效率低
       4)StringBuilder线程不安全,执行效率高

     好了! 以上就是目前我在String方面概念模糊的地方了!希望能够帮到大家!
     我们下期再见!

     

  • 相关阅读:
    Java路径问题终于解决方式—可定位全部资源的相对路径寻址
    易学设计模式看书笔记(2)
    js算法:分治法-棋盘覆盖
    [NIO]dawn之Task具体解释
    C#高级编程五十八天----并行集合
    [Swift通天遁地]九、拔剑吧-(12)创建Preview-Transition图像预览界面
    [Swift通天遁地]九、拔剑吧-(11)创建强大的Pinterest风格的瀑布流界面
    [Swift通天遁地]九、拔剑吧-(10)快速创建美观的聊天界面:可发送文字、表情、图片
    [Swift通天遁地]九、拔剑吧-(9)创建支持缩放、移动、裁切的相机视图控制器
    [Swift通天遁地]九、拔剑吧-(8)创建气泡式页面切换效果
  • 原文地址:https://www.cnblogs.com/guojia314/p/9582014.html
Copyright © 2020-2023  润新知