曾经有人问我一个问题,往一个没有返回值的方法中传一个非静态、非final的String类型参数,在方法中改变它,为什么出了方法还是原来的值?
String类型我们用的最常见的莫过于此种构造函数;
public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}
你发现了什么?其实我们用String类型本质上还是用char类型。java中的传递参数都可以看成传值,因为java不像C中有指针。既然是传值那么就不能改变这个值,只能从栈中拷贝一份过去。这个拷贝的是引用,应为栈中不可能有对象。在改变参数法则中不能改变对象本身只能改变对象下的子节点值,若子节点也是对象则继续找他的子节点,直到基本类型为止。看到了吧。String类型其实就是char难道你能改变吗?已经到了基本类型就不能在改变。由此类推Long、Integer、、、等包装类型都是这种特点。
又一次又有人问我:
为什么
String a="ss";
String b="ss";
a==b 返回true
a.equals(b) 返回true
String c=new String("ss");
String d=new String("ss");
c==d 返回false
d.equals(d) 返回true
这种问题有很多人都知道但是要让你解释为什么还真是让人头痛的。
String a="ss"; 这是有一系列的动作组成的。首先“ss”会看在String的常量池中有没有一个"ss",如果没有就放一个进去,如果有就把a引用所引用的对象指向常量池中的对象,否则把"ss",放进常量池中并把这个地址给a引用。所以a、b都代表的是一个地址,一个对象。而new呢?大家都知道new是创建性对象,分配新空间。没错是要分配新空间,但是他的空间在堆里面一个区域里,他和常量池不是在一个区域。所以你new一个是一个新对象,在new一个还是一个新对象。c==d返回false就不难解释了。d.equals(d) 返回true也是理所当然了。
分享到:
相关推荐
本文将深入探讨Java中String类型和int类型之间的比较方法以及相互转换的技术,这对于理解和优化代码逻辑、提升程序性能具有重要意义。 ### 一、String类型与int类型的基本概念 #### 1.1 String类型 String类型在...
本文将深入探讨Java中的基本类型以及String类型的特性与用法。 #### Java基本类型 Java中的基本类型共有八种,它们分别为: 1. **整型**: - `byte`:占用1字节,范围是-128到127。 - `short`:占用2字节,范围...
在本例中,添加一个String类型的字段是没有任何问题的,因为Greendao默认支持对String类型的操作。然而,当试图添加其他非String类型,比如Integer、Float、Boolean等,可能会遇到问题。这可能是由于Greendao内部...
在深入探讨`string`类型及其成员函数之前,我们先简要回顾一下`string`的本质。在C++标准库中,`string`实际上是`basic_string`模板类的一个特化版本,用于处理`char`类型的字符序列。它提供了丰富的功能集,不仅...
在Java编程语言中,String类型扮演着至关重要的角色。它被广泛用于表示和操作文本,因为它是不可变的,这确保了字符串的安全性和效率。本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他...
### C++ String 深入详解 #### 一、C++ 的 `std::string` 使用 **1.1 C++ `std::string` 简介** `std::string` 是 C++ 标准库中的一个类,用于处理字符串。它提供了一种更安全、更方便的方式来操作字符串数据,...
Ruby 语言中的 String 类型是其的一大亮点,与 Java 和 C# 相比,具有显著的差异和优势。Ruby 的 String 是 mutable,这意味着它可以在创建后进行修改,而不像 Java 和 C# 中的 String,一旦创建就是 immutable,...
在Java中,`String` 类被声明为 `final` 类型,这意味着它不能被继承。这主要是出于两个原因考虑:一是为了确保字符串对象的不可变性,从而可以在整个系统中安全地共享这些对象;二是为了优化性能,由于字符串常被...
在Java编程语言中,经常需要将`List<String>`类型的数据转换为`String[]`数组类型,以便于进行某些特定的操作或适应某些方法的要求。本文将详细探讨这一转换过程,并通过几个具体的示例来帮助理解。 #### 一、基础...
本教程"深入学习C++_String2.1版"旨在帮助开发者更全面、深入地理解`std::string`类及其在实际编程中的应用。以下是对这个主题的详细探讨: 一、`std::string`类的基本概念 `std::string`是一个容器类,用于存储可...
首先,让我们深入了解String类型。在Redis中,String是最基本的数据类型,可以存储字符串、整数或浮点数。例如,你可以设置一个键为"user_age",值为"25"的键值对,表示用户的年龄。此外,Redis提供了丰富的命令操作...
在深入探讨“String类型两种不同实例化方式”的知识点前,我们先明确一下String类在Java中的特殊地位。在Java中,String被设计成不可变(immutable)的对象,这意味着一旦一个String对象被创建,其内容就不能被修改...
与此相关的,`String`对象是Java编程语言中的基础类型,用于存储和处理文本数据。在实际开发中,我们经常需要在`String`对象与JSON对象之间进行转换,以满足不同的需求。本文将深入探讨`String`与JSON的互转方法,并...
本篇文章将深入探讨如何将Java的原始数组类型转换为String形式,以及这个过程中的关键知识点。 首先,我们来看一下如何将整型数组(int[])转换为String。Java提供了一些内置的方法来帮助我们完成这个任务。最常用...
标题与描述中提到的知识点是关于C#编程语言中`String`与`string`的区别,以及`string`类型的深入解析。以下是对这些知识点的详细解释: ### `String`与`string`的区别 #### 1. **位置与来源** - `String`是.NET ...
在Java编程语言中,内存管理和String类型是两个非常关键的概念,尤其对于深入理解Java开发至关重要。本文将详细探讨这两个主题,旨在提供一个全面且深入的分析。 首先,我们来看Java的内存分配。Java内存主要分为三...
本文将深入探讨`String`类的各种构造函数、方法及其用途,帮助读者更全面地理解并运用这一关键类。 #### 构造函数 `String`类提供了多种构造函数,以适应不同的初始化需求: 1. **默认构造函数**:`String()` - ...
在C#编程语言中,String类型是用于处理文本数据的核心类。它是一个不可变的序列,这意味着一旦创建了String对象,就不能更改其内容。在这个"String类型判断数据源码"中,我们很可能会看到如何检查字符串的各种属性,...
在本篇学习笔记中,我们将深入探讨这两种类型,了解它们的功能、操作方法以及如何在实际应用中有效利用。 首先,让我们来看一下 Redis String 类型。String 类型是最基础的类型,它允许我们存储简单的键值对,其中...
【对String的深入理解】 String类在Java编程中扮演着至关重要的角色,它不仅涉及到基本的字符串操作,还涉及到内存管理、性能优化等多个方面。在深入理解String时,我们需要掌握以下几个关键知识点: 1. 引用变量...