`
关西平次君
  • 浏览: 4361 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Java中String类探讨

    博客分类:
  • Java
阅读更多

Java中String类是java.lang包下的一个类,它被final关键字修饰。final关键字可以修饰类、变量和方法。被final修饰有如下特性:

①final修饰类,表示该类不能被继承。类不能被继承,标志着该类的属性和方法不能被其他类继承;

②final可以修饰静态成员变量(也叫类变量)、普通成员变量、局部变量。

被final修饰的变量称作final变量,也叫做final常量。一般来说,final常量名大写。

 

值得注意的是,final修饰类变量的时候,必须在声明的时候就要显式地赋值,并且一旦赋值就不能再更改!

final修饰普通成员变量时,要么在声明的时候显式地赋值,要么在构造方法中赋值(如果该类有多个构造方法,那么每一个构造方法中都要显式地赋值或者调用this()方法),并且一旦赋值就不能改变!

final修饰局部变量的时候,不必第一次就赋值,而是可以再用到的时候再赋值。但是一旦赋值,就不能再更改!

final常量和final变量是只读的,不能再修改他们的值。

 

final修饰引用变量时,变量的引用不能改,但是可以改变引用的内容!这个需要注意!

 

③final修饰方法,代表这个方法不可以被子类重写。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定了。

 

以上是final关键字的作用。

通过对String源码进行查看,发现String类是被final修饰的,说明String不能被继承,它的属性和方法都不能通过继承管理被复用。同时,String的成员变量有两个,一个是被final修饰的字符数组char[] value,一个是普通属性散列码hash。

其中,value是字符数组常量,在构造方法时就被赋值了。在其他的方法中,都没有去修改这个value的值,事实上,修改的话是不能编译通过的,因为final常量是只读的。

 

关于String的一些特性,经常会在面试过程中被问到。

========================面试问题分割线========================

String是一个特殊的包装类数据,可以用:

String str = new String("abc");

String str = "abc";

两种形式来创建,第一种是用new()来创建对象的,它会存放在堆中,每调用一次就会创建一个新的对象;而第二种是先在栈中创建一个对String类的对象引用变量str ,然后查找字符串常量池中有没有存放"abc",如果没有,则将"abc"存放到字符串常量池中,并令str 指向"abc",如果已经有"abc",则直接令str 指向"abc"。

面试官也会问,第一种方式创建了几个对象?

首先是在堆内存中生成了一个对象,值为“abc”,同时会去常量池中查找是否存在这个字符串,如果不存在则生成一个"abc"放到池子里去,因此可以说是创建了两个对象。

 

比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用 == ,下面用例子说明上面的理论。

String str1 = "abc";

String str2 = "abc";

System.out.println(str1 == str2);  // true

可以看出str1 和str2 指向同一个对象

 

String str1 = new String("abc");

String str2 = new String("abc");

System.out.println(str1 == str2);  // false

用new的方式是生成不同的对象,每一次调用都生成一个新的对象。

 

因此用第二种方式(String str = "abc";)创建多个"abc"字符串,在内存中其实只存放一个对象而已。这种写法有利于节省内存空间,同时它可以在一定程度上提高程序的运行速度,因为jvm(java virtual machine)会自动根据栈中数据的实际情况来决定是否有必要创建新的对象。而对于String str = new String("abc"); 的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新的对象,从而加重了程序的负担。

 

另一方面,要注意:

我们在使用诸如String str = "abc";的格式创建对象时,总是想当然地认为创建了String类的对象str,小心陷阱,对象可能并没有被创建!而可能只是指向一个先前已经创建好的对象。只有通过new()方法才能保证每次都创建一个新的对象。由于String类的不可变(immutable)性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。


例子:

String a = "abc";

String b = "abc";

String c = new String("abc");

String d = c.intern();
这段代码(code)共创建了几个对象?

我认为是两个,首先a,b指向池子里的同一个字符串"abc",c指向堆里面的对象,d指向常量池中的"abc",因此我认为是创建了两个对象。


说完了String,那么另一个值得关注的类是Integer,看下面的例子:
int a=1;
Integer b=1;
Integer c=new Integer(1);

Integer d=new Integer(1);

Integer e=223;

Integer f=223;

思考:

a==b true or false?

a==c true or false?

b==c true or false?

c==d true or false?

e==f true or false?

 

想知道答案及原因?且听下回分解!

 

 

分享到:
评论

相关推荐

    深入探讨Java中的String类.pdf

    Java 中的 String 类有很多特点和用途,本文将深入探讨 Java 中的 String 类。 一、String 类的本质 Java 中的 String 类是一个特殊的类,它是一个 immutable 类,也就是说,一旦创建了 String 对象,它的值就不能...

    Java的String类

    在Java编程中,`String`类是最常用的数据类型之一,用于处理文本数据。它是一个不可变类,意味着一旦创建了一个`String`对象,其内容就不能更改。这使得`String`类在多线程环境中非常安全,同时也带来了一些性能上的...

    深入解析 Java 中的 String 类:特性与使用

    本文将详细探讨 Java 中 String 类的特性及其使用。 Java 中的 String 类提供了丰富的方法和特性,使得字符串的操作变得简单而强大。不可变性、字符串常量池、以及各种字符串操作方法都是 String 类的关键特性。通过...

    JAVA JSON;String 转换为 java类

    本文将详细探讨如何在Java中将JSON字符串转换为Java实体类。 首先,你需要引入一个JSON库,如Jackson、Gson或Fastjson。这里以Jackson为例,因为它是目前广泛使用的JSON处理库,提供了强大的JSON操作功能。 1. **...

    java String类常用方法练习小结

    在Java编程语言中,`String`类是一个非常重要的类,它代表不可变的字符序列。所有的字符串字面值(例如:"abc")都是`String`类的实例。本篇文章将深入探讨`String`类的一些常用方法,并通过实际例子帮助你更好地...

    小心String的陷阱——深入剖析Java中String的处理机制

    标题和描述均强调了在Java中处理`String`对象时可能遇到的陷阱,尤其是在理解和使用`String`的处理机制上。文章由天津工业大学软件工程专业的翁龙辉撰写,旨在深入剖析`String`在Java中的独特行为及其潜在的陷阱。...

    Java中String类的方法及说明.pdf

    Java中的String类是Java语言中最基础且至关重要的类之一,它代表不可变的字符序列。在Java中,字符串被广泛用于各种数据处理和文本操作。本文将深入探讨String类的一些关键方法及其用法。 首先,让我们看看String类...

    Java-String类的常用方法总结.pdf

    在这个总结中,我们将深入探讨String类的一些核心特性和方法。 首先,String类位于`java.lang`包中,这意味着它对所有Java程序都是自动导入的,无需额外引用。String类被声明为final,这意味着我们无法创建其子类,...

    Java 之 String 类型

    本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他数据类型的转换。 1. **字符串的创建与不可变性** - String对象在Java中是通过引用常量池中的常量来创建的,一旦创建就不能改变。例如...

    一文带你吃透Java中的String类.rar

    本文将深入探讨String类的特性、构造、方法以及在内存中的表现,帮助你全面理解这个核心类。 首先,String类在Java中是不可变的。这意味着一旦创建了一个String对象,它的值就不能被改变。这是由其内部实现决定的,...

    java String 数据结构

    在Java编程语言中,`String`类是处理文本字符串的核心工具。它是一个不可变对象,意味着一旦创建,其内容就不能更改。这是因为`String`在Java中被实现为一个特殊的类,存储在一个连续的字符数组中,这个特性对于理解...

    正确使用String类的几点注意

    在Java编程中,`java.lang.String`类是极为常见的基础数据类型之一,其重要性和应用范围不言而喻。为了更好地理解和使用String类,本文将从几个关键方面入手,探讨如何更加高效、合理地使用String对象。 #### 一、...

    简单说说JAVA的String和byte[]的关系

    - **String**: 在Java中,`String`是一个不可变的类,用于表示字符序列。默认情况下,`String`对象使用Unicode编码(通常是UTF-16),这意味着每个字符占用两个字节。 - **byte[]**: 这是一个字节数组,通常用来表示...

    JAVA【第5章:面向对象基础】_String类的常用方法.rar

    在Java编程语言中,面向对象基础是学习Java的基石,而`String`类则是最常用的类之一,几乎在每一个程序中都会见到它的身影。本章节将深入探讨`String`类的常用方法,帮助你更好地理解和运用这个核心组件。 `String`...

    练习JAVA语句中的String

    在Java编程语言中,`String`类是使用最广泛的类之一,主要用来处理文本字符串。字符串在Java中被视为不可变对象,这意味着一旦创建了一个`String`对象,就不能更改它的值。下面我们将深入探讨`String`类的一些关键...

    Java String与Byte类型转换

    String是Java中的一个不可变类,用于表示字符串,它是基于Unicode字符集的。Byte类型是Java的八种基本数据类型之一,用于存储8位二进制值,范围是-128到127。 1. **String转Byte**: - **字面量转换**: 直接使用`...

    JAVA_String

    在本文中,我们将深入探讨`JAVA_String`相关的知识点,包括其创建、操作、比较以及内存管理等方面。 首先,`String`类位于`java.lang`包中,这意味着在编写Java程序时,我们无需显式导入它。`String`对象一旦创建,...

    java中String类型和int类型比较及相互转换

    本文将深入探讨Java中String类型和int类型之间的比较方法以及相互转换的技术,这对于理解和优化代码逻辑、提升程序性能具有重要意义。 ### 一、String类型与int类型的基本概念 #### 1.1 String类型 String类型在...

    Java中String类(字符串操作)的10个常见问题和解决方法

    标题为"Java中String类(字符串操作)的10个常见问题和解决方法"的文档主要探讨了Java语言中字符串处理的核心类String的使用细节和最佳实践。以下是根据文档内容总结的知识点: 1. 字符串比较 在Java中,比较字符串...

Global site tag (gtag.js) - Google Analytics