java 11:数组作为函数参数,数组做为函数返回值

1 数组作为参数

我们可以将数组作为参数,传入到函数中,其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数;

又如,

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class ArrayPar  
  2. {  
  3.     public static void printArray(int [] array)  
  4.     {  
  5.         for(int i=0;i<array.length;i++) 
  6.             System.out.print(array[i]+"  ");  
  7.     }  
  8. }  
我们可以这样调用 ArrayPar.printt(new int[ ]{3,2, 5,67});调用数组

这里的new int[ ]{3,2,5,67};他也是一种创建数组的方法,只是这种方法创建出来的数组是没有名字的,所以叫匿名数组。很多时候在只使用一次的时候可以使用匿名数组的方法法,类似的还有匿名类。

Java uses pass-by-value to pass arguments to a method. There are important differences
between passing the values of variables of primitive data types and passing arrays.
■ For an argument of a primitive type, the argument’s value is passed.
■ For an argument of an array type, the value of the argument is a reference to an array;
this reference value is passed to the method. Semantically, it can be best described as
pass-by-sharing, i.e., the array in the method is the same as the array being passed.
So if you change the array in the method, you will see the change outside the
method.

java 使用值传参(pass_by_value)的方式来传递函数参数,只是值传递方式在处理原始数据类型参数与引用类型参数时候有不同,如果一个参数是原始数据类型,那么参数变量的值传递进去。如果是引用类型,是传进了引用变量的值(也就是说,只是将指向数据的引用的值给传进去了,也就是被调用的函数新建的空间放的是这个引用的值,那么也就是也指向了数组存在的内存),所以同样是值传递,引用类型的传入的当然是引用变量的值,指向了同一数组,那么函数内对数组进行的修改在函数退出后依旧是有效的。

例子:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class ArrayPar  
  2. {  
  3.     public static void main(String [] args)  
  4.     {  
  5.         int x=1;  
  6.         int y[]={1,2,3};  
  7.         change(x,y);  
  8.         System.out.println("x="+x+",y[0]="+y[0]);  
  9.     }  
  10.     public static void change(int num,int [] array)  
  11.     {  
  12.         num=100;  
  13.         array[0]=100;  
  14.     }  
  15. }  

图形表示:


这里同时注意一下,当我们用new 以及malloc这些的内存空间是在堆上heap,而像我们被调用的函数中使用的这些变量等在栈上。在调用changes时候,x的值被传入,在被调用的函数中重新开辟一个空间来放这个基本数据类型参数,但是int [ ] y ,将y传入其实就是传入了引用,在被调用的函数的栈上只会开辟一个空间来存放这个引用,所以被调用的函数与调用者 中两个引用指向堆上同一块内存。


2 数组做为函数返回值

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public static<span style="color:#ff0000;"int []</span> reverse(int [] array)  
  2. {  
  3.     int [] result=new int[array.length]  
  4.     for(int i=0;i<array.length;i++)  
  5.     {  
  6.         result[i]=array[lenght-i];  
  7.     }  
  8.     return result;
  9. }  
在将数组作为函数返回值时候如上红色标出的,就是在函数名字前加上返回值类型是int [ ] 表示返回一个int型数组,在函数体内最后返回是result这样的函数引用。


Case Study: Counting the Occurrences of Each Letter

write a program to count the occurrences of each letter in an random array of  lower  characters.

那么我们可以怎么做呢?

1)首先是要产生一个随机char数组  creatArray();(是否记得前边说过产生[a,a+b)之间的一个随机数 为  a+Math.random()*b,是否记得我们创建过获取任意字符的一个类?)

2) 创建一个数组 int [ ] count,长度26,准备来存放各个字母的计数

