Java中的数组与栈和堆之间的关系

关于数组的定义这里就不做叙述,因为与C语言并无不同之处。

数组的初始化有三种方式:

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

2.  int[ ] array2 = new int[ ] { 1, 2, 3, 4, 5 };

3.  int[ ] array3 = new int[10 ];

第一种和第二种它们两个没有区别,写哪个表示的含义都相同;第三个则类似C语言中的不完全初始化,只是给定了范围,里面的数字编译器默认会给0

关于数组在内存中的存储、上述的语法以及不同的数据类型所代表的默认值,如下图所示:

接下来的图描述了关于两个引用指向同一个对象时的内存栈和堆的分配情况,了解了这些才算是真正理解了数组。(JVM:Java虚拟机)

接下来我们来认识下null (空引用)。

在前面基本数据类型的方法的引用我们说过,基本数据类型传参时形参不会影响实参的值;但是今天要讲的引用数据类型的形参可以改变实参的值,先从一道例题来引入这个内容。

问:给定一个数组{ 1, 2,3, 4, 5 },将数组内的元素全部扩大两倍,怎么写?

下面是运行时的编译器的处理过程:

将其放在栈和堆上的表示方法:

 那么问题来了,引用数据类型在调用方法时的形参一定会修改实参的值吗?

结论:不一定,看下图:

总结:一个引用,不能指向多个对象。否则有可能不会修改实参值。

遍历数组

还有一种遍历数组的方式:

这里使用了 Arrays的toString 方法,把传入的参数array表示的数组,以字符串的形式进行输出了

例题:给定数组{ 1, 2, 3, 4,   5,6 }求数组中元素的平均值;

二维数组:

定义同样没有区别,但是在初始化的时候,一定是要加上大括号的。加上之后编译器才能判断哪部分是一列,有多少行。

      在C语言中可以不定义行,但要定义列;但在Java中,可以不定义列,但是一定要定义行。这样的数组由于列不确定(数组内列的大小可能不一定相同);我们把这样的数组称作不规则二维数组。

在栈和堆中的具体体现是这样的:

 接下来是一些编程小技巧:

1. 在数组中使用循环时,往往循环的限制条件是数组长度减一(因为是从 0 下标开始) ,所以我们可以直接用 array.length - 1 来表示这个限制条件(length表示长度),如图:

2.我们在C语言时期知道二分查找是只能对于一个有序数组进行查找,那么如果是无序的、乱序的该怎么样进行排序呢,有两种方法:使用 Arrays.sort(array); 这个语句进行排序  或者  用循环来弄一个冒泡排序。(这里只讲语句排序)如图:

3.数组拷贝、数组部分拷贝、扩大数组。全部都各自一张图来表示:

使用 from - to 进行扩大(不用专门去写from和to,如果你写的正确,编译器会自动识别上去),取值范围是(   ];  ,例如本图是(1 ,3] 

以上就是本篇文章的全部内容。如有遗漏或错误,欢迎补充。

