首页 > 其他分享 >数组

数组

时间:2024-08-05 20:18:11浏览次数:8  
标签:初始化 int 元素 数组 多维 new

数组的定义

1.数组也是对象

2.数组的定义:

​ 数组是相同类型的有序集合,其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来进行访问

3.数组的四个基本特点:

1.长度确定。数组一旦被创建,它的大小是不可以被改变的。

2.元素必须是相同类型。其元素必须是相同类型,不允许出现混合类型。

3.任何数据类型。数组类型可以是任何数据类型,包括基本数据类型和引用数据类型。

4.变量引用类型。数组变量属于引用类型,数组也是对象,数组中的元素相当于对象的属性!

创建数组和初始化

创建数组

数组的声明方式(以一维数组为例)

type[] arr_name; //方式一
type  arr_name[];//方式二

数组的创建

创建数组意味着在内存中分配空间以存储数组的元素。创建数组可以使用以下两种方式之一:

  1. 使用 new 关键字: 使用 new 关键字后跟数组类型和方括号中的数组长度来创建数组。

    //数据类型[] 数组名称 = new 数据类型[数组长度];
    int[] array = new int[10]; // 创建一个整型数组,长度为10
    String[] names = new String[5]; // 创建一个字符串数组,长度为5
    
  2. 数组初始化器(花括号初始化): 使用花括号 {} 来初始化数组,并在其中包含数组元素。这种方式也会创建数组并初始化。

    int[] array = {1, 2, 3, 4, 5}; // 创建并初始化一个整型数组
    String[] names = {"Alice", "Bob", "Charlie"}; // 创建并初始化一个字符串数组
    

注意:

  • 声明的时候并没有实例化任何对象!!只有在实例化数组对象时,JVM才会分配空间,这时才与长度有关。

  • 声明一个数组的时候并没有数组真正被创建。

  • 构造一个数组,必须指定长度!!

多维数组的创建和声明

多维数组(例如二维数组)的创建和声明也遵循相同的原则,但需要额外指定每一维的长度。

int[][] multiArray; // 声明一个二维整型数组

// 为二维数组分配内存空间
multiArray = new int[3][2]; // 创建一个3行2列的二维数组

// 使用数组初始化器创建并初始化二维数组
int[][] anotherMultiArray = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

数组的默认值

当数组被创建时,所有的元素都会自动初始化为该类型的默认值。对于原始数据类型,整数类型默认为0,浮点类型默认为0.0,字符类型默认为\u0000(即字符0),布尔类型默认为false。对于对象引用类型,引用默认为null

可变长参数(Varargs)

Java允许方法接受可变数量的参数,这可以通过声明一个带有 "..." 的数组参数来实现。

public void printArray(int... numbers) {
    for (int number : numbers) {
        System.out.println(number);
    }
}

在这个例子中,printArray 方法可以接受零个或多个整型参数。

总结

数组的声明是指定数组的类型和名称,而数组的创建是在内存中分配数组所需的空间。在Java中,数组是一种基本的数据结构,广泛用于存储和管理有序的数据集合。

初始化数组

数组初始化的方式有三种:静态初始化,动态初始化,默认初始化。

1. 静态初始化(直接初始化)

在声明数组的同时,使用花括号 {} 直接指定数组的元素。

int[] array = {1, 2, 3, 4, 5}; // 整型数组
String[] names = {"Alice", "Bob", "Charlie"}; // 字符串数组

2. 动态初始化(使用 new 关键字)

使用 new 关键字后跟数组类型和方括号中的数组长度来创建数组。这种方式只分配内存空间,不初始化数组元素,数组元素将被默认初始化为该类型的零值。

int[] array = new int[5]; // 整型数组,长度为5,元素默认初始化为0
String[] names = new String[3]; // 字符串数组,长度为3,元素默认初始化为null

3. 可变长参数初始化(Varargs)

