Java基础03-方法与数组

方法

方法的定义

在Java中,方法是一组执行特定任务的代码块。方法定义由以下几个部分组成:

修饰符 返回类型 方法名(参数列表) {// 方法体
}
  • 修饰符:指定方法的访问权限(public、private等)。
  • 返回类型:指定方法返回值的类型,如果方法不返回值,使用 void
  • 方法名:定义方法的名称。
  • 参数列表:定义方法接受的参数,可以有零个或多个。
  • 方法体:包含方法实际执行的代码块。

一个简单的例子:

public int add(int a, int b) {return a + b;
}

方法的形参与实参

  • 形参(形式参数):在方法定义中声明的变量,用于接收传递给方法的值。
  • 实参(实际参数):在方法调用时提供的具体值,赋给方法定义中的形参。

例如,在上述add方法中,ab就是形参,而在调用方法时传递给它的具体数字就是实参:

int result = add(3, 5); // 这里的3和5就是实参

方法的返回值

  • 返回值是方法执行后产生的结果,它的类型由方法定义时指定的返回类型决定。
  • 如果方法声明为 void,表示不返回任何值。
  • 使用 return 语句将值返回给调用方。

例如,在前面的add方法中,返回类型是int,并使用 return a + b; 返回计算结果。

方法的重载

  • 方法重载是指在同一个类中,可以有多个方法具有相同的名称,但参数列表不同。
  • 重载方法的参数类型、个数或顺序必须不同。
  • 编译器根据调用的方法和提供的参数来决定调用哪个重载版本。

例如:

public int add(int a, int b) {return a + b;
}public double add(double a, double b) {return a + b;
}

这两个add方法是重载关系,一个接收整数,另一个接收双精度浮点数。

重载示例

public class BookManager {// 添加图书,接收图书名和作者public void addBook(String title, String author) {System.out.println("Added book: " + title + " by " + author);// 其他逻辑...}// 添加图书,接收图书名、作者和出版年份public void addBook(String title, String author, int year) {System.out.println("Added book: " + title + " by " + author + ", published in " + year);// 其他逻辑...}// 添加图书,接收图书名、作者、出版年份和ISBN号public void addBook(String title, String author, int year, String isbn) {System.out.println("Added book: " + title + " by " + author + ", published in " + year + ", ISBN: " + isbn);// 其他逻辑...}public static void main(String[] args) {BookManager bookManager = new BookManager();// 不同的方法版本,根据需要选择bookManager.addBook("The Catcher in the Rye", "J.D. Salinger");bookManager.addBook("To Kill a Mockingbird", "Harper Lee", 1960);bookManager.addBook("1984", "George Orwell", 1949, "978-0451524935");}
}

数组

数组的定义

  • 数组是一种存储相同类型数据的数据结构。在Java中,数组是对象,可以存储基本数据类型或对象。
  • 数组的定义包括声明和实例化两个步骤。

数组是引用类型,存在堆内存。

// 声明数组
数据类型[] 数组名;// 实例化数组
数组名 = new 数据类型[数组长度];

例如,声明并实例化一个整数数组:

int[] numbers;
numbers = new int[5]; // 创建一个包含5个整数的数组

数组的四种赋值方式

  • 数组元素可以通过索引进行赋值。数组的索引从0开始,最大索引是数组长度减1。

  • 使用默认的初始值来初始化数组中的每一个元素:

    int[] scores = new int[3];
    

    在这种方式中,scores 数组被初始化为包含3个整数的数组,每个元素都会被赋予默认的初始值,对于整数数组来说,默认初始值是0。

  • 先声明,然后再赋予默认的初始值:

    int[] scores;
    scores = new int[3];
    

    这种方式将数组的声明和实例化分成两个步骤,同样,scores 数组被初始化为包含3个整数的数组,每个元素被赋予默认的初始值。

  1. 先声明,然后再使用指定的值进行初始化:

    int[] scores = new int[]{56, 78, 98};
    

    在这种方式中,数组的声明和初始化在一行完成,同时指定了每个元素的具体值。

  2. 简化的数组常量值赋值方式:

    int[] scores = {56, 78, 98};
    

    这种方式是对第三种方式的简化,Java 编译器会根据提供的常量值自动确定数组的长度。

