C# String与StringBuilder (转载)
1.什么时候用String?什么时候用StringBuilder?
字符串一旦创建就不可修改大小,所以对字符串添加或删除操作比较频繁的话。那就不要用String而用StringBuilder。
例如:
String a1 = "abc"; //分配固定的内存大小
a1+="def"; //销毁原先的数据再来分配,代价比较昂贵
StringBuilder sb = new StringBuilder(20); //指定分配大小
sb.Append('abc'); //分配到堆区
sb.Append('def'); //不会被销毁,而是直接追加到后面。
总结:上面的a1和sb在输出结果一样的。但是在内存分配上面来说就区别很大了。
2.String与StringBuilder的区别:
String申明之后在内存中大小是不可修改的,而StringBuilder可以自由扩展大小(String分配在栈区,StringBuilder分配在堆区)
1.String
String s1 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' });
2.StringBuilder
StringBuilder sb = new StringBuilder(5); //当指定分配大小之后,性能就会得到提升。如果超过指定大小系统会当前大小倍增,也就10,15,20。建议指定大小
sb.Append('china');
下面看一下在内存中如何分配的:如下图

3.知道它们是如何分配之后就可以很好的区别"==","Equals","Object.ReferenceEquals(obj1,obj2)"。它们的不同了。
1.在这==之前先讲一下:可能java程序员看到这里的时候会感觉有一点懵。在java中String类型它都是放在堆中的。而C#则不同,微软对String类型进先优化
2.微软在处理字符串的时候用到散列表:它是什么呢?简单理解就是当你创建了字符串"china"这个字符串的时候,当你再创建这个字符串的时候,编译器是不会再去开辟新的内存来存储的。它会直接指向第一次创建的地址。
3.看如下代码:
string s1 = "china";
string s2 = "china"; String s3 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' });
String s4 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' }); Console.WriteLine(s1 == s2); //True
Console.WriteLine(s1.Equals(s2)); //True
Console.WriteLine(Object.ReferenceEquals(s1, s2)); //True
Console.WriteLine("--------------------------"); Console.WriteLine(s3 == s4); //True 微软对它进行优化,String s1 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' });相当于string s1 = "china";所以上面s1 == s3就为True了。
Console.WriteLine(s3.Equals(s4)); //True
Console.WriteLine(Object.ReferenceEquals(s3, s4)); //False
Console.WriteLine("--------------------------"); Console.WriteLine(s1 == s3); //True
Console.WriteLine(s1.Equals(s3)); //True
Console.WriteLine(Object.ReferenceEquals(s1, s3)); //False
Console.WriteLine("---------StringBuilder-----------------"); StringBuilder sb1 = new StringBuilder("china");
StringBuilder sb2 = new StringBuilder("china");
Console.WriteLine(sb1 == sb2); //False
Console.WriteLine(sb1.Equals(sb2)); //True
Console.WriteLine(Object.ReferenceEquals(sb1, sb2)); //False
堆和栈分析图:

总结:
1.==它是比较的栈里面的值是否相等(值比较)
2.Equals它比较的是堆里面的值是否相等(引用地址值比较)
3.Object.ReferenceEquals(obj1,obj2)它是比较的是地址是否相等
关于本文第三点"==","Equals","Object.ReferenceEquals(obj1,obj2)"的比较,还可以参考下面这篇文章,我觉得本文第三点可能并不准确,这三个比较操作在string、String和StringBuilder上的差异,我感觉主要还是因为这三个类型重载了相关函数和==操作符而已:
C# ==、Equals、ReferenceEquals 区别与联系
C# String与StringBuilder (转载)的更多相关文章
- String, StringBuffer, StringBuilder(转载)
http://blog.csdn.net/rmn190/article/details/1492013 String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilde ...
- 探秘Java中的String、StringBuilder以及StringBuffer(转载)
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...
- 7.算法竞赛中的常用JAVA API :String 、StringBuilder、StringBuffer常用方法和区别(转载)
7.算法竞赛中的常用JAVA API :String .StringBuilder.StringBuffer常用方法和区别 摘要 本文将介绍String.StringBuilder类的常用方法. 在j ...
- Java 中的String、StringBuilder与StringBuffer的区别联系(转载)
1 String 基础 想要了解一个类,最好的办法就是看这个类的源代码,String类源代码如下: public final class String implements java.io.Seria ...
- 探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- 探秘Java中String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- C# - String与StringBuilder
A String object is called immutable (read-only), because its value cannot be modified after it has b ...
- 解析Java中的String、StringBuilder、StringBuffer类(一)
引言 String 类及其相关的StringBuilder.StringBuffer 类在 Java 中的使用相当的多,在各个公司的面试中也是必不可少的.因此,在本周,我打算花费一些时间来认真的研读一 ...
- 转发: 探秘Java中的String、StringBuilder以及StringBuffer
原文地址 探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家 ...
随机推荐
- PHP邮件发送
php带有内置的mail() 发送邮件函数,但是较为繁琐:建议上网下载一个PHPMailer:
- 腾讯刘金明:腾讯云 EB 级对象存储架构深度剖析及实践
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 演讲者:刘金明 腾讯云存储业务中心副总监 背景:5月23-24日,以"焕启"为主题的腾讯"云+未来" ...
- Oracle11gExpress和PL/SQL Developer安装
Oracle11g为64位版本,PL/SQL Developer为32位版本 1.安装64为Oracle数据库/ 适用于 Microsoft Windows (x64) 的 Oracle Databa ...
- Poj 3667——hotel——————【线段树区间合并】
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13124 Accepted: 5664 Descriptio ...
- 7、侧边栏:Menu
1.单个侧边栏 导航的代码在分析源码的时候已经分析过了,下面只看他的一些应用与方法. /* ---示例代码----*/ <ion-menu [content]="mycontent&q ...
- Spring3.2下使用JavaMailSenderImpl类发送邮件
1.JavaMailSenderImpl类 Spring的邮件发送的核心是MailSender接口,在Spring3.0中提供了一个实现类JavaMailSenderImpl,这个类是发送邮件的核心类 ...
- setInterval()的三种写法
前言: setInterval("fun()",time)有两个参数:fun()为要执行的函数:time为多久执行一次函数,单位是毫秒: 我们做一个简单的例子,就是每隔5s弹出一个 ...
- mybatis一对多映射
场景: A:SecControlRulePojo.java B:SecControlSubRulePojo C:SecControlSubRuleManyPojo 实体A中包含List<B> ...
- Java循环结构之while和do-while循环
循环结构知识点 本章技能目标 1理解循环的含义 2会使用while循环 3会使用do-while循环 4会使用调试解决简单的程序错误 一. 循环的含义 循环就是重复的做……(Java程序中的循环结 ...
- jqueryUI学习
01.选项卡 拖动按钮<div id="tabs"> <ul> <li><a href="#tabs-1">第一 ...