zoukankan      html  css  js  c++  java
  • 第十三章:字符串 《Thinking in java》学习笔记

      正如书中开头所说:字符串操作是计算机程序中最常见的行为;尤其是再java大展拳脚的web系统中更是如此,下面就java的字符串的特性,个人做下总结吧,有错误的地方希望有人能提出,我一定会及时更正。

      学过编程的都会知道,字符串是常量中的一种,然而java中的String不仅仅是常量,又是类,是一个特殊的类,是不可变和最终类;

    1,不可变的String;说到不可变性,就要说java中String的内存分配了,如下图

      当运行代码:

            String str = "abc";

    时,内存分布为

      

      这时候看起来和一个int a = 26;很相似了,StringPool是常量池里面用来存放字符串常量的地方,里面的值不可修改

    而如果代码是这样写的:

      String str = new String("abc");

    运行时,内存为:

      

    理解了上面的内存分布情况后,就不难理解String的不变性了,java中程序员不能重载操作符,用于String的“+”和“+=”是java中仅有的两个重载过的操作符;

    比如如下代码:

      String str1 = "abc";

      String str2 = str1 + "def";

    运行到第二行代码时,实际上JVM又一次帮助我们做了一些工作:

      

    1 public class MyString {
    2 public static void main(String[] args){
    3 String str1 = "abc";
    4 StringBuilder temp = new StringBuilder("abc");
    5 temp.append("def");
    6 String str2 = temp.toString();
    7 }
    8 }

    内存分配如下:

    而其中J2SE5.0之后才使用了StringBuilder,之前是使用的StringBuffer,

    二者使用起来没有什么区别,StringBuffer是线程安全的,速度慢些;StringBuilder是线程不安全的,但是速度快些;

    2,String是最终类,不能有子类,这一点可以通过API文档看出:

    public final class String extends Object implements Serializable, Comparable<String>, CharSequence{
    ....
    }
    ps: 天气真冷,手敲键盘都哆嗦,干脆就画画内存图来说明了,没有用什么代码来证明,再说大家日常编码中不会一日无String,所以也不需要我写多少字符串的代码了;
    还有,本章书中还介绍了一个重要的部分--《正则表达式》,这部分我自己也不是很熟悉,知道些而已,具体底层的实现我也不清楚,等日后补上吧。
  • 相关阅读:
    Unity3D启动时卡在Loading界面
    unity触发器碰撞调用OnTriggerStay()检查按键多次执行的问题
    Unity使用Destroy删除物体的问题
    Unity脚本设置场景环境光,实现白天晚上切换
    unity隐藏显示物体
    unity使用Vuplex的WebView嵌入网页,打包后报错进不去
    【Python】输入两个字符串,在第一字符串中删除第二个字符串中所包含的所有字符
    用until编写一段shell程序,计算1~10的平方
    用until编写一段shell程序,计算1~10的平方和
    PrismJS,一款漂亮的代码高亮工具
  • 原文地址:https://www.cnblogs.com/silence250627170/p/2300666.html
Copyright © 2011-2022 走看看