数组的遍历

求数组的长度 arr.length

  • 使用循环结构(如for循环或while循环)可以遍历数组中的所有元素。
int[] numbers = {10, 20, 30, 40, 50};// 使用for循环遍历数组
for (int i = 0; i < numbers.length; i++) {System.out.println(numbers[i]);
}// 使用增强for循环遍历数组(下面会详细介绍)
for (int num : numbers) {System.out.println(num);
}

增强for循环与可变参数:

  • Java 5及以上版本引入了增强for循环,用于简化数组和集合的遍历。
  • 可变参数(Varargs)是Java 5中引入的一种简化传递可变数量参数的语法。
// 增强for循环遍历数组
int[] numbers = {10, 20, 30};
for (int num : numbers) {System.out.println(num);
}// 可变参数的方法
public static void printNumbers(int... nums) {for (int num : nums) {System.out.println(num);}
}// 调用可变参数的方法
printNumbers(10, 20, 30, 40);

在增强for循环中,不需要使用索引,直接遍历数组中的每个元素。可变参数允许方法接受可变数量的参数,使得调用者在传递参数时更加灵活。在上面的例子中,printNumbers 方法可以接受任意数量的整数参数。

多维数组

二维数组

二维数组是数组的数组,每个元素都是一个一维数组。在 Java 中,你可以这样声明和初始化一个二维数组:

// 声明和初始化一个二维数组
int[][] twoDArray = new int[3][4];// 或者
int[][] anotherTwoDArray = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

上面的例子中,twoDArray 是一个 3x4 的二维数组,而 anotherTwoDArray 则是一个初始化后的 3x3 二维数组。

三维数组

同样,你可以创建三维数组:

// 声明和初始化一个三维数组
int[][][] threeDArray = new int[2][3][4];// 或者
int[][][] anotherThreeDArray = { { {1, 2}, {3, 4}, {5, 6} }, { {7, 8}, {9, 10}, {11, 12} } };

上述代码中,threeDArray 是一个 2x3x4 的三维数组,anotherThreeDArray 是一个初始化后的 2x3x2 三维数组。

访问多维数组的元素

访问多维数组的元素需要使用相应的索引。例如,访问二维数组的元素:

int value = twoDArray[1][2]; // 获取第二行第三列的值

同样,对于三维数组:

int value = threeDArray[0][1][2]; // 获取第一个“块”中的第二行第三列的值

注意事项

  • 数组索引从0开始。
  • 多维数组的各维度的大小可以不同,但每个维度的大小在声明时必须确定。

算法

当涉及到排序算法和查找算法时,Java 提供了很多灵活的工具,但了解一些基本的排序算法和查找算法仍然是很有用的。以下是冒泡排序、选择排序、插入排序和二分查找的简要介绍:

冒泡排序(Bubble Sort)

冒泡排序是一种基础的排序算法,它重复地遍历数组,每次比较相邻的两个元素,如果它们的顺序错误就交换它们,直到整个数组有序。

public class BubbleSort {public static void bubbleSort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (array[j] > array[j + 1]) {// 交换array[j]和array[j+1]int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}}
}

选择排序(Selection Sort)

选择排序是一种简单直观的排序算法,每次找到数组中的最小元素并将其放在已排序部分的末尾。

public class SelectionSort {public static void selectionSort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (array[j] < array[minIndex]) {minIndex = j;}}// 交换array[i]和array[minIndex]int temp = array[i];array[i] = array[minIndex];array[minIndex] = temp;}}
}

插入排序(Insertion Sort)

插入排序是一种简单直观的排序算法,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

public class InsertionSort {public static void insertionSort(int[] array) {int n = array.length;for (int i = 1; i < n; i++) {int key = array[i];int j = i - 1;while (j >= 0 && array[j] > key) {array[j + 1] = array[j];j--;}array[j + 1] = key;}}
}

二分查找(Binary Search)