3)对数组进行循环 , 每读取一个字母ch,则 count[ch-'a']++;

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. class RandomChar  
  2. {  
  3.     public static char getRandomChar(char ch1,char ch2)  
  4.     {  
  5.         return (char)(ch1+Math.random()*(ch2-ch1+1));  
  6.     }  
  7.     public static char getLowerCaseLetter()  
  8.     {  
  9.         return getRandomChar('a','z');  
  10.     }  
  11.     public static char getUpperCaseLetter()  
  12.     {  
  13.         return getRandomChar('A','Z');  
  14.     }  
  15.     public static char getDigitalLetter()  
  16.     {  
  17.         return getRandomChar('0','9');  
  18.     }  
  19.     public static char getRandomLetter()  
  20.     {  
  21.         return getRandomChar('\u0000','\uFFFF');  
  22.     }  
  23. }  
  24. public class CountOccur  
  25. {  
  26.     public static void main(String [] args)  
  27.     {  
  28.          char [] array=CreateArray();  
  29.          int [] count = new int[26];  
  30.          for(int i=0;i<array.length;i++)  
  31.          {  
  32.              count[array[i]-'a']++;  
  33.          }  
  34.          for(int i=0;i<count.length;i++)  
  35.          {  
  36.             System.out.print((char)(i+'a')+": "+count[i]+"    ");  
  37.             if((i+1)%10==0) System.out.println();  
  38.          }  
  39.            
  40.            
  41.     }  
  42.     //产生一个100个元素的小写随机数组  
  43.     public static char[] CreateArray()  
  44.     {  
  45.         char [] a=new char[100];  
  46.         for(int i=0;i<a.length;i++)  
  47.         {  
  48.             a[i]=RandomChar.getLowerCaseLetter();  
  49.         }  
  50.         return a;  
  51.     }  
  52. }  



3 可变长度参数列表

You can pass a variable number of arguments of the same type to a method. The parameter in
the method is declared as follows:
typeName... parameterName
In the method declaration, you specify the type followed by an ellipsis Only one vari-
able-length parameter may be specified in a method, and this parameter must be the last para-
meter. Any regular parameters must precede it.
Java treats a variable-length parameter as an array. You can pass an array or a variable
number of arguments to a variable-length parameter. When invoking a method with a variable
number of arguments,
Java creates an array and passes the arguments to it

我们可以传递类型相同,但个数可以变化的参数到函数中,如果有这个需求的话,这时候我们只需要在形式参数中使用 typename...parameterName就可以达到这个目的,要注意,在这里声明的该变长参数必须是最后一个参数,任何常规参数必须在他之前,也就是说你可以有 MethodName(char b, double c, int ... nums) 这样的形式即int ... nums必须在最后一个位置,你不能将int ... nums 声明在参数参数列表的非最后位置。

java将可变长参数当做数组对待。可以将一个数组或者可的参数个数传递给该参数(注意,我们这里说该参数就是 typeName ... parameterName这整个结构),无论哪种形式,java会创建一个数组并把参数传给他,注意这里体会原文说的When invoking a method with a variable
number of arguments, java Create an array and passes the arguments to it
,也就是说,如果你是传入几个变长的变量,那么在调用时候java先将创建一个数组来装这几个实际参数,然后再执行调用的函数,如果本身我们传入一个数组,其实他并不会创建一个新的数组来装,还是一样像上面指向了已经分配的数组空间,所以在被调用的函数中对数组的改变在退出时候还是有效的(这是我用例子试了下体会到的)

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class VariablePar  
  2. {  
  3.     public static void main(String [] args)  
  4.     {  
  5.         int array[]={1,4,7,2,0};  
  6.         System.out.println("max="+findMax(array));  
  7.         ifChange(array);  
  8.         System.out.println("array[0]="+array[0]);  
  9.         ifChange(1,45,33);  
  10.     }  
  11.     public static int findMax(int ... nums)  
  12.     {  
  13.         if(nums.length==0)   
  14.         {  
  15.             System.out.println("No argumment passed");  
  16.             return -1;  
  17.         }  
  18.         int max=nums[0];  
  19.         for(int i=1;i<nums.length;i++)  
  20.         {  
  21.             if(max<nums[i]) max=nums[i];  
  22.         }  
  23.         return max;  
  24.     }  
  25.     //测试这里究竟是新创建一个数组还是相当于把引用传进来而已  
  26.     public static void ifChange(int ... nums)  
  27.     {  
  28.         nums[0]=100;  
  29.     }  
  30. }  