从Java 5开始,可以使用可变长参数(Varargs)来初始化数组。这允许方法接收不定数量的参数,并将它们存储在一个数组中。

public class VarargsExample {
    public static void main(String[] args) {
        int[] numbers = VarargsExample.sum(1, 2, 3, 4, 5);
        System.out.println("Sum of numbers: " + numbers[0]); // 输出求和结果
    }

    public static int[] sum(int... numbers) {
        int sum = 0;
        for (int num : numbers) {
            sum += num;
        }
        int[] result = {sum}; // 将求和结果存储在数组中
        return result;
    }
}

在这个例子中,sum 方法使用可变长参数接收任意数量的整数参数,计算它们的和,并将结果存储在一个新的数组中返回。

4. 循环初始化

虽然不是初始化数组的标准方式,但可以通过循环为数组元素赋值,这在某些情况下是有用的,尤其是当数组元素需要根据某些条件或计算来确定时。

int[] array = new int[5];
for (int i = 0; i < array.length; i++) {
    array[i] = i * 2; // 将数组元素初始化为它们的索引乘以2
}

注意事项

  • 静态初始化和循环初始化都是在栈内存上分配的,而动态初始化是在堆内存上分配的。
  • 静态初始化是在声明时就确定了数组的内容和大小,而动态初始化只确定了数组的大小,内容需要后续指定。
  • 可变长参数提供了一种灵活的方法来处理数量不定的参数,但它们在性能上可能不如固定大小的数组。

数组初始化是Java编程中的基础概念,正确地初始化数组对于编写有效和高效的代码至关重要。

多维数组

多维度数组是数组的数组,可以用来表示更复杂的数据结构。下面是一些帮助你理解多维度数组的步骤:

1. 理解一维数组

首先,确保你已经理解了一维数组。一维数组是一个简单的线性结构,可以存储一系列相同类型的元素。例如:

int[] array1D = {1, 2, 3, 4, 5};

这个数组包含5个整数,每个整数都是数组的一个元素。

2. 推广到二维数组

二维数组是一个数组,其元素也是数组。你可以把它想象成一个表格,有行和列。例如:

int[][] array2D = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

这个二维数组包含3行3列,每个元素都是一个整数。

3. 理解三维数组

三维数组是二维数组的数组,可以用来表示更复杂的数据结构。例如:

int[][][] array3D = {
    {
        {1, 2},
        {3, 4}
    },
    {
        {5, 6},
        {7, 8}
    }
};

这个三维数组包含2个二维数组,每个二维数组包含2行2列。

4. 访问元素

访问多维数组中的元素需要使用多个索引。例如,要访问二维数组中的元素,你需要使用两个索引:

int element = array2D[1][2]; // 访问第二行第三列的元素

对于三维数组,你需要使用三个索引:

int element = array3D[1][0][1]; // 访问第二个二维数组的第一个二维数组的第二个元素

5. 遍历多维数组

遍历多维数组可以使用嵌套的循环。例如,遍历一个二维数组:

for (int i = 0; i < array2D.length; i++) {
    for (int j = 0; j < array2D[i].length; j++) {
        System.out.print(array2D[i][j] + " ");
    }
    System.out.println();
}

遍历一个三维数组:

for (int i = 0; i < array3D.length; i++) {
    for (int j = 0; j < array3D[i].length; j++) {
        for (int k = 0; k < array3D[i][j].length; k++) {
            System.out.print(array3D[i][j][k] + " ");
        }
        System.out.println();
    }
    System.out.println();
}

6. 动态初始化多维数组

你也可以动态初始化多维数组。例如,创建一个3行4列的二维数组:

int[][] array2D = new int[3][4];

创建一个2个二维数组,每个二维数组有3行3列的三维数组:

int[][][] array3D = new int[2][3][3];

7. 总结

理解多维数组的关键在于理解它们是数组的数组,并且能够正确地访问和遍历这些数组。通过实践和编写一些简单的程序,你会逐渐掌握这些概念。