二分查找是一种高效的查找算法,但要求数据是有序的。它通过将待查找区域缩小一半的方式快速定位目标元素。

public class BinarySearch {public static int binarySearch(int[] array, int target) {int low = 0;int high = array.length - 1;while (low <= high) {int mid = low + (high - low) / 2;if (array[mid] == target) {return mid; // 找到目标元素} else if (array[mid] < target) {low = mid + 1; // 在右半边继续搜索} else {high = mid - 1; // 在左半边继续搜索}}return -1; // 目标元素不在数组中}
}

这些算法是基础的排序和查找算法,理解它们有助于建立对算法的基本认识。在实际应用中,Java 的 Arrays 类提供了一些现成的排序算法,而查找算法可以使用 Arrays.binarySearch() 方法。

Arrays工具类

java.util.Arrays 类是 Java 标准库中提供的一个实用工具类,用于对数组进行各种常见操作,包括排序、搜索、比较等。这个类包含了大量的静态方法,使得数组处理更加方便和高效。以下是一些 Arrays 类的常用方法:

转换方法

  1. Arrays.toString() 方法用于返回指定数组的字符串表示形式。该方法将数组元素转换为字符串,并用逗号分隔,同时在数组的开头和结尾添加方括号。

    int[] arr = {1, 2, 3, 4, 5};
    String arrayString = Arrays.toString(arr);
    System.out.println(arrayString);
    
    [1, 2, 3, 4, 5]
  2. Arrays.asList() 方法用于将指定数组转换为一个固定大小的列表。

