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 类有很多特点和用途,本文将深入探讨 Java 中的 String 类。 一、String 类的本质 Java 中的 String 类是一个特殊的类,它是一个 immutable 类,也就是说,一旦创建了 String 对象,它的值就不能...
在Java编程中,`String`类是最常用的数据类型之一,用于处理文本数据。它是一个不可变类,意味着一旦创建了一个`String`对象,其内容就不能更改。这使得`String`类在多线程环境中非常安全,同时也带来了一些性能上的...
本文将详细探讨 Java 中 String 类的特性及其使用。 Java 中的 String 类提供了丰富的方法和特性,使得字符串的操作变得简单而强大。不可变性、字符串常量池、以及各种字符串操作方法都是 String 类的关键特性。通过...
本文将详细探讨如何在Java中将JSON字符串转换为Java实体类。 首先,你需要引入一个JSON库,如Jackson、Gson或Fastjson。这里以Jackson为例,因为它是目前广泛使用的JSON处理库,提供了强大的JSON操作功能。 1. **...
在Java编程语言中,`String`类是一个非常重要的类,它代表不可变的字符序列。所有的字符串字面值(例如:"abc")都是`String`类的实例。本篇文章将深入探讨`String`类的一些常用方法,并通过实际例子帮助你更好地...
本文将深入探讨Java中String类型和int类型之间的比较方法以及相互转换的技术,这对于理解和优化代码逻辑、提升程序性能具有重要意义。 ### 一、String类型与int类型的基本概念 #### 1.1 String类型 String类型在...
标题和描述均强调了在Java中处理`String`对象时可能遇到的陷阱,尤其是在理解和使用`String`的处理机制上。文章由天津工业大学软件工程专业的翁龙辉撰写,旨在深入剖析`String`在Java中的独特行为及其潜在的陷阱。...
Java中的String类是Java语言中最基础且至关重要的类之一,它代表不可变的字符序列。在Java中,字符串被广泛用于各种数据处理和文本操作。本文将深入探讨String类的一些关键方法及其用法。 首先,让我们看看String类...
在这个总结中,我们将深入探讨String类的一些核心特性和方法。 首先,String类位于`java.lang`包中,这意味着它对所有Java程序都是自动导入的,无需额外引用。String类被声明为final,这意味着我们无法创建其子类,...
本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他数据类型的转换。 1. **字符串的创建与不可变性** - String对象在Java中是通过引用常量池中的常量来创建的,一旦创建就不能改变。例如...
本文将深入探讨String类的特性、构造、方法以及在内存中的表现,帮助你全面理解这个核心类。 首先,String类在Java中是不可变的。这意味着一旦创建了一个String对象,它的值就不能被改变。这是由其内部实现决定的,...
在Java编程语言中,`String`类是处理文本字符串的核心工具。它是一个不可变对象,意味着一旦创建,其内容就不能更改。这是因为`String`在Java中被实现为一个特殊的类,存储在一个连续的字符数组中,这个特性对于理解...
在Java编程中,`java.lang.String`类是极为常见的基础数据类型之一,其重要性和应用范围不言而喻。为了更好地理解和使用String类,本文将从几个关键方面入手,探讨如何更加高效、合理地使用String对象。 #### 一、...
- **String**: 在Java中,`String`是一个不可变的类,用于表示字符序列。默认情况下,`String`对象使用Unicode编码(通常是UTF-16),这意味着每个字符占用两个字节。 - **byte[]**: 这是一个字节数组,通常用来表示...
在Java编程语言中,面向对象基础是学习Java的基石,而`String`类则是最常用的类之一,几乎在每一个程序中都会见到它的身影。本章节将深入探讨`String`类的常用方法,帮助你更好地理解和运用这个核心组件。 `String`...
在Java编程语言中,`String`类是使用最广泛的类之一,主要用来处理文本字符串。字符串在Java中被视为不可变对象,这意味着一旦创建了一个`String`对象,就不能更改它的值。下面我们将深入探讨`String`类的一些关键...
String是Java中的一个不可变类,用于表示字符串,它是基于Unicode字符集的。Byte类型是Java的八种基本数据类型之一,用于存储8位二进制值,范围是-128到127。 1. **String转Byte**: - **字面量转换**: 直接使用`...
在本文中,我们将深入探讨`JAVA_String`相关的知识点,包括其创建、操作、比较以及内存管理等方面。 首先,`String`类位于`java.lang`包中,这意味着在编写Java程序时,我们无需显式导入它。`String`对象一旦创建,...
标题为"Java中String类(字符串操作)的10个常见问题和解决方法"的文档主要探讨了Java语言中字符串处理的核心类String的使用细节和最佳实践。以下是根据文档内容总结的知识点: 1. 字符串比较 在Java中,比较字符串...