`

JAVA中的值传递和引用传递(Map & String & 对象 & 指针 & 引用)

    博客分类:
  • Java
阅读更多
Map<String, Object> map = new HashMap<String, Object>();
Map<String, String> params = new HashMap<String, String>();
map.put("params", params);
params.put("key", key);


Map的put不是put一个对象,而是put一个对象的引用!该对象更新后,Map里面被put的引用随着改变。

对于String,我用代码测试了一下:
String a = new String("111");
String b = a;
a = "222";
System.out.println(b);//结果是111
System.out.println(b.equals(a));//false

测试结果是b仍然为111。
String b = a;表示a和b指向同一个字符串"111"的引用。
a = "222";表示把a改变为指向"222"的应用,而此时b保持不变。


再看Sting数组
String a[] = { "1","2","3" },
String b[] = null;
b = a;
a[0] = "4";
System.out.println(b[0]); //结果是4
System.out.println(b.equals(a));//true

此时输出的又是4!这个跟上面的Map类似。

此时在方法中把对象(或数组)作为参数,方法调用时,参数传递的是对象的引用(地址),这时候b与a指向同一个内存地址,即同一个对象(数组),改变数组a的值的时候,也就相当于改变了b的值。

引用
Java对对象和基本的数据类型的处理是不一样的。和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。

而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。

除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。
分享到:
评论

相关推荐

    Java 60 道面试题及答案.docx

    Java 60 道面试题及答案 本文将对 Java 相关知识点进行详细的解释和总结,从 Java 的基本概念到高级主题,涵盖面试中常见的知识点。 Java 基础知识 ...Java 中是值传递的,但是对象的引用是传递的。

    java行转列的例子

    在Java中实现行转列,通常涉及数据结构的转换,如从List&lt;List&lt;String&gt;&gt;转换为List&lt;String&gt;,或者更复杂地,从Map&lt;String, Object&gt;到自定义对象的集合。以下是一些关键知识点: 1. 数据结构理解: - **List**: Java...

    GitHub 上标星 115k+ 的 Java 教程.pdf

    参数传递时,Java 采用值传递,但对象引用是按值传递的,这意味着函数内部对对象的修改会影响到原始对象。 四、关键字 final 用于声明不可变的变量、方法或类。static 关键字用于声明类级别的变量和方法,它们属于...

    Beginning Java 8 Fundamentals & Language Features

    5. **方法引用**:方法引用是与lambda表达式相关的一个特性,它可以将现有方法或构造器引用作为函数对象,如`Arrays::sort`或`String::length`。 6. **日期和时间API**:Java 8对日期和时间处理进行了重大改进,...

    利用Java8 Optional如何避免空指针异常详解

    在传统的 Java 代码中,我们通常需要在调用可能存在 null 值的方法或字段前进行 null 检查,如上述例子中对 computer、soundcard 和 usb 的多次检查。这种方式虽然可以避免空指针异常,但会使代码变得冗长且不易阅读...

    java1.8 中文api

    `java.lang`包含所有Java程序都默认导入的基本类型和对象,如`String`、`Integer`、`Object`等。`java.io`提供了输入/输出流处理,用于数据的读写。`java.util`包含各种实用工具类,如集合框架、日期时间处理、事件...

    JAVA面试笔试题大全

    当一个对象被当作参数传递到一个方法后,此方法可以改变这个对象的属性,并可以返回变化后的结果,那么这里到底是值传递还是引用传递?答案是引用传递。 switch 语句可以作用在 byte、short、char、int 上,但不能...

    java考试复习资料

    虽然Java没有传统意义上的指针,但在底层实现中仍然使用类似指针的概念来引用对象。这种指针对程序员是不可见的,由JVM管理和操作。 #### 二十三、值传递与引用传递 Java中实际上采用的是引用传递的方式。对于基本...

    JavaDelegateTest:Java 8 委托测试将函数指针放在 HashMap 中,就像在 C# 中一样

    3. **HashMap存储函数引用**: 在JavaDelegateTest项目中,开发者可能会创建一个`HashMap`,其中键是某种标识(可能是字符串或其他对象),值是函数接口实例,表示实际的方法。例如,使用`Function`接口: ```java ...

    尚硅谷Java8练习Java源码

    Java 8引入了 Lambda 表达式,这是一种简洁的匿名函数表示方式,使得函数可以像对象一样被传递和处理。Lambda表达式简化了回调函数的编写,提高了代码的可读性和可维护性。例如,`List&lt;String&gt; names = Arrays....

    Java 60道面试题和答案.docx

    Java是一种广泛使用的编程...参数传递通常是值传递,但对象引用是按引用传递。 以上是Java面试中常见的知识点,涵盖了从基础概念到高级特性的多个方面。理解和掌握这些知识点对于成为一名优秀的Java开发者至关重要。

    Java 面试题 Java 面试题

    - Java 中对象参数的传递实际上是引用传递,即传递的是对象的引用而不是对象本身。这意味着如果修改了对象的属性,原始对象也会受到影响。 #### 31. switch 是否能作用在 byte 上,是否能作用 - **switch** 支持 ...

    Java基础知识索引

    Java中的继承是一种类与类之间传递属性和行为的方式。子类继承父类后可以获得父类的所有非私有属性和方法。 - 子类默认是父类的子类。 - 构造器不被继承,但子类可以通过`super()`显式调用父类的构造器。 - 属性是...

    Java面试题及答案-共60道.docx

    Java面试题及答案-共60道 本文将对 Java 面试题中的知识点进行详细解释和总结。 一、架构模式 B/S 架构即浏览器/服务器架构,主要应用于 Web 应用程序开发。...Java 中采用的是值传递引用的方式。

    Java8 英文文档 API .zip

    - `Optional&lt;T&gt;`类用于表示可能为null的对象引用,帮助开发者避免空指针异常。它提供了一种安全的方式来处理可能缺失的值。 4. **默认方法**: - 接口中可以定义带有实现的默认方法,这允许在不破坏向后兼容性的...

    Java 1.8中文API手册

    其中,`Optional`类是Java 8引入的新特性,用于表示可能为`null`的值,以避免空指针异常。 2. **集合框架**:Java 1.8对集合框架进行了优化,引入了流(Stream)API。流允许对集合进行声明式、函数式的处理,支持...

    java8 API 文档

    Java 8 API 文档是Java开发人员的重要参考资料,它详细阐述了Java 8及更高版本中的各种类库、接口和方法。这个文档包含了Java SE(标准版)8的所有公共API,是理解和使用新特性的关键工具。让我们深入探讨Java 8 API...

    java经典面试题3

    在Java中,引用类型的值传递实际上是引用的传递。当你将一个引用类型作为参数传递给方法时,实际上传递的是指向该对象的引用,而不是对象本身。这意味着,如果在方法内部修改了对象的状态,这种修改会影响到原始对象...

    AIC的Java课程1-6章

    第4章 面向对象(封装) 4课时  理解类封装属性(数据成员)和行为(方法成员),区别类和对象。  能够定义类,创建类的对象(实例化类)和通过对象引用访问数据成员和方法成员;形成定义类和使用类...

    一个Java 8+的LangChain实现。在(企业)Java环境中构建强大的基于LLM的应用程序.zip

    5. **Optional类**:Java 8的`Optional&lt;T&gt;`类用于处理可能缺失的值,防止空指针异常。在处理文本数据时,LangChain可能用`Optional`来表示某些可能不存在的结果,提高代码的健壮性。 6. **日期和时间API**:在处理...

Global site tag (gtag.js) - Google Analytics