    import java.util.Arrays;
    import java.util.List;public class ArraysAsListExample {public static void main(String[] args) {// 创建一个数组String[] array = {"apple", "banana", "orange"};// 使用Arrays.asList()将数组转换为ListList<String> list = Arrays.asList(array);// 输出List的内容System.out.println("List: " + list);// 修改数组,会影响到列表array[0] = "grape";// 输出修改后的ListSystem.out.println("Modified List: " + list);}
    }
    
    List: [apple, banana, orange]
    Modified List: [grape, banana, orange]
    

排序方法

  1. sort(T[] array) 对数组进行升序排序。可以选择提供一个自定义的比较器。

    int[] arr = {3, 1, 4, 1, 5, 9, 2, 6};
    Arrays.sort(arr);
    
  2. parallelSort(T[] array) 类似于 sort 方法,但是可以在多线程环境中并行执行排序,提高性能。

    int[] arr = {3, 1, 4, 1, 5, 9, 2, 6};
    Arrays.parallelSort(arr);
    

操作数组元素的方法

  1. fill(T[] array, T val) 将数组的所有元素都设置为指定的值。

    int[] arr = new int[5];
    Arrays.fill(arr, 42);
    
  2. copyOf(T[] original, int newLength)
    copyOfRange(T[] original, int from, int to)
    用于复制数组的一部分或整个数组。

    int[] arr = {1, 2, 3, 4, 5};
    int[] copy = Arrays.copyOf(arr, arr.length);
    System.out.println("copy = " + Arrays.toString(copy));int[] copy1 = Arrays.copyOfRange(arr, 1, 3);
    System.out.println("copy1 = " + Arrays.toString(copy1));int[] destinationArray = new int[arr.length];
    System.arraycopy(arr, 0, destinationArray, 0, arr.length);
    System.out.println("destinationArray = " + Arrays.toString(destinationArray));
    copy = [1, 2, 3, 4, 5]
    copy1 = [2, 3]
    destinationArray = [1, 2, 3, 4, 5]
    

搜索方法

  1. binarySearch(T[] a, T key)binarySearch(T[] a, int fromIndex, int toIndex, T key) 使用二分查找算法在有序数组中搜索指定元素。

    int[] arr = {1, 2, 3, 4, 5};
    int index = Arrays.binarySearch(arr, 3);
    System.out.println("index = " + index);
    
    index = 2
    

比较方法

  1. equals(T[] a, T[] a2) 比较两个数组是否相等。

    int[] arr1 = {1, 2, 3};
    int[] arr2 = {1, 2, 3};
    boolean isEqual = Arrays.equals(arr1, arr2);
    System.out.println("isEqual = " + isEqual);
    
    isEqual = true
  2. deepEquals(Object[] a1, Object[] a2) 深度比较两个对象数组是否相等(适用于多维数组)。

    int[][] arr1 = {{1, 2}, {3, 4}};
    int[][] arr2 = {{1, 2}, {3, 4}};
    boolean isEqual = Arrays.deepEquals(arr1, arr2);
    System.out.println("isEqual = " + isEqual);
    
    isEqual = true

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

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

相关文章

mybatisPlus beforeGetBoundSql和setProperties使用场景介绍及代码示例

beforeGetBoundSql 和 setProperties 都是 InnerInterceptor 接口中定义的默认方法&#xff0c;可以用于自定义拦截器实现。 beforeGetBoundSql 方法会在 MyBatis 获取 BoundSql 对象之前被调用&#xff0c;可以通过该方法来修改或扩展 SQL 语句&#xff0c;例如添加或删除条件…

利用Spring Cloud和Java系统设置优化工程项目管理系统源码的二次开发体验

工程项目管理涉及众多环节和角色&#xff0c;如何实现高效协同和信息共享是关键。本文将介绍一个采用先进技术框架的Java版工程项目管理系统&#xff0c;该系统支持前后端分离&#xff0c;功能全面&#xff0c;可满足不同角色的需求。从项目进度图表到施工地图&#xff0c;再到…

不忘初心,聚焦安全 —— 一名码龄15年的老程序员2023总结

2023总结 1. 整体回顾2. 亮点工作3. 未来展望 1. 整体回顾 作为一名码龄超15年的老程序员&#xff0c;虽然2008年就注册了CSDN博客&#xff0c;但是从2020年疫情以来才开始偶尔写写博客&#xff0c;前面两年虽然写了不少&#xff0c;但基本属于自娱自乐&#xff0c;粉丝量和阅…

匿名函数自调用的不同写法

匿名函数自调用&#xff0c;即函数只执行一次 匿名函数自调用一般写法为: (function(){ //具体内容 }() 其他写法如下&#xff1a; !function(){}() function(){}() ~function(){}() 初次外&#xff0c;前面还可以是&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/

RxJS之fromEvent学习

有情提示&#xff1a; 阅读此博客前&#xff0c;可先阅读博客https://blog.csdn.net/qq_44327851/article/details/135251408对RxJS进行简单的了解。 概念&#xff1a; fromEvent 是 RxJS 中的一个操作符&#xff0c;用于将事件转换为可观察的对象。它的作用是创建一个可观察对…

熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握

可用性的定义 在探讨高可用架构之前&#xff0c;让我们以 O2 系统为例&#xff0c;解释一下何谓可用性。O2 是腾讯内部的一个广告投放系统&#xff0c;专注于提升投放效率、分析广告效果&#xff0c;拥有自动化广告投放、AIGC 自动化素材生产等多种功能。 其整体架构概览如下&…

Java最新技术介绍和分析 (202305)

说明&#xff1a;本文完成了2023年5月份&#xff0c;当时最新的LTS版本是Java17&#xff0c;本文在撰写时参考了美团技术团队和阿里JDK团队相关的文章&#xff0c;以及本文也引了用文章中的图片。在此表示感谢&#xff01; Java版本火车 相信老牌的Java开发者和爱好者把Java的…

【技巧】IDEA 使用小技巧(三)

IDEA 使用小技巧&#xff08;三&#xff09; 配置目录Ctrl 鼠标方法缩小字体 配置目录 IDEA 在使用的过程中会在 C 盘的用户目录下写入相关配置&#xff0c;目录如下&#xff1a; "C:\Users\个人用户名\AppData\Local\JetBrains" "C:\Users\个人用户名\AppDa…

Java实现限流算法

限流算法是指在分布式系统中控制流量的一种方法。它用于防止系统被过多的请求拥塞而导致性能下降或崩溃。 常见的限流算法有以下几种&#xff1a; 固定窗口算法&#xff08;Fixed Window Algorithm&#xff09;&#xff1a;将时间划分为固定的时间窗口&#xff0c;每个时间窗口…

Halcon顶帽运算与底帽运算的应用

Halcon顶帽运算与底帽运算的应用 文章目录 Halcon顶帽运算与底帽运算的应用1. 提取小的物件2. 校正非均匀光照 正如上文所说的&#xff0c;顶帽运算返回的像素部分是尺寸比结构元素小的&#xff0c;并且比较亮的局部小区域&#xff1b;底帽运算返回的像素部分是尺寸比结构元素小…

打造炫酷粒子效果的前端利器tsParticles

前端潮流速递 &#xff1a;打造炫酷粒子效果的前端利器tsParticles 在现代前端开发中&#xff0c;动画和视觉效果是吸引用户的关键元素之一。而实现炫酷而引人入胜的粒子效果&#xff0c;常常需要耗费大量的时间和精力。然而&#xff0c;有了 tsParticles&#xff0c;这一切变…

找不到pixman_region32_init代码实现的原因

我们在pixman直接查找pixman_region32_init实现会找不到&#xff0c;原因在于PREFIX宏 1、在pixman-region32.c和pixman-region16.c有很大关系&#xff0c;以pixman-region32.c为例 #ifdef HAVE_CONFIG_H #include <pixman-config.h> #endif #include "pixman-priva…

网络安全—PGP8.1软件应用

文章目录 安装PGP8了解工作原理 PGP使用准备工作加密与解密加密者视角&#xff08;发送方&#xff09;接收者视角&#xff08;接收方&#xff09; 签名签名方&#xff08;发送方&#xff09;验证签名方&#xff08;接收方&#xff09; 补充加密签名一段文字签名后的格式 验证解…

Java中关键词strictfp有什么作用?

在Java中&#xff0c;关键词strictfp用于声明一个方法、类或接口是严格遵守浮点数计算规范的。 具体作用包括&#xff1a; 保证浮点数计算的结果在不同平台上是一致的&#xff0c;避免由于浮点数计算的不精确性导致的结果不确定性。 指定了严格的浮点数计算规则&#xff0c;禁…

186.【2023年华为OD机试真题(C卷)】整数编码(JavaPythonC++JS实现)

请到本专栏顶置查阅最新的华为OD机试宝典 点击跳转到本专栏-算法之翼:华为OD机试 🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 【2023年华为OD机试真题(C卷)】整数编码(Java&…

K8s 中Pod无法启动5个常见问题总结

一、ImagePullBackOff Kubernetes pod 无法启动的原因之一是运行时无法从注册表中检索容器镜像。换句话说&#xff0c;pod 不会启动&#xff0c;因为至少有一个在清单中指定的容器没有启动。 当 pod 遇到此问题时&#xff0c;kubectl get pods 命令会将 pod 的状态显示为Image…

【解决】Unity 设置跨设备分辨率表现

开发平台&#xff1a;Unity 2018版本以上 开发语言&#xff1a;CSharp 编程平台&#xff1a;Visual Studio 2022   问题描述 使用 UnityEngine.dll 中关于设置分辨率的方法时&#xff0c;无法满足应用以设定分辨率进行屏幕显示问题。因而造成画面不同程度的拉伸情况。而这种情…

机器学习-基于Word2vec搜狐新闻文本分类实验

机器学习-基于Word2vec搜狐新闻文本分类实验 实验介绍 Word2vec是一群用来产生词向量的相关模型&#xff0c;由Google公司在2013年开放。Word2vec可以根据给定的语料库&#xff0c;通过优化后的训练模型快速有效地将一个词语表达成向量形式&#xff0c;为自然语言处理领域的应…

threejs中group下绑定唯一key导致parten丢失的问题

技术架构 reactthreejsreact-three/dreireact-three/fiberuse-gesture/react 场景 一个分组下有一个Line&#xff0c;当使用gesture的useDrag触发事件以后&#xff1a; import { Line } from react-three/drei import { ThreeEvent, useFrame } from react-three/fiber imp…