数组的定义
1.数组也是对象
2.数组的定义:
数组是相同类型的有序集合,其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来进行访问
3.数组的四个基本特点:
1.长度确定。数组一旦被创建,它的大小是不可以被改变的。
2.元素必须是相同类型。其元素必须是相同类型,不允许出现混合类型。
3.任何数据类型。数组类型可以是任何数据类型,包括基本数据类型和引用数据类型。
4.变量引用类型。数组变量属于引用类型,数组也是对象,数组中的元素相当于对象的属性!
创建数组和初始化
创建数组
数组的声明方式(以一维数组为例)
type[] arr_name; //方式一
type arr_name[];//方式二
数组的创建
创建数组意味着在内存中分配空间以存储数组的元素。创建数组可以使用以下两种方式之一:
-
使用
new
关键字: 使用new
关键字后跟数组类型和方括号中的数组长度来创建数组。//数据类型[] 数组名称 = new 数据类型[数组长度]; int[] array = new int[10]; // 创建一个整型数组,长度为10 String[] names = new String[5]; // 创建一个字符串数组,长度为5
-
数组初始化器(花括号初始化): 使用花括号
{}
来初始化数组,并在其中包含数组元素。这种方式也会创建数组并初始化。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. 总结
理解多维数组的关键在于理解它们是数组的数组,并且能够正确地访问和遍历这些数组。通过实践和编写一些简单的程序,你会逐渐掌握这些概念。
理解多维数组的关键点:
- 数组的数组:多维数组本质上是由数组组成的数组。例如,二维数组可以看作是一维数组的数组。
- 索引:访问多维数组的元素需要多个索引。第一个索引定位到最外层的数组,第二个索引定位到内层的数组,以此类推。
- 内存分配:多维数组在内存中是连续分配的,但Java虚拟机(JVM)会为每个维度的数组分别管理内存。
- 初始化:多维数组可以部分初始化,即只初始化最外层的数组,内层数组可以稍后单独初始化。
- 应用场景:多维数组常用于表示表格数据、矩阵运算、图形像素数据等场景。
理解多维数组需要时间和实践,通过编写代码和实际应用,你会逐渐熟悉它们的使用方式和优势。
动态数组
在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