这里,我们从findMax中看到,他不用先说明 什么就可以直接使用nums.lenght 说明确实java是完全将这类型的参数当做一个数组来处理了,二在ifChange中,我们看到输出的是array[0]=100,说明我们在调用ifChange(array)时候并不是重新创建一个新的数组,而是还是一样像前边的传入了引用,被调用者还是指向了相同的数组空间。但是在ifChage(1,45,33)这个调用时候,java就会先new int[ ]{1,45,33} 这样,然后形参nums再指向它,其实这样返回后应该就不会改变了1的值吧?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 指针基本概念

Ⅰ.内存和地址 我们已经很熟悉一些基本的存储单位了,比如一个bit(位)用存储0或者1.也可以把几个bit合起来表示更大的数字,比如一个byte(字节)就包含了8个bit.这些都是很基础很简单的东西.然后我们可以把计算机的内存想象成一个字节数组,内存中的每一个地址表示一个字节. 每个字…

Java 7:使用NIO.2进行文件过滤–第2部分

大家好。 这是使用NIO.2系列进行文件过滤的第2部分。 对于那些尚未阅读第1部分的人 &#xff0c;这里有个回顾。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以执行与java.io相同的操作&#xff0c;以及许多出色的功能&#xff0c;例如&a…

机器人教育发展_得于人工智能发展,机器人教育低龄化越来越普及

近两年&#xff0c;各种看得到看不到的渠道都在推荐学机器人少儿编程&#xff0c;虽有利益使然&#xff0c;不过机器人少儿编程也确实算得上是通往世界名校大门的快速通道。相信很多家长也同样能感到&#xff0c;最近这股风刮得实在是太大&#xff0c;以至于周围的家长们都开始…

C#相对路径

1、 根目录 .\\ 或者直接给出文件名称&#xff0c;是找根目录的路径。 如&#xff1a;path "gs.mdb" 与 path ".\\gs.mdb"是一个意思。 2、 根目录的上级目录, 在C#中是指定到bin文件夹里面 ..\\ 应用程序的根目录的上两级 3、指定到根目录上面的三级目录…

java finalize方法的使用

《JAVA编程思想》&#xff1a; Java提供finalize()方法&#xff0c;垃圾回收器准备释放内存的时候&#xff0c;会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4).垃圾回收和finalize()都是靠不住的&#xff0c;只要…

C++ 运算符优先级

优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号&#xff08;表达式&#xff09;/函数名(形参表) .成员选择&#xff08;对象&#xff09;对象.成员名 ->成员选择&#xff08;指针&#xff09;对象指针->成员名 2-负号运算符-表…

另一个拼图观点

在过去的几周中&#xff0c;围绕即将发布的Java 9及其最著名的功能&#xff1a;Java平台模块系统JPMS展开了激烈的辩论。 –以项目拼图Jigsaw的名称而闻名。 模块系统以正式规范过程的形式引入Java生态系统 – JSR –需要由专家组以最终形式批准。 在该专家组的其他成员中&am…

Cookie中不能有空格_前端小贴士 -- 全面了解Cookie

一、Cookie的出现浏览器和服务器之间的通信少不了HTTP协议&#xff0c;但是因为HTTP协议是无状态的&#xff0c;所以服务器并不知道上一次浏览器做了什么样的操作&#xff0c;这样严重阻碍了交互式Web应用程序的实现。针对上述的问题&#xff0c;网景公司的程序员创造了Cookie。…

线程面试题

