Java语言程序设计——篇五(2)

💥增强的for循环

增强的for循环,它是Java 5新增功能。用来迭代数组或对象集合的每个元素。
局限性:只能按顺序访问数组中元素。

它的一般格式为:

for(元素类型 变量名:数组名) {
// 循环体
}

例:输出marks数组中每个元素:

for( double score : marks ) {
       System.out.println(score);
  }
  • 每次从数组marks中取出一个元素,自动赋给score 。
  • 用户不用判断是否超出了数组的长度。
  • score的类型必须与数组marks中元素的类型相同。

实战演练

例:输出整型数组a中的元素内容

 public class Exam{
       public static void main(String[] args){
	 int [] a = {1,2,3,4};
	 for( int i : a )
	     System.out.println(i);
      }
}

数组元素的复制

1、一个元素一个元素复制。
2、使用System.arraycopy()方法。
3、使用Arrays类的copyOf()或copyOfRange()方法。

  • 1、一个元素一个元素复制
int []source = {10,20,30,40};  //源数组
int []target  = new int[source.length] ;//目标数组
for ( int i=0; i < source.length; i++ ){
         target[i]=source[i];
         System.out.print(target[i]+" ");
}
  • 2、使用System类的arraycopy()方法
public static void arraycopy(Object  src, int srcPos, 
                          Object dest, int destPos, int length)
src:源数组,即要从中复制元素的数组。
srcPos:源数组中的起始位置(包含),即从哪里开始复制元素。
dest:目标数组,即要复制元素进去的数组。
destPos:目标数组中的起始位置(包含),即从哪里开始放置复制的元素。
length:要复制的数组元素的数量。
例:
int []source = {10,20,30,40};  //源数组
int []target  = new int[source.length] ;//目标数组
System.arraycopy(source, 0, target, 0, 4);

arraycopy()方法可以将源数组的一部分元素复制到目标数组中

实战演练

package com.demo;
public class ArrayCopyDemo{
   public static void main(String[] args){
     int[] a = {1,2,3,4};
     int[] b = {8,7,6,5,4,3,2,1};
     int[] c = {10,20};
     try{
        System.arraycopy(a, 0, b, 0, a.length);
        // 下面语句发生异常,目标数组c容纳不下原数组a的元素
        System.arraycopy(a, 0, c, 0, a.length);
     }catch(ArrayIndexOutOfBoundsException e){
        System.out.println(e);
     }
     for(int elem: b){
       System.out.print(elem+"  ");
     }
     System.out.println();
     for(int elem: c){
       System.out.print(elem+"  ");
     }
     System.out.println("\n");
   }
}

运行结果:
在这里插入图片描述

  • 3、使用Arrays类的copyOf()或copyOfRange()方法。
    在Java中,Arrays 类提供了两个非常有用的静态方法用于数组的复制:copyOf() 和 copyOfRange()。这两个方法都是用来创建并返回指定数组的一个新副本,但它们之间有一些关键的区别。
    1. copyOf() 方法
    copyOf() 方法用于创建一个具有指定长度的新数组,并将原始数组的元素复制到新数组中。如果新数组的长度大于原始数组的长度,则新数组中的剩余元素将被初始化为该类型的默认值(例如,对于对象数组,这些元素将是 null;对于整数数组,它们将是 0)。
    语法:
public static T[] copyOf(T[] original, int newLength)
  • original 是要复制的原始数组。
  • newLength 是新数组的长度。
    示例
import java.util.Arrays;  
  
public class Main {  
    public static void main(String[] args) {  
        int[] original = {1, 2, 3};  
        int[] copy = Arrays.copyOf(original, 5); // 新数组长度为5,额外两个元素将初始化为0  
        System.out.println(Arrays.toString(copy)); // 输出:[1, 2, 3, 0, 0]  
    }  
}

2. copyOfRange() 方法
copyOfRange() 方法用于复制指定数组的指定范围到新数组中。你可以指定要复制的起始位置(包含)和结束位置(不包含),然后该方法会创建一个包含这些元素的新数组。

语法:

public static T[] copyOfRange(T[] original, int from, int to)
  • original 是要复制的原始数组。
  • from 是复制的起始位置(包含)。
  • to 是复制的结束位置(不包含)。
    示例
import java.util.Arrays;  
  
public class Main {  
    public static void main(String[] args) {  
        int[] original = {1, 2, 3, 4, 5};  
        int[] copy = Arrays.copyOfRange(original, 1, 4); // 复制从索引1(包含)到索引4(不包含)的元素  
        System.out.println(Arrays.toString(copy)); // 输出:[2, 3, 4]  
    }  
}