理解多维数组的关键点:

  1. 数组的数组:多维数组本质上是由数组组成的数组。例如,二维数组可以看作是一维数组的数组。
  2. 索引:访问多维数组的元素需要多个索引。第一个索引定位到最外层的数组,第二个索引定位到内层的数组,以此类推。
  3. 内存分配:多维数组在内存中是连续分配的,但Java虚拟机(JVM)会为每个维度的数组分别管理内存。
  4. 初始化:多维数组可以部分初始化,即只初始化最外层的数组,内层数组可以稍后单独初始化。
  5. 应用场景:多维数组常用于表示表格数据、矩阵运算、图形像素数据等场景。

理解多维数组需要时间和实践,通过编写代码和实际应用,你会逐渐熟悉它们的使用方式和优势。

动态数组

在Java中,集合(Collections)框架提供了一套丰富的接口和类,用于处理和操作一组对象。以下是一些常用的集合类型及其使用方法:

1. List接口

List 是一个有序的集合,可以包含重复的元素。常见的实现有:

  • ArrayList:基于动态数组实现,提供快速随机访问。
  • LinkedList:基于链表实现,提供快速的插入和删除操作。

使用方法

List<String> list = new ArrayList<>();
list.add("元素1");
list.add("元素2");
String element = list.get(0); // 获取第一个元素
list.remove(1); // 删除第二个元素
boolean contains = list.contains("元素1"); // 检查是否包含元素

2. Set接口

Set 是一个不允许重复元素的集合。常见的实现有:

  • HashSet:基于哈希表实现,提供快速查找。
  • TreeSet:基于红黑树实现,可以按照自然顺序或自定义顺序排列元素。

使用方法

Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.remove(1); // 删除元素1
boolean contains = set.contains(2); // 检查是否包含元素2

3. Map接口

Map 提供键值对的映射,不允许键重复。常见的实现有:

  • HashMap:基于哈希表实现,提供快速查找。
  • TreeMap:基于红黑树实现,可以按照键的自然顺序或自定义顺序排列。

使用方法

Map<String, Integer> map = new HashMap<>();
map.put("key1", 1);
map.put("key2", 2);
Integer value = map.get("key1"); // 通过键获取值
map.remove("key1"); // 删除键值对
boolean containsKey = map.containsKey("key2"); // 检查是否包含键

4. Queue接口

Queue 是一种遵循先进先出(FIFO)原则的集合。

使用方法

Queue<Integer> queue = new LinkedList<>();
queue.offer(1); // 添加元素到队列末尾
Integer poll = queue.poll(); // 移除并获取队列头部元素
Integer peek = queue.peek(); // 获取队列头部元素但不移除

5. Deque接口

Deque(双端队列)是一个具有队列和栈特性的集合,可以在两端添加或移除元素。

使用方法

Deque<String> deque = new LinkedList<>();
deque.addFirst("front"); // 在头部添加元素
deque.addLast("back"); // 在尾部添加元素
String removeFirst = deque.removeFirst(); // 移除并获取头部元素
String removeLast = deque.removeLast(); // 移除并获取尾部元素

6. Collections工具类

Collections 类提供了一些静态方法,用于操作和返回集合。

使用方法

List<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3); // 添加所有元素到列表
Collections.sort(list); // 对列表进行排序
Collections.reverse(list); // 反转列表

注意事项:

  • 选择合适的集合类型取决于您的具体需求,例如是否需要排序、是否允许重复元素等。
  • 集合的线程安全性:标准Java集合不是线程安全的。如果需要在多线程环境中使用,可以考虑使用 Collections.synchronizedCollection 方法包装集合,或者使用 ConcurrentHashMap 等并发集合。
  • 性能考虑:不同的集合类型在添加、删除、查找等操作上的性能表现不同,选择合适的集合类型可以提高程序性能。

集合是Java编程中非常基础且重要的部分,合理使用集合可以大大提高程序的效率和可读性。

