• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
鱼要的是海洋,鸟要的是天空,我要的是自由!
平凡的人不平凡的人生
博客园    首页    新随笔    联系   管理    订阅  订阅

String和StringBuilder

在看李建忠老师的Proxy代理模式课程的时候,听他讲了一些有关String类型和StringBuilder类型的内容。对这两个类型的实现有了一些新的认识。

在以前我看过一些有关String类型的资料,对于String类型来说,它给我的印象是小心的去用,否则内存上会产生大量的垃圾。关键问题在于对String对象的修改方面。

当我们实例化一个String的对象后,在内存中为此对象分配一个空间。如下:

       String strtest = “aa”;

当我们修改strtest的值的时候,如:strtest = “bb”;此时,系统会为strtest重新分配一个空间。这样原来的内存空间就被浪费掉了,只能等待垃圾回收器回收。在我平时的工作中发现一些代码中频繁的修改String对象的值,如:

String strSQL = “Select ....”;

strSql += “...”;

strSql += “...”;

strSql += “...”;

...

实际上这样是十分浪费内存空间的。如果是频繁的这样做的话,建议是使用StringBuilder对象,但是如果频繁累加字符串的次数不是很多的时候实际上用StringBuilder会适得其反,我觉得种情况可以这样写:

String strSQL = “Select ....” + “...” + “...” + “...” + ...;

这样相对性能会好一些。

这次李建忠老师讲解了一下copy-to-write技术。对于两个String类型的变量来说,如下

String str1 = “aa”;

String str2 = “aa”;

当这两个String类型变量的值相同时,实际上他们指向的是同一个内存空间,如下图:


   对于
StringBuilder对象来说是这样的,如:有两个StringBuilder对象

       StringBuilder sb1 = new StringBuilder(“aa”)

       StringBuilder sb2 = new StringBuilder(“aa”)

他们在内存中的状态如下图:
   

当sb2变化时,只是修改sb2中指向的位置。如下图

posted @ 2006-10-18 11:41  伊凡  阅读(452)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3