Java程序基础——6.数组
Java数组
数组的基本概念
数组是相同数据类型元素的有序集合。与单独定义多个变量相比,使用数组可以更方便地管理和操作一组相关数据。
数组的核心特性
固定长度:数组一旦创建,其长度就不可改变。尝试访问超出长度范围的索引会抛出
ArrayIndexOutOfBoundsException。连续存储:数组元素在内存中连续存储,这使得通过索引访问元素的效率极高。
默认初始化:创建数组时,所有元素都会被自动初始化为对应类型的默认值:
- 数值类型:0(整数)、0.0(浮点)
- 布尔类型:false
- 引用类型:null
引用类型:数组本身是引用类型,数组变量存储的是数组对象的引用(内存地址)。
数组的引用特性
数组作为引用类型,其变量存储的是数组对象的引用,这一点与基本类型有本质区别。
数组引用的工作原理
当我们创建一个数组并赋值给变量时,变量实际上存储的是数组在内存中的地址:
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // arr2与arr1指向同一个数组
此时,修改arr2的元素会影响arr1,因为它们指向同一个数组对象:
arr2[0] = 100;
System.out.println(arr1[0]); // 输出100
数组变量的重新赋值
数组变量可以重新赋值指向新的数组对象,原数组对象如果没有其他引用会被垃圾回收:
int[] arr = {1, 2, 3};
arr = new int[] {4, 5, 6}; // arr现在指向新数组
这一过程中,原数组{1,2,3}并未被修改,只是不再被arr引用。
字符串数组与对象数组
数组元素不仅可以是基本类型,还可以是引用类型,如字符串、自定义对象等。
字符串数组
字符串数组的每个元素都是一个字符串引用:
String[] names = {"Alice", "Bob", "Charlie"};
修改字符串数组元素时,只是改变了引用指向,不会修改原字符串内容(字符串具有不可变性):
names[1] = "Robert"; // names[1]从指向"Bob"变为指向"Robert"
对象数组
对于自定义对象,数组存储的是对象引用:
// 假设存在Person类
Person[] people = new Person[3];
people[0] = new Person("Alice");
people[1] = new Person("Bob");
访问对象数组元素的方法:
System.out.println(people[0].getName()); // 调用对象方法
数组操作
数组的创建
声明并初始化
// 声明并初始化一个可容纳5个int元素的数组
int[] scores = new int[5];
// 声明并初始化一个长度为3的String数组
String[] arr2 = new String[3];
数组创建后会自动初始化所有元素为默认值(整数类型默认值为0)。
声明并指定元素初始化
还可以在定义时直接指定元素值,此时数组长度由编译器自动计算:
// 声明并初始化数组,长度为5
int[] scores = new int[] {68, 79, 91, 85, 62};
// 更简洁的写法
int[] scores = {68, 79, 91, 85, 62};
修改数组元素
int[] scores = {68, 79, 91, 85, 62};
scores[1] = 80; // 将第二个元素修改为80
System.out.println(scores[1]); // 输出80
访问数组元素
数组元素通过索引(index)进行访问和操作,索引从0开始,最大索引为数组长度-1。
int[] scores = {68, 79, 91, 85, 62};
System.out.println(scores[0]); // 访问第一个元素,输出68
System.out.println(scores[2]); // 访问第三个元素,输出91
获取数组长度
使用length属性可以获取数组的长度:
int[] scores = {68, 79, 91, 85, 62};
System.out.println(scores.length); // 输出5
注意:数组的
length是属性而非方法,访问时不需要加括号()。
数组的遍历
遍历数组是最常见的操作之一,可以使用for循环或增强for循环(foreach)。
使用普通for循环
int[] scores = {68, 79, 91, 85, 62};
for (int i = 0; i < scores.length; i++) {
System.out.println("第" + (i+1) + "个元素:" + scores[i]);
}
使用增强for循环
增强for循环更简洁,无需关注索引:
int[] scores = {68, 79, 91, 85, 62};
for (int score : scores) {
System.out.println(score); // 直接访问元素值
}
数组的常用工具类操作(java.util.Arrays)
数组复制
copyOf(原数组, 新长度):复制数组,新长度超过原长度则补默认值copyOfRange(原数组, 起始索引, 结束索引):复制指定范围(左闭右开)
int[] original = {1, 2, 3};
int[] copy1 = Arrays.copyOf(original, 5); // {1,2,3,0,0}
int[] copy2 = Arrays.copyOfRange(original, 1, 3); // {2,3}
数组填充
fill(数组, 值):将数组所有元素设为指定值
int[] arr = new int[3];
Arrays.fill(arr, 6); // {6,6,6}
数组排序
sort():对数组升序排序(基本类型按值排序,引用类型需实现Comparable)
int[] nums = {3, 1, 4};
Arrays.sort(nums); // 排序后:{1, 3, 4}
数组比较
equals(数组1, 数组2):判断两个数组长度和元素是否完全相同
int[] a = {1, 2};
int[] b = {1, 2};
boolean isEqual = Arrays.equals(a, b); // true
二分查找元素
binarySearch(数组, 目标值):二分查找(需先排序,找到返回索引,否则返回负数)
int[] sorted = {1, 3, 4};
int index = Arrays.binarySearch(sorted, 3); // 1(找到索引)
数组与其他类型转换
数组转字符串
toString(数组):将数组转为易读的字符串(如[1, 2, 3])
String str = Arrays.toString(nums); // "[1, 3, 4]"
数组转集合
使用List.of()方法(Java 9+)(返回固定大小的 List,不可添加/删除/改元素,不允许null元素)
String[] arr = {"苹果", "香蕉", "橙子"};
List<String> list = List.of(arr);//数组转列表
List<Integer> numbers = List.of(1, 2, 3, 4);
使用 Arrays.asList()(返回固定大小的 List,不可添加/删除元素):
String[] strs = {"a", "b"};
List<String> list = Arrays.asList(strs);
集合转数组
通过 List.toArray():
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Integer[] arr = list.toArray(new Integer[0]); // 数组:{1,2}
总结
- 理解数组的特性(尤其是引用特性)
- 掌握数组操作:
- 1.数组创建、元素修改、元素查询、长度获取
.length、遍历。 - 2.数组复制、填充、排序、比较和二分查找元素索引。
- 3.数组与字符串、集合之间转换
- 1.数组创建、元素修改、元素查询、长度获取
Java程序基础——6.数组的更多相关文章
- Java之--Java语言基础组成—数组
Java语言基础组成-数组 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的数组,数组 ...
- 第二十四节:Java语言基础-讲解数组的综合应用
数组的综合应用 // 打印数组 public static void printArray(int[] arr) { for(int x=0;x<arr.length;x++) { if(x!= ...
- 使用.bat来执行Java程序基础
将java程序做成可运行的jar后,又希望使用.bat文件来调用jar时,有几点需要注意的. 1.设置path和classpath .bat文件中扥的内容如下: @echo off set MY_HO ...
- Java 语言基础之数组常见操作
对数组操作最基本的动作: 存和取 核心思想: 就是对角标的操作 数组常见操作: 1, 遍历 2, 获取最大值和最小值 3, 排序 4, 查找 5, 折半查找 // 1. 遍历 int[] arr = ...
- Java程序基础编程基础
1.在屏幕上输出"你好" //Programmer name Helloword.javapublic class Helloword { public static void m ...
- Java语言基础之数组
引出数组和数组的定义 为什么要使用数组: 问题一: 声明变量时,每一个单独的变量都要对应一个变量名,但现在要处理一组相同类型的数据时,如要表示班上100个人的年纪,绝不能定义100个变量来表示每一个人 ...
- 廖雪峰Java1-2程序基础-9数组
数组初识 1.数组的特点: 数组所有元素初始化默认值,int默认值为0 数组创建后大小不可改变 数组索引从0开始 数组是引用类型 使用索引下标访问数组元素,索引超出范围会报错 2.数组的定义: 类型[ ...
- Java(C#)基础差异-数组
1.填充数组 Java 数组填充替换方法Arrays.fill() 举例如下: import java.util.Arrays; public class FillDemo { public stat ...
- Java 语言基础之数组应用
什么时候使用数组呢? 如果数据出现了对应关系, 而且对应关系的一方是有序的数字编号, 并作为角标使用. 这时,就必须要想到数组的使用. 也就是将这些数据存储到数组中, 根据运算的结果作为角标, 直接去 ...
- Java 语言基础之数组(一)
数组定义及格式: 数组: 同一种类型数据的集合, 就是一个容器 定义数组格式1: 元素类型[] 数组名 = new 元素类型[元素个数(即数组长度)]; 说明: 数组是一个容器.而容器属于一个实体,实 ...
随机推荐
- Java 使用ListUtils对List分页处理
背景分析 工作中,经常遇到需要用Java进行分页处理数据,例如把1000万条Excel数据写入MySQL数据库,如果把这1000w数据一股脑的丢给MySQL,保证把数据库玩完,故需要批量写入,如每 ...
- git提示:There is no tracking information for the current branch
问题 使用git pull拉取远程分支代码的时候,提示: > There is no tracking information for the current branch. Please sp ...
- 【ASP.NET Core】调用 Web API 备份数据库
老周不经意间翻了一下博客列表,上一篇水文竟然在 一个月前.啊,大海啊,全是水:时间啊,你跑得真快!过了一个月老周竟没感觉出来,可是这一个月里,好像啥事也没干成,就改了一下几个旧项目.也许是现在大环境真 ...
- Kubernetes存储-Ceph存储
Kubernetes存储-Ceph存储 原文链接:https://www.qikqiak.com/k8strain/storage/ceph/#_11 简介 Ceph 是一个统一的分布式存储系统,提供 ...
- Win10更新为Win11失败,可尝试用Win11 安装助手升级。
Win10更新为Win11总是失败的,可以试一下Windows 11 安装助手. 而且,系统自动更新后只能是Win11的23H2版本,后面还需要继续更新.而安装助手直接升级到24H2的最新版本. W ...
- 4G DTU在废品智能回收系统中的应用
1.概述 废品智能回收系统要实现的功能描述: 可回收物:可投放到智能垃圾分类回收箱的大致有这五大品类:纸类.纺织物.金属.塑料.玻璃.回收柜上各品类是分开箱体的,需要把对应的可回收物投放到对应的箱体内 ...
- idea创建spring通用项目
创建spring基础项目 高清地址点此播放 springBoot: 3.2 java: v21 mybatis: v3.2.4.1 swagger: v3 初始化完成后,我们看看pom文件会发现 已经 ...
- 不支持tpm2.0 升级windows11
前提 我计划给我的macbook pro2020装双系统 但是双击启动转换助理 看到只能装windows10,只好手动选择下载好的win11镜像,则提示驱动软件失败TMDDD 那我就先用启动转换助理安 ...
- C++11 功能函数小结
简介 C++11 引进了很多集合函数, 在功能更加强大的同时, 也越发复杂. 参考链接 https://blog.csdn.net/qq_40160605/article/details/801502 ...
- killall bluetoothd 一直不成功
最后调查发现是bluetman 惹得祸 贴上他的守护程序,以后也可以写一个 #! /usr/bin/python3 from __future__ import print_function from ...