标签:初始化,int,元素,数组,多维,new
From: https://www.cnblogs.com/wjw2003512/p/18343967

相关文章

  • 数组的复制方法
    arraycopy方法(将元素复制)这句代码使用了System.arraycopy方法,用于将一个数组中的元素复制到另一个数组中。具体来说,这句代码的作用是从原数组arr中删除第一个元素和最后一个元素,并将剩下的元素复制到新数组newArr中。以下是对这句代码的详细解释:System.arraycopy(arr,1,......
  • 数组的算法
    数组的算法在Java中,数组是一种基本的数据结构,常用于实现各种算法。以下是一些常见的与数组相关的算法:排序算法:冒泡排序(BubbleSort)选择排序(SelectionSort)插入排序(InsertionSort)快速排序(QuickSort)归并排序(MergeSort)堆排序(HeapSort)搜索算法:线性搜索(LinearS......
  • 数组中生成随机数(Random)
    数组中生成随机数(Random)要通过随机数索引来访问数组中的某一个元素,可以使用Java中的Random类来生成一个随机数,然后用这个随机数作为索引来访问数组。以下是一个示例代码,展示了如何实现这一点:importjava.util.Random;publicclassRandomArrayAccess{publicstaticvoidmai......
  • 数组:性能优化与错误处理的艺术
    引言在编程过程中,我们会发现这么一件事,有时候需要用到很多变量,十个、百个,甚至千个,如果一个个变量都去声明的话,那么工作量是非常大的,也导致代码很臃肿,所以这个时候数组就出现了。数组可以用来存储一系列数据类型一致的数据,这让我们在操作数据的时候会来的更加简易高效,接下来......
  • 【动态规划】力扣918. 环形子数组的最大和
    给定一个长度为n的环形整数数组nums,返回nums的非空子数组的最大可能和。环形数组意味着数组的末端将会与开头相连呈环状。形式上,nums[i]的下一个元素是nums[(i+1)%n],nums[i]的前一个元素是nums[(i-1+n)%n]。子数组最多只能包含固定缓冲区nu......
  • [学习笔记]后缀数组(Suffix Array)
    后缀数组(suffixarray)是一个通过对字符串的所有后缀经过排序后得到的数组。后缀数组被Manber和Myers于1990年提出,作为对后缀树的一种替代,更简单以及节省空间。它们也被GastonGonnet于1987年独立发现,并命名为“PAT数组”。后缀数组有很多奇妙的性质,这些性质可以帮......
  • js动态构建属性名并访问其对象属性(动态的对象或着数组名)
    js动态构建属性名并访问其对象属性(动态属性访问)在开发中有时会遇到这种情况:你写了很多的函数,写完发现他们的操作逻辑都是相同的,但是原始数据不同,如:/*获取区域,道路拥堵指数对应的色标*/makeCongestionColor(num){letoutColor='#fff'letcol......
  • C 语言(二)数组与字符串
    C语言(二)数组与字符串1.数组所谓数组,就是一个集合,里面存放了相同类型的数据元素特点1:数组中的每个数据元素都是相同的数据类型特点2:数组是由连续的内存位置组成的1.1一维数组定义://伪代码数据类型数组名【数组长度】;数据类型数组名【数组长度】={值1,值2};......
  • 嵌入式学习第15天——C语言二维数组、字符数组
    二维数组定义二维数组本质上是一个行列式的组合,也就是说二维数组是有行和列两部分构成。二维数组数据是通过行列进行解读。二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一维数组。语法 类型数组名[行数][列数]举例: intarr[3]......
  • 【进阶】树状数组的高阶应用
    1.离线树状数组介绍有一类经典问题:给定一个序列,每次询问一个区间内的元素种类数。这种题的做法有很多:莫队、分块、主席树……在不强制在线的情况下,他们的效率都较低,有一种效率高、空间小的离线做法:离线树状数组。例题:P1972[SDOI2009]HH的项链题目大意给定一个长度为\(n......