<think>嗯,用户让我介绍一下Java队列的常见关系类图,还要用中文回答。首先,我需要回想一下Java集合框架里队列的相关类。的话,我记得Java里有一个Stack类,但可能已经过时了,现在更推荐用Deque的实现类,比如ArrayDeque来实现的功能。队列的话,主要的接口是Queue,然后有不同的实现类,比如LinkedList、ArrayDeque,还有优先级队列PriorityQueue。 接下来,用户想要类图的关系,可能需要展示这些类接口之间的继承或实现关系。比如,Stack类继承自Vector,而Vector又实现了List接口,这可能有点不太合理,因为应该不需要List的所有功能。不过现在Deque接口既可以当队列用,也可以当用,因为提供了addFirst、push等方法,所以ArrayDeque实现了Deque,而Deque又继承自Queue接口。这样的话,队列在Java中的实现其实是通过Deque这个双端队列来统一的。 用户可能想知道它们之间关系,所以需要画出类图的结构。比如,Stack是Vector的子类,而Queue是一个接口,由LinkedList、ArrayDeque、PriorityQueue等实现。同时,Deque接口继承Queue接口,然后ArrayDequeLinkedList都实现了Deque。所以当用Deque作为的时候,比如用ArrayDeque的pushpop方法,就能模拟的行为。 可能用户会混淆为什么Stack类不被推荐使用,应该解释一下,因为Stack是线程安全的,但继承了Vector,导致性能较差,而Deque的实现更高效,且提供了更一致的API。所以现在通常建议用Deque来代替Stack。 另外,需要提到队列的区别,比如是LIFO,队列是FIFO,但Java中的Deque允许两端操作,所以可以作为两者的实现。比如,当用addFirstremoveFirst时,就是;用addLastremoveFirst时,就是队列。 可能用户的实际应用场景是面试题,或者在学习数据结构时需要理解Java中的实现方式。因此,给出一个清晰的类图结构,并说明各个类接口的关系,以及推荐的用法会比较有帮助。需要确保语言简洁,结构清晰,可能分点说明,然后附上一个类图的文字描述,或者用文字模拟类图的结构。</think>在 Java 中,(Stack)队列(Queue)的实现类主要通过集合框架(Collection Framework)提供。以下是它们的常见关系类图及简要说明: --- ### **1. 类图关系简化版** ``` +------------------+ | Queue | <接口> +------------------+ ^ ^ ^ / | \ / | \ +----------------+ +----------------+ +----------------+ | PriorityQueue | | LinkedList | | Deque | <接口> +----------------+ +----------------+ +----------------+ | ^ | | +----------------+ | | ArrayDeque | | +----------------+ | | +----------------+ | | Stack | <类> (已过时) +----------------+ ``` --- ### **2. 关键类接口说明** #### **(Stack)** - **`Stack` 类**(已过时): - 继承自 `Vector`,线程安全但性能较差。 - 提供 `push()`、`pop()`、`peek()` 方法实现 LIFO(后进先出)。 - **不推荐使用**,建议用 `Deque` 替代。 - **通过 `Deque` 实现**(推荐): ```java Deque<T> stack = new ArrayDeque<>(); stack.push(); // 入 stack.pop(); // 出 ``` - `ArrayDeque` 或 `LinkedList` 均可实现高性能非线程安全。 #### **队列(Queue)** - **`Queue` 接口**: - 定义队列的 FIFO(先进先出)行为,核心方法: ```java add()/offer() // 入队 remove()/poll() // 出队 element()/peek() // 查看队首 ``` - **常见实现类**: 1. **`LinkedList`**:基于链表,支持快速插入/删除。 2. **`ArrayDeque`**:基于循环数组,性能高效。 3. **`PriorityQueue`**:基于的优先级队列,元素按优先级排序。 #### **双端队列 `Deque`** - **`Deque` 接口**(继承 `Queue`): - 支持两端操作,既可当(LIFO)也可当队列(FIFO)使用。 - 关键方法: ```java addFirst()/addLast() // 双端插入 removeFirst()/removeLast() // 双端删除 ``` --- ### **3. 队列的关系** - **功能互补**: - (LIFO)队列(FIFO)是两种对立的数据结构,但都可通过 `Deque` 实现。 - 例如: - ****:用 `Deque` 的 `push()`(等价于 `addFirst()`) `pop()`(等价于 `removeFirst()`)。 - **队列**:用 `Deque` 的 `addLast()` `removeFirst()`。 - **设计演进**: - 早期 `Stack` 类设计不佳(继承 `Vector`),现被 `Deque` 取代。 - `Deque` 统一了队列的实现,提供更灵活的 API。 --- ### **4. 示例代码** ```java // 队列(FIFO) Queue<String> queue = new LinkedList<>(); queue.offer("A"); queue.poll(); // (LIFO) Deque<String> stack = new ArrayDeque<>(); stack.push("B"); stack.pop(); // 双端队列 Deque<String> deque = new ArrayDeque<>(); deque.addFirst("C"); deque.addLast("D"); ``` --- ### **总结** - ****推荐用 `Deque` 实现(如 `ArrayDeque`),弃用 `Stack` 类。 - **队列**可通过 `Queue` 接口选择不同实现(如 `LinkedList`、`PriorityQueue`)。 - **`Deque`** 是队列的统一接口,灵活支持两种操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值