java 引用类型的数据传递的是内存地址实例

目录
  • java 引用类型的数据传递的是内存地址
    • 看下面的代码和截图
  • list集合存引用数据类型时的问题
    • 集合list的存储元素

java 引用类型的数据传递的是内存地址

java中引用类型的数据,传递的是内存地址,像类,数组,接口,String等等都是引用类型!

看下面的代码和截图

public class Test2 {
	// java中引用类型的数据传递的是内存地址
	private Map<String, Student> students = new Hashtable<String, Student>();
	public void myTest() {
		Student student1 = new Student("令狐冲", 16, "华山派", 19888.66);
		Student student2 = new Student("韦小宝", 15, "紫禁城", 99999.99);
		Student student3 = new Student("张无忌", 18, "光明顶", 18888.88);
		students.put("1", student1);
		students.put("2", student2);
		students.put("3", student3);
		Iterator<Map.Entry<String, Student>> entries = students.entrySet().iterator();
		while (entries.hasNext()) {
			Map.Entry<String, Student> entry = entries.next();
			System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
			entry.getValue().setAge(entry.getValue().getAge() + 1);
		}
	}

	public void myTest2(){
		List<String[]> citys = new ArrayList<String[]>();
		String [] cityNames = {"赣州市", "于都县", "江西省", "中国", "赣南地区"};
		citys.add(cityNames);
		for (int index = 0; index < citys.size(); index++) {
			String[] mycityNames = citys.get(index);
			for (int i = 0; i < mycityNames.length; i++) {
				System.out.println(mycityNames[i]);
				if (i == 1) {
					//修改mycityNames数组 (java中引用类型的数据传递的是内存地址)
					mycityNames[i] = "我们" + mycityNames[i];
				}
			}

			System.out.println("--------------------------------");
			for (int i = 0; i < mycityNames.length; i++) {
				System.out.println(mycityNames[i]);
			}
		}
		System.out.println("--------------------------------");
		//修改cityNames数组 (java中引用类型的数据传递的是内存地址)
		cityNames[0] = "我们赣州市";

		for (int index = 0; index < citys.size(); index++) {
			String[] mycityNames = citys.get(index);
			for (int i = 0; i < mycityNames.length; i++) {
				System.out.println(mycityNames[i]);
			}
		}
	}

	public static void main(String[] args) {
		Test2 test2 = new Test2();
		test2.myTest();
		System.out.println("--------------------------------");
		Iterator<Map.Entry<String, Student>> entries = test2.students.entrySet().iterator();
		while (entries.hasNext()) {
			Map.Entry<String, Student> entry = entries.next();
			System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
		}
		test2.myTest2();
	}
}

list集合存引用数据类型时的问题

集合list的存储元素

(1)如果list中存的是基本数据类型,则存的是值

(2)如果list中存的是引用数据类型(如对象等),则存的是引用

如果对象的引用地址没变,内容变化,也会引起调用该对象时内容变化

下面举一个在集合list中存放对象的例子:

  //构建原始数据
        ArrayList<Goods> list = new ArrayList();
        Goods goods1=new Goods("plum ", 2);
        list.add(goods1);
        list.add(new Goods("apple", 1));
        list.add(new Goods("banana", 2));

        //打印原始数据
        System.out.println("原始数据:");
        for(Goods goods : list){
            System.out.println(goods);
        }
        goods1.setGoodsId(444);//改变goods1的内容
        System.out.println("原始数据1:");
        for(Goods goods : list){
            System.out.println(goods);
        }

结果:

原始数据:
Goods{goodsName='plum ', goodsId=2}
Goods{goodsName='apple', goodsId=1}
Goods{goodsName='banana', goodsId=2}
原始数据1:
Goods{goodsName='plum ', goodsId=444}
Goods{goodsName='apple', goodsId=1}
Goods{goodsName='banana', goodsId=2}

