`
itmyhome
  • 浏览: 97492 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于String类的理解

 
阅读更多

java中的数据类型有两种

一种是基本类型(primitive types)共有8种即byte short int long float double char boolean(并没有String类型)

看下面一段程序:

int a = 413;
		int b = 413;
		System.out.println(a==b); //true
		
		Integer c = 10;
		Integer d = 10;
		System.out.println(c==d); //true
		
		Integer e = 128;
		Integer f = 128;
		System.out.println(e==f); //false

Integer类型赋不同值的值返回的结果却不同

原因:

自动装箱是对于从 -128 到 127 之间的信息值,它们在被装箱为 对象数据后会在内存中被重用.所以上面两个是不相同的.

java编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,
char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。

String是一个特殊的类。即可以用String str = new String("abc");的形式来创建,也可以用String str = "abc";的形式来创建。

对于new的形式是在堆中开一片内存。

String str1 = "abc";
		String str2 = "abc";
		System.out.println(str1==str2);
结果说明,JVM创建了两个引用str1和str2,但只创建了一个对象,而且两个引用都指向了这个对象。

接着看如下代码:

String str3 = "abc";
		String str4 = new String("abc");
		System.out.println(str3==str4);//false
创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。

结论:

使用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 要快。两者的方法基本相同


分享到:
评论

相关推荐

    java基础String类选择题练习题

    根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...

    java自制string类例程

    总之,"java自制string类例程"是一个很好的实践项目,可以帮助初学者巩固对Java字符串概念的理解,提高编程技能,并对面向对象编程的核心原则有更深入的认识。在实际编程中,虽然我们通常使用内置的String类,但这种...

    简单的string类

    这个简单的`string`类介绍将带我们回顾基础,深入理解其内部机制和常用方法。 首先,`std::string`是C++标准库中的一个类模板,它表示可变长度的字符序列。在声明时,你可以通过构造函数初始化字符串,例如: ```...

    string类的构造方法_String类重要吗_C++_STL_string_

    `std::string`类不仅在日常编程中频繁使用,而且在很多高级功能如正则表达式、文本处理等方面都有重要应用,因此了解其构造方法对于深入理解C++字符串处理至关重要。 首先,让我们来看看`std::string`的几个主要...

    关于String类的一些方法

    在Java编程语言中,`String`类是使用最频繁的类之...在实践中,不断探索和应用,你将对`String`类有更深的理解。通过阅读和分析`stringmethor.java`文件中的示例代码,你可以进一步巩固这些知识,并发现更多实用技巧。

    string类讲解文档

    这个文档详细地介绍了`std::string`类的各种函数,旨在帮助程序员理解和熟练使用这一强大的工具。以下是对`std::string`类主要功能的详细说明: 1. **构造函数**: - `string()`: 默认构造函数,创建一个空字符串...

    c++string类函数原型借鉴.pdf

    在C++中,标准库提供了string类来处理字符串,但是为了更好地理解字符串的操作,我们可以通过自定义的String类来实现字符串的操作。 描述:C++ String 类函数原型借鉴 本文的主要内容是对C++中的字符串类函数原型...

    c++自定义string类

    在C++编程中,自定义`string`类是一项常见的练习,它可以帮助我们深入理解对象、内存管理和操作符重载等核心概念。以下是对这个主题的详细讲解: 首先,`string`类是C++标准库中的一个关键部分,用于处理字符串。...

    自己写的String类

    创建自己的`String`类通常是学习面向对象编程时的一个常见练习,目的是更好地理解类的构造、成员函数、内存管理和继承等概念。 自定义的`String`类可能包含以下关键组成部分: 1. **构造函数**:这是创建新对象时...

    c++链表string类程序

    通过这个"链表string类程序",学习者可以了解如何在链表数据结构中使用`std::string`,掌握如何在链表中插入、删除和查找字符串,同时加深对C++标准库的理解。这有助于提升编程技能,特别是处理文本数据时的效率和...

    c++中string类的源代码

    关于string类的自定义,如果你对string不了解,可帮助你理解其功能有助于c++的学习

    java String类的实现

    Java中的`String`类是编程中最常用的类之一,它在Java的`java.lang`包中,无需显式导入即可使用。`String`类代表不可变的字符序列,这意味着一旦创建了`String`对象,它的值就不能改变。这个特性使得`String`在处理...

    c++string类源码

    这些知识点构成了`std::string`类的核心功能,理解和熟练运用这些函数和运算符能有效提高C++中字符串处理的效率和代码的可读性。在实际编程中,理解拷贝构造函数的工作原理以及何时使用深拷贝和浅拷贝尤为重要,因为...

    介绍java中String类的方法

    Java中的String类是编程中非常基础且重要的一个类,它代表不可变的字符序列,即一旦创建...掌握这些基本的String类知识和方法对于Java编程至关重要,它们在日常开发中被广泛应用,理解并熟练运用能提高代码质量和效率。

    自定义String类

    虽然C++标准库中已经提供了`std::string`类,但为了学习和理解对象导向编程(OOP)以及C++的特性,有时我们会选择自定义一个`String`类。在这个自定义的过程中,我们可以更好地控制字符串的操作,并深入理解内存管理...

    String类使用

    总之,`String`类是Java中的核心类,理解和熟练使用它对于任何Java开发者都至关重要。通过以上介绍,你应该能更好地理解`String`类的使用,并能在实际开发中得心应手地处理字符串问题。在学习过程中,不断实践和探索...

    自己写了个string类

    创建一个自定义的`string`类是一个很好的学习项目,可以帮助开发者巩固对C++内存管理、面向对象编程和模板机制的理解。通过这个过程,你可以深入理解C++的底层机制,并锻炼解决问题的能力。虽然这个类可能无法完全...

    java中的String类常用方法解析(一)

    本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符串。 - `String(char[] value)`:根据字符数组创建字符串。 - `String(String ...

    C#中String类常用方法汇总

    在C#编程语言中,String类是用于处理文本字符串的核心类。它提供了丰富的功能,使得在处理字符串时能够实现各种常见的操作。以下是对C#中String类常用方法的详细解释和示例: 1. `.ToLower()` 和 `.ToUpper()` 这...

Global site tag (gtag.js) - Google Analytics