java中的数据类型有两种
一种是基本类型(primitive types)共有8种即byte short int long float double char boolean(并没有String类型)
看下面一段程序:
Integer类型赋不同值的值返回的结果却不同
原因:
自动装箱是对于从 -128 到 127 之间的信息值,它们在被装箱为 对象数据后会在内存中被重用.所以上面两个是不相同的.
java编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,
char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。
String是一个特殊的类。即可以用String str = new String("abc");的形式来创建,也可以用String str = "abc";的形式来创建。
对于new的形式是在堆中开一片内存。
结果说明,JVM创建了两个引用str1和str2,但只创建了一个对象,而且两个引用都指向了这个对象。
接着看如下代码:
创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。
结论:
使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
附:StringBuffer StringBuilder String的区别
String是固定长度的字符串,如果要发生变化必须重新生成新的实例。
String字符串常量
StringBuffer字符串常量(线程安全)
StringBuilder字符串常量(非线程安全)(效率高)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象,
而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比
StringBuffer 快的:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做
在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同
分享到:
相关推荐
String类使用,可以快速理解Java中String类的使用,容易上手。
关于String类中常量池、字符串池的理解
掌握String类和StringBuffer类的使用 了解System类、Runtime类、Math类和Random类的使用 熟悉包装类的使用
关于string类的自定义,如果你对string不了解,可帮助你理解其功能有助于c++的学习
Java常用类与基础API--String的理解与不可变性
自已写的一个小类,可用于使用和学习.主要是对内存的管理方面的基本理解.
该源码资源会包含以下示例代码,以帮助开发者更好地理解和使用字符串操作类: String类使用(创建字符串对象、比较、长度、连接、截取、查找和替换、切割和拆分、和其他类型的转换、格式化、判断、手动入池、其他...
理解C# String类型:特殊的引用类型
主要为大家详细介绍了JAVA中String类与StringBuffer类的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
我跟很多童鞋一样,目前也在学习C++中,昨天正在学习has-a关系中的包含时,例题是将string类包含的,因为是小白嘛,嘿嘿,为了更深的理解包含以及其他相关问题,果断上机边敲代码边理解咯,既然用到了string类,自己...
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
语句声明一个类A的引用变量aa[我常常称之为句柄],而对象一般通过new创建。所以题目中s仅仅是一个引用变量,它不是对象。[ref 句柄、引用与对象] 二、Java中所有的字符串文字[字符串常量]都是一个String的对象。有...
1、String类是final的,不可被继承。public final class String。 2、String类是的本质是字符数组char[], 并且其值不可改变。private final char value[]; 然后打开String类的API文档,可以发现......
java中关于String的详细讲解,所有不同用法理解都有
A2:当一个String实例调 用 intern() 方法时,Java查找常量池中是否有相同Unicode 的字符串常量,如果有,则返回其的引用,如果没有,则在
1使用类:理解背景,掌握原理和思路,融汇贯通 代码中CBox类中为什么要比较? 比较CBox对象中,为什么会有18个运算符函数? #pragma once的作用?? 2字符串的库类:学会看表,会运用:应用开发中大多数的情况都在进行字符...
从构造,析构以及拷贝构造的方面理解string类的底层实现。 源代码获取: https://github.com/akh5/C-/blob/master/STL/Mystring.cpp string的底层通过字符指针char*通过构造函数申请对应大小的空间,并将指针指向其...
String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的
关于C#中的类型 在C#中类型分为值类型和引用类型,引用类型... 关于C# String 1、不变性 我们先来看看一个例子: static void Main(string[] args) { string str1 = "string"; string str2 = str1; Co
不才,表达能力不是很好,可能看官不能理解上面的意思,还是看例子吧。 先创建个struct变量s clear s, s.country = 'China'; s.city = 'Chongqing'; s.address = struct; 然后运行 structstring = ...