
java第三话:从数组来了解java中的引用和java中的传址操作
谈到引用类型,我们不可避免的要说到new这个关键字
发布日期:2021-05-04 20:08:16
浏览次数:24
分类:技术文章
本文共 3564 字,大约阅读时间需要 11 分钟。
从数组来真正开始了解java与C的区别
上一话中,我们谈到了java中的数据类型和操作符,我们有一种感觉,就是和C感觉没有很大差别
那么从这篇博文中,我们就可以真正了解一些不一样的东西 首先,让我们来了解一下数组吧!数组
java中如何创建数组
那么什么是数组呢?即储存相同元素的集合
在java中,我们可以有如下定义数组的方式int[] arr1 = { 1,2,3,4,5,6,7,8,9}; int[] arr2 = new int[]{ 1,2,3,4,5,6,7,8,9,10}; int[] arr3 = new int[20]; System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); System.out.println(Arrays.toString(arr3)); //输出结果: //[1, 2, 3, 4, 5, 6, 7, 8, 9] //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
如何访问和修改数组
既然知道了如何创建数组,我们再来了解一下如何对数组进行访问和修改
同C语言一样,java中的数组可以用’[ ]'来对数组进行访问,如下面代码int[] arr = new int[50];//数组名.length可以获取数组的长度 for (int i = 0; i < arr.length; i++) { arr[i] = i+1; } for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } //输出结果: //1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 // 44 45 46 47 48 49 50
foreach循环
java中还有一个特别的遍历方式就是foreach循环
int[] arr = { 1,2,3,4,5,6,7,8,9,10}; for (int x:arr) { //格式 临时变量:数组名 System.out.print(x+" "); } //输出结果: //1 2 3 4 5 6 7 8 9 10
foreach的代码意思是每次循环的时候会定义一个临时变量x(或者其他),同时将数组的元素拷贝在x上,然后对x进行操作。(所以无法用foreach对数组进行赋值,只能读取数组的值)
如何在java中进行传址操作
引用
我们知道如果在一个方法(或者函数中)想要交换传进来的两个值,如果只进行传值操作是无法完成两个数的交换的,如下图代码
public static void main(String[] args) { int a = 10; int b = 20; System.out.println(a); System.out.println(b); swap(a,b); System.out.println(a); System.out.println(b); } public static void swap(int a,int b){ int tmp = a; a = b; b=tmp; } //输出结果: //10 //20 //10 //20
当然,在C语言中我们可以使用&来获取地址从而进行传址操作来解决这个问题,那么在java中如何解决这种问题呢?
那就是传引用 何为引用? 在这里我们就要回想到java的数据类型,在上文中我们说过,java有八大基本数据类型还有引用类型,如下图
new关键字
new可以简单理解为创建对象的关键字,也可理解为在堆区开辟内存的关键字,如下图代码
public static void main(String[] args) { int[] arr = new int[10]; }
接下来让我们来分析一下这段代码有什么具体含义,我们用下图来做为讲解
当函数运行到main函数的时候,会在栈区为main函数开辟一块栈帧(也就是内存块),然后,我们创建了一个名叫arr的数组。 使用new关键字在堆区开辟了一块内存区域,用来存储新创建的对象。 这时,数组名就存储在栈帧中,这个数组名就叫做引用,那么存储的是啥呢?是数组在堆区中所存放的地址。 (这里我们假设数组在堆区的地址是0x555,那么arr这个引用存储的也就是0x555)我们可以做一个小实验来证明引用中存的是否是地址,具体看下图代码
public static void main(String[] args) { int[] arr1 = { 1,2,3,4,5,6,7,8,9}; int[] arr2 = new int[]{ 1,2,3,4,5,6,7,8,9,10}; int[] arr3 = new int[20]; System.out.println(arr1); System.out.println(arr2); System.out.println(arr3); } //输出结果: //[I@1b6d3586 //[I@4554617c //[I@74a14482
可见,数组名存的是地址,但是,虽然是地址,但java中并没有指针,因此也就没有了很多像C一样对指针的操作。
由此,我们受到启发,java中引用类型的引用存的是地址,是所对应的对象的地址传引用
回到我们交换两个数的问题,我们就可以通过传数组来解决
public static void main(String[] args) { int[] arr = { 10,20}; System.out.println(arr[0]); System.out.println(arr[1]); swap(arr); System.out.println(arr[0]); System.out.println(arr[1]); } public static void swap(int[] arr){ int tmp = arr[0]; arr[0] = arr[1]; arr[1]=tmp; } //输出结果: //10 //20 //20 //10
为啥传引用可以解决这个问题呢?因为引用里面存的是地址,我们对引用进行操作,相当于直接在堆区里面操作数组,所以,直接修改的就是数组本身,也就达到了我们的效果。
最后,我们来做一个小总结
java中的引用是什么?是一个地址。 java中如何进行传址操作? 通过传引用。 (具体理解栈区和堆区里,引用和对象的关系很重要) 到这,我相信你已经对java的引用和java传址操作有了一定了解了,至于更多有关数组的知识,我会在之后的博文中更新,希望这篇文章对你有所帮助。感谢观看,如有错误,欢迎指正。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月28日 09时00分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【Java面试】30个 Java 集合面试必备的问题和答案
2019-03-03
干了八年的阿里面试官,给大家分享我面试时最爱问的Java面试题
2019-03-03
华为鸿蒙到底是不是安卓系统套了个壳?
2019-03-03
redis知识点学习
2019-03-03
vue出现sockjs-node/info?t=1462183700002 报错解决方案
2019-03-03
删除mongodb中已存在的用户
2019-03-03
分布式理论基础知识点入门
2019-03-03
SpringCloud之消息总线(Spring Cloud Bus)刷新配置
2019-03-03
多线程之创建线程的两种方式
2019-03-03
fragment中recyclerview的重新加载问题
2019-03-03
集合 List
2019-03-03
window程序设计(1):第一个windows程序
2019-03-03
windows程序设计(4):文本输出
2019-03-03
JZOJ7月29日提高组反思
2019-03-03
21.2.3总结
2019-03-03
线性代数和数学期望杂题
2019-03-03
21.2.4总结
2019-03-03
【SSL_P2876】2017年东莞市信息学特长生测试题 工程
2019-03-03
【洛谷_P1433】吃奶酪
2019-03-03