结果表明:由于list中存储对象的引用所指的内容发生了变化,所以导致了list中元素内容的改变

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java的数据类型和参数传递(详解)

    Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型. Java中的基本数据类型 名称 大小 取值范围 byte型 (字节) 8bit -128-127 (-2^7到2^7-1) short型 (短整型) 16bit -2^15到2^15-1 int型 (整形) 32bit -2^31到2^31-1 long型 (长整型) 64bit -2^63到2^63-1 float型 (单精度浮点型) 32bit double型 (双精度浮点型) 64bit char型 (字符型) 16bit

  • 详解Java引用类型的参数也是值传递

    简述 调用方法的时候,有需要传参数的情况.在Java中,参数的类型有基本类型和引用类型两种. 一开始听到一个说法,Java没有引用传递,但是一直没有太多的思考在上面,直到前不久玩数组的时候,突然间发现把数组引用变量作为参数传递到一个方法当中进行操作之后,再去访问原数组,尽然改变了.于是乎,就想到了之前在C++里面学过的引用传递,突然有一种错愕的感觉,就查了一些资料,探究当Java引用类型变量作为参数传递给方法的时候,到底是值传递还是引用传递. 结论:如果将Java引用类型变量作为参数传递给方法,

  • 解析java基本数据类型传递与引用传递区别

    java中方法参数传递方式是按值传递. 如果参数是基本类型,传递的是基本类型的字面量值的拷贝. 如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝. java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题,首先我们必须认识到这个问题一般是相对函数而言的,也就是java中的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法(或函数)的两个专业术语: 按值调用(call by value) 按引用调用(call by reference) 所谓的按

  • Java引用传递和值传递栈内存与堆内存的指向操作

    值传递: (形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值. 引用传递: (形式参数类型是引用数据类型参数):也称为传地址.方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数. 现有

  • java 引用类型的数据传递的是内存地址实例

    目录 java 引用类型的数据传递的是内存地址 看下面的代码和截图 list集合存引用数据类型时的问题 集合list的存储元素 java 引用类型的数据传递的是内存地址 java中引用类型的数据,传递的是内存地址,像类,数组,接口,String等等都是引用类型! 看下面的代码和截图 public class Test2 { // java中引用类型的数据传递的是内存地址 private Map<String, Student> students = new Hashtable<Strin

  • Java多线程之volatile关键字及内存屏障实例解析

    前面一篇文章在介绍Java内存模型的三大特性(原子性.可见性.有序性)时,在可见性和有序性中都提到了volatile关键字,那这篇文章就来介绍volatile关键字的内存语义以及实现其特性的内存屏障. volatile是JVM提供的一种最轻量级的同步机制,因为Java内存模型为volatile定义特殊的访问规则,使其可以实现Java内存模型中的两大特性:可见性和有序性.正因为volatile关键字具有这两大特性,所以我们可以使用volatile关键字解决多线程中的某些同步问题. volatile

  • python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例

    在pyqt5编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以,一般是添加一个按钮,调用对话框,在对话框中进行参数的选择,关闭对话框将参数返回给主窗口 pyqt提供了一些标准的对话框类,用于输入数据,修改数据,更改应用的设置等,常见的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之间传参数有两种常用的方式,一种在自定义对话框之间通过属性传参,另一种在窗口之间使用信号与槽机制传参

  • Java+MySql图片数据保存与读取的具体实例

    1.创建表: 复制代码 代码如下: drop table if exists photo;CREATE TABLE photo (    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,    name VARCHAR(100) COMMENT '名称',    photo blob COMMENT '照片')ENGINE=InnoDBDEFAULT CHARSET=utf8COLLATE=utf8_general_ci; 图片在MySql中的数据存储格式为

  • Java运行时数据区域(内存划分)的深入讲解

    1. 程序计数器(线程私有) 程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器(切换线程后,能恢复到正确的执行位置). 2. Java虚拟机栈(线程私有) (1) 概念   虚拟机栈描述的是Java方法执行的内存模型 : 每个方法执行的同时都会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口 等信息.每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中入栈和出栈的过程.声明周期与线程相同. 关于栈帧的理解: 创建启动一个线程,就创建了一个虚拟机

  • JAVA POST与GET数据传递时中文乱码问题解决方法

    做了N年的java开发从没有自己写过一个网站,最近乱忙活弄了一个企业家宣传网站. 跟大家一样遇到了中文字符集乱码问题,为了大家能少走一些弯路,所以在此分享一下即简单又实用的解决方法. 1. POST 数据传递 接收页 复制代码 代码如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% request.setCharacterEnco

  • java 将数据加载到内存中的操作

    将数据加载到内存中 1.建立InitListener.java package app.util; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletException; import javax.servlet.http.

  • Java调用Python脚本传递数据并返回计算结果

    需求:最近在使用基于Java编写的Cloudsim 4.0云仿真平台进行虚拟机动态迁移实验,由于中间有需要用到深度强化学习算法,因此需要将集群的状态表示为二维数组,比如物理机的计算能力Mips,RAM,带宽等等.希望将这样的二维数组传入到带torch等第三方库的Python脚本进行深度强化学习训练,所以就有二维int数组的传入,和从Python计算后的结果返回读取这个需求 一.实现思路:将Java中的data结构化为字符串,以命令行参数的形式传入Python中 目前有几种Java调用Python

  • 一文了解为什么Java中只有值传递

    目录 经典的问题 形参&实参 Java是值传递还是引用传递 传参的类型:基本数据类型 传参的类型:引用数据类型 尾语 经典的问题 Java 传参是值传递还是引用传递?这个问题很基础,但是许多人都有点懵 形参&实参 首先我们得了解关于参数的几个概念 形式参数:定义函数时使用的参数,用来接收函数传入参数,比如我们写个函数,函数中的参数为形式参数 public void test(String str) { //str为形式参数 System.out.println(str); } 实际参数:我

随机推荐