对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。
问题一:我声明了什么!
String s = "Hello world!";
许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向 "Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:
String string = s;
我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
问题二:"=="和equals方法究竟有什么区别?
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。
根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b 都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。
看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){
return this==o;
}
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用 equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。
看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}
}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。
所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet, HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。
问题三:String到底变了没有?
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:
String s = "Hello";
s = s + " world!";
s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个 String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
分享到:
相关推荐
Java初学者必备基础教材主要涵盖了Java语言的核心概念和基本元素,是学习编程的入门路径。以下将详细解析这些知识点: 1. **Java语言与面向对象的程序设计**:Java是一种面向对象的语言,这意味着它强调通过类和...
"java初学的一些小例子"这个主题,显然旨在帮助新手们通过实际操作来学习Java的核心概念。 首先,让我们深入了解一下Java的基础知识。Java程序设计语言由Sun Microsystems(现为Oracle公司)于1995年推出,其设计...
本文旨在为Java初学者提供一份实用的学习指南,帮助大家更好地理解Java的基础知识及其应用场景。 #### 二、Java语言的核心优势 1. **彻底的面向对象性**: - Java是一种纯面向对象的语言,所有的功能和数据都被...
这个名为“java初学好文档”的资源,显然是为了帮助新手系统地学习Java基础知识。本文将深入解析Java的基础语法,帮助你理解并掌握这个强大的编程工具。 1. **变量与数据类型** Java有八种基本数据类型:整型...
这个"java初学者学习源代码"集合提供了一些简单的运行代码示例,帮助初学者通过实践来学习。 1. **基本语法与数据类型**:Java有八种基本数据类型,包括整型(byte, short, int, long)、浮点型(float, double)、...
通过这些Java初学者源代码,你可以逐步了解并掌握以上知识点,从简单的程序到复杂的概念,逐渐成长为一名熟练的Java开发者。记得理论学习与实践结合,不断动手编写和调试代码,这是提升编程技能的关键。
### JAVA初学者必看的学习方法 对于初学者来说,在学习JAVA的过程中可能会遇到各种各样的问题,这不仅仅是因为JAVA本身的复杂性,还因为学习路径的选择、方法的掌握等多方面因素。下面将根据提供的部分信息,深入...
### Java初学者指南知识点梳理 #### 一、Java概述与发展历程 - **定义与特性**:Java是一种广泛使用的面向对象的编程语言,以其跨平台性(Write Once, Run Anywhere, WORA)著称。 - **发展历史**: - 由Sun ...
Java初学者入门基础文档是一份全面的教程,旨在帮助新手快速掌握Java编程语言的基本概念和技能。这份资料共分为15个章节,每个章节都深入浅出地讲解了Java编程的关键知识点,并通过实例来加深理解。 第1章:Java...
以下将从理解Java的核心概念、掌握必备工具、深入学习资源以及实践应用四个方面,为Java初学者提供一份详尽的学习路线图。 #### 1. 理解Java的核心概念 Java是一种面向对象的编程语言,这意味着一切皆是对象,理解...
本资源"java基础练习题初学者可使用"旨在帮助Java初学者巩固和提升他们的基础知识。以下是一些核心知识点的详细说明,这些知识点通常会出现在这些练习题中: 1. **基本数据类型**:Java有八种基本数据类型,包括...
对于Java初学者来说,理解这些核心特性至关重要。 首先,Java的面向对象特性意味着一切皆为对象。类是创建对象的蓝图,它封装了数据(属性)和行为(方法)。这种设计模式让代码更加模块化,易于维护和扩展。Java...
"Java初学者必读实践"这个资源,据说是2009年的最新版,专为初学者设计,提供了丰富的学习材料,帮助你从零开始掌握Java编程。 Java语言的基础部分主要包括以下几个核心知识点: 1. **基本语法**:Java的程序结构...
### JAVA初学者基础过程强烈推荐 #### 知识点概览 1. **JAVA语言简介与特点** 2. **JAVA的面向对象特性** 3. **JAVA的封装性** 4. **JAVA与C/C++的区别** 5. **JAVA的内存管理和安全性** 6. **JAVA的跨平台特性** 7...
在编程世界中,Java是一种广泛使用的面向对象编程语言,尤其适合初学者入门。"推箱子"游戏是一款经典的逻辑益智游戏,它不仅娱乐性强,而且能够...所以,"推箱子练习"对于Java初学者来说是一个非常有价值的实践项目。
Java初学入门——《Think in Java》精要 在编程世界中,Java是一种广泛应用的面向对象的编程语言,尤其在企业级应用开发中占据主导地位。对于初学者来说,掌握Java的基本概念和语法是至关重要的。《Think in Java》...
本资源"java初学者完整代码+注释9"是一份专为Java新手设计的学习资料,涵盖了21个课程的内容,帮助初学者从零开始构建扎实的Java基础。 在Java的学习过程中,了解基本语法和概念至关重要。这包括: 1. **变量和...
【Java初学者福音】 在Java学习的初期,掌握一些核心概念和最佳实践是至关重要的。以下将详述几个关键知识点,帮助你扎实基础,避免常见错误。 1. 面向对象的设计法则: 面向对象编程(OOP)是Java的核心。一些...