注意事项

  • 如果 from 等于 to,则结果为长度为 0 的数组,而不是 null。
  • 如果 from 或 to 超出原始数组的范围,则会抛ArrayIndexOutOfBoundsException。
  • 这两个方法都返回原始数组的一个新副本,对返回的数组所做的任何修改都不会影响原始数组。
    使用 copyOf() 和 copyOfRange() 方法可以方便地处理数组复制的需求,特别是在需要根据条件复制数组的一部分或需要调整数组大小时。
    不能用下面的方法实现数组元素的复制
double[] marks = {79, 84.5, 63, 90, 98};
double[]  target = marks;

数组参数与返回值

数组可以作为方法的参数和返回值。
可以将数组对象作为参数传递给方法,例如下面代码定义了一个求数组元素和的方法。

  public static double sumArray(double array[]){}

一个方法也可以返回一个数组对象,例如,下面的方法返回参数数组的元素反转后的一个数组。

  public static int[] reverse(int[] list){}

💢java.util.Arrays类

java.util.Arrays类定义若干静态方法对数组操作,包括:

  • 对数组排序
  • 在已排序的数组中查找指定元素
  • 数组元素的拷贝
  • 将一个值填充到数组的每个元素中
  • 比较两个数组是否相等

数组的排序

使用Arrays类的sort()方法可以对数组元素排序。

public static void sort( int []a):对数组a按升序排序
public static void sort( int []a, int fromIndex, int toIndex):对数组a中元素从起始下标fromIndex到终止下标toIndex之间的元素按升序排序
public static void sort( Object []a):对数组a按自然顺序排序
public static void sort(Object []a, int fromIndex, int toIndex):对数组a中元素从起始下标fromIndex到终止下标toIndex之间的元素排序

实战演练

package shujia_test1;

import java.util.Arrays;

public class Csdn5_6 {

	public static void main(String[] args) {
		int[] a = { 4, 18, 6, 10, 25, 3 };
		// int []a=new int[] {4,18,6,10,25,3};
		Arrays.sort(a);
		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
	}
}

在这里插入图片描述

元素的查找

对排序后的数组可以使用Arrays类的binarySearch()方法从中快速查找指定元素。

public static int binarySearch( int []a, int key)
public static int binarySearch(Object []a, Object key)

对给定的键值,查找该值在数组中的位置。
如果查找成功,则返回该值的下标值。
如果查找不成功,则返回值为: -插入点-1

int []a = new int[] {1,5,7,3};
Arrays.sort(a);  //1,3,5,7
int i =Arrays.binarySearch(a,7);
System.out.println( i );  //输出3
int i =Arrays.binarySearch(a,4);
System.out.println( i );  //输出-3

数组元素的复制

使用Arrays类的copyOf()方法将一个数组中的全部元素复制到另一个数组中。

public static int[] copyOf(int []original, int newLength)
int []a = new int[] {3,7,9};
int []newArray = Arrays. copyOf(a,4);
newArray 中:3 7 9 0(int默认值)

使用Arrays类的copyOfRange()方法将源数组中指定位置开始的若干元素复制到目标数组中。

public static int[] copyOfRange (int []original, int from, int to)
                                                           不包括
char[] letter = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’,};
letter = Arrays. copyOfRange (letter,1,5);
letter 中: ‘b’ ‘c’ ‘d’ ‘e’

填充数组元素

使用Arrays类的fill()方法可以将一个值填充到数组的每个元素中,或几个连续的元素中。

public static void fill( int []a, int val ):
用指定的val值填充数组a中的每个元素
public static void fill( int []a, int fromIndex, int toIndex , int val ) 
用指定的val值填充数组a中从起始下标fromIndex到终止下标toIndex(不包括)的每个元素
例: int[] a = new int[5];
        Arrays.fill(a, 47);
        a 中: 47 47 47 47 
public static void fill( Object []a , Object val )
public static void fill(Object []a, int fromIndex, int toIndex , Object val )

数组的比较

使用Arrays类的equals()方法可以比较两个数组对应元素是否相同,要求比较的两个数组数据类型相同且元素个数相同。

public static boolean equals( int []a , int []b )
比较整型数组a与b是否相等
public static boolean equals( Object []a , Object []b )
比较对象数组a与b是否相等

实战演练

package shujia_test1;

import java.util.Arrays;

public class Csdn5_7 {

	public static void main(String[] args) {

		int[] a1 = new int[10];
		int[] a2 = new int[10];
		Arrays.fill(a1, 47);
		Arrays.fill(a2, 47);
		System.out.println(Arrays.equals(a1, a2)); // 输出true
		a2[3] = 11;
		System.out.println(Arrays.equals(a1, a2)); // 输出false
		String[] s1 = new String[5];
		Arrays.fill(s1, "Hi");
		String[] s2 = { "Hi", "Hi", "Hi", "Hi", "Hi" };
		System.out.println(Arrays.equals(s1, s2)); // 输出true
	}
}

在这里插入图片描述
博主用心写,读者点关注,互动传真情,知识不迷路

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾听一世,繁花盛开

你的鼓励是我创作最大的动力与支

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值