1.在使用线程时&#xff0c;为什么不直接调用run()方法而是调用了start(): 直接调用run()方法&#xff0c;不存在线程的启动&#xff0c;属于调用实例方法&#xff0c;只有一条执行路径&#xff0c;不存在多线程并行交替执行了。调用start()方法属于启动线程&#xff0c;将自动…

Java IO - Reader

前言 JavaIO一共包括两种&#xff0c;一种是stream&#xff0c;一种是reader/writer&#xff0c;每种又包括in/out&#xff0c;所以一共是四种包。Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符&#xff0c;分别操作字符、字符数组或字符串&…

python程序设计语言的执行方式_编程语言用Python执行程序的4种方式

在编写代码中&#xff0c;经常会遇到在 Python程序中打开外部程序的需求&#xff0c;那么在Python里如何打开外部程序呢?今天我们来介绍四种不同的方式&#xff0c;供大家参考收藏。 使用 os.system() os.system(command)是最简单的一种方式&#xff0c;我们import os模块&…

leetcode 994.腐烂的橘子

题目&#xff1a; 在给定的网格中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。每分钟&#xff0c;任何与腐烂的橘子&#xff08;在 4 个正方向上&#xff09;相邻的新鲜橘子都会…

运行时异常和检查性异常区别

Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常&#xff0c;以及SQL异常都是这种异常。对于这种异常&#xff0c;JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以&#xff0c;面对这种异常不管我们是否愿…

VS2015配置freegult

与vs配置opencv类似 1.首先先找到自己系统里OpenGL相关.h.lib .dll的位置 一般系统里已自带&#xff0c;只要去找到就好&#xff0c;我的位置&#xff1a; gl.h C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl OpenGL32.Lib GlU32.Lib C:\Program Files\Microsoft…

java 死锁的检测与修复_调查死锁–第4部分:修复代码

java 死锁的检测与修复在这个简短的博客系列的最后BadTransferOperation中&#xff0c;我一直在讨论分析死锁&#xff0c;我将修复BadTransferOperation代码。 如果您已经看过本系列的其他博客 &#xff0c;那么您会知道&#xff0c;为了达到这一点&#xff0c;我创建了死锁演示…

python下载url_三种Python下载url并保存文件的代码详解

利用程序自己编写下载文件挺有意思的。 Python中最流行的方法就是通过Http利用urllib或者urllib2模块。 当然你也可以利用ftplib从ftp站点下载文件。此外Python还提供了另外一种方法requests。 来看看三种方法是如何来下载zip文件的&#xff1a; import urllib import urllib2 …

springcloud(七)-Feign声明式REST调用

前言 前面我们使用的RestTemplate实现REST API调用&#xff0c;代码大致如下&#xff1a; public User findById(PathVariable Long id) {return restTemplate.getForObject("http://localhost:8084/" id, User.class);} 由代码可知&#xff0c;我们是使用拼接字符串…

OpenGL 各类库的解析gl glu glut freeglut glfw glew

gl.h gl库是核心库&#xff0c;gl中包含了最基本的3D函数&#xff0c;可以再本地电脑中的&#xff1a; C:\Program Files (x86)\MicrosoftSDKs\Windows\v7.0A\Include\gl 路径下找到gl.h头文件&#xff0c;打开后可以看到其中定义的上百个相关函数。 glu.h glu是实用库&#xf…

Java中throw和throws的区别

系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出&#xff0c;称为标准异常&#xff0c;并且 Java 强烈地要求应用程序进行完整的异常处理&#xff0c;给用户友好的提示&#xff0c;或者修正后使程序继续执行。 语句抛出的异常 用户程序自定义的异常和应…

面试问题:检查牙套

这是较容易的编码任务之一&#xff0c;但是您仍然可以在一些初步的技术筛选中达到要求。 问题看起来像这样&#xff1a; 给定仅包含字符( &#xff0c; ) &#xff0c; { &#xff0c; } &#xff0c; [和]的字符串&#xff0c;请确定输入字符串是否有效。 括号必须以正确的顺…