关于java的Stack类的问题。

代码:如下
public static void main(String[] args)
{
Stack stack = new Stack<>();
stack.push(1);
stack.push(2);
System.out.println(stack.hashCode());// hashcode输出994
for (Integer i : stack)
{
System.out.println(i); // 输出1 2
}
changeStack(stack);
System.out.println(stack.hashCode());// hashcode输出32
for (Integer i : stack)
{
System.out.println(i);//输出1
}

}
public static void changeStack(Stack<Integer> stack)
{
    stack.pop();
}
    问题:
    为什么stack在changeStack()之后,居然连hashcode都变了呢?我知道stack的值会改变的,只是不知道为啥内存地址也会变,前后的hashcode不应该一样么?我用Stringbuffer类,对他append之后,前后的hashcode一样。为啥Stack会这样呢?
0

2个回答

朋友,首先纠正一个问题,hashcode 值 并不是Stack的地址的引用,也不是Stack中元素的地址引用。根据继承关系分析,
Stack调用的AbstractList抽象类HashCode方法或者hashCode值。
图片说明
![图片说明
图片说明
从图中可以看出,HashCode值得计算并不是地址引用,但是跟元素的HashCode有关联,即元素的HashCode值参与了计算。
我们Stack中存在的元素是Integer类型,而Integer 类型的HashCode值实际上就上Integer的value,即我们存储的值,如图:
图片说明
经过这段介绍我想你应该可以可以理解了吧~

1
mxd446814583
mxd446814583 确实搞混了hashcode与内存地址的关系,虽然hashcode值不一致,但是stack的内存地址还是同一个。
大约一年之前 回复

Stack的父类是Vector,Vector的父类是AbstractList,这个要看AbstractList的源码。看源码我们发现,其hashCode方法和元素是相关的,调用changeStack方法后,stack的元素发生变化,元素个数从1变为2,这样算出的hashCode值一定是不同的。
/**
* Returns the hash code value for this list.
*
*

This implementation uses exactly the code that is used to define the
* list hash function in the documentation for the {@link List#hashCode}
* method.
*
* @return the hash code value for this list
*/
public int hashCode() {
int hashCode = 1;
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
return hashCode;
}

1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java 中的栈-Stack类源码解读
Stack继承自Vector,实现了栈元素的基本操作,最典型的就是push压栈和pop出栈,整个Stack.java的代码很简单: public class Stack&amp;amp;lt;E&amp;amp;gt; extends Vector&amp;amp;lt;E&amp;amp;gt; { public Stack() { } /** * 压入一个元素入栈,实际就是调用Vector的addElement方法 ...
Java中Stack类的用法
java中stack的使用方法,堆栈是一种"后进先出"(LIFO) 的数据结构, 只能在一端进行插入(称为"压栈") 或删除 (称为"出栈")数据的操作,下面看示例吧 JAVA 中,使用 java.util.Stack 类的构造方法创建对象。  public class Stack extends vector  构造方法 : public Stack() 创建一个空 Sta
java中Stack类的介绍
本文主要对java中的Stack源码进行分析。1.Stack类在java.util包中;2.源码顶部注释分析3.继承关系Stack继承了Vector,而Vector类底层使用数组存储数据,那么Stack对象中存储的数据也是存储在数组中的。4.构造函数Stack只有一个无参数的构造函数。5.API介绍(1)push(item):把数据压入栈addElement()是父类Vector中的方法,会将压入...
Java中Stack类的学习笔记
Stack Stack(栈)是一种比较典型的数据结构,其元素满足后进先出(LIFO)的特点。 Java中Stack的实现继承自Vector,所以其天然的具有了一些Vector的特点,所以栈也是线程安全的。 class Stack extends Vector {} 事实上,除了继承自Vector的那些方法之外,Stack只提供了5个方法: 1.测试栈是否为空:   boolean i
Java中的Stack类和Queue接口
前言 今天做剑指offer,里面有道题要求用两个栈实现一个队列,之前也零零散散遇到过一些需要用到栈和队列的数据结构的题目,于是抽空总结一下,不对之处望指出。 Stack类 Stack类继承自Vector类,有以下几个方法。 1. boolean empty() 判断栈是否为空 2. E peek() 返回栈顶对象,不移除 3. E pop() 返回栈顶对象,并移除 ...
java中Stack类的介绍以及使用
public class Stackextends Vector Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到栈顶距离的 search 方法。  package st
Java Stack的详细实现分析
简介     我们最常用的数据结构之一大概就是stack了。在实际的程序执行,方法调用的过程中都离不开stack。那么,在一个成熟的类库里面,它的实现是怎么样的呢?也许平时我们实践的时候也会尝试着去写一个stack的实现玩玩。这里,我们就仔细的分析一下jdk里的详细实现。 Stack     如果我们去查jdk的文档,我们会发现stack是在Java.util这个包里。它对应的一个大致的类关...
基于数组实现Java 自定义Stack栈类及应用
栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出( Last-in-first-out,LIFO)的原则。java本身是有自带Stack类包,为了达到学习目的已经更好深入了解stack栈,自己动手自建java stack类是个很好的学习开始:自建Java Stack 类Stack 类:package com.stack;import java.util.ArrayList; im
Java 用栈解决括号匹配问题
在南阳理工ACM看到的一道题 问题描述:问题描述 : 输入一个字符串 里面只含有 [ , ] , ( , ) 四种括号 ; 现要求判断这个字符串 是否满足括号匹配  如    ([])()    是匹配的    ([)]是不匹配的 先贴代码    public void check(String str) { Stack stack = new Stack(); // 如果该St
java源码分析之List接口以及ArrayList、LinkedList、Stack、Vector等实现类
讲解jdk源码中List接口之前我们先来看一个模式,迭代器设计模式。         迭代器设计模式主要是为了对容器提供统一的遍历接口,对于不同的数据结构的遍历方式由不同的iterator实现类所实现,而且也对原始数据进行了封装,不至于在用户使用时暴漏内部细节,类图如下。 上面图中的各个类其实就是jdk中Collection容器对迭代器设计模式的一个实现,Itr是AbstractList的一...
Java类集框架(六):Stack及Properties子类、Collections工具类
Stack子类 在java.util包内可以利用stack类实现栈的功能。此类定义如下: public class Stack&amp;lt;E&amp;gt; extends Vector&amp;lt;E&amp;gt; Stack类常用方法: 方法 类型 描述 public E push(E item) 普通 数据入栈 public E pop() 普通 数据出栈...
java堆栈类使用实例(java中stack的使用方法
java中stack的使用方法,堆栈是一种"后进先出"(LIFO) 的数据结构, 只能在一端进行插入(称为"压栈") 或删除 (称为"出栈")数据的操作,下面看示例吧 JAVA 中,使用 java.util.Stack 类的构造方法创建对象。  public class Stack extends vector  构造方法 : public Stack() 创建一个空 Sta
用Java实现栈(Stack)之链表实现
使用链表实现栈 下面是节点类:package com.yang.review; /** * 节点类 * @author 阳 *使用单链表实现栈 */ public class Node { //值 Object value; //指向下一个节点 Node next; /** * 构造函数 * @param value *
java中的heep和stack在各方面的应用
1.Java中对象都是分配在heap(堆)中。从heap中分配内存所消耗的时间远远大于从stack产生存储空间所需的时间。 (1)每个应用程序运行时,都有属于自己的一段内存空间,用于存放临时变量、参数传递、函数调用时的PC值的保存。这叫stack。 (2)所有的应用可以从一个系统共用的空间中申请供自己使用的内存,这个共用的空间叫heap。 (3)stack中的对象或变量只要定义好就可使用了,应用程...
java stack的详细实现分析
简介     我们最常用的数据结构之一大概就是stack了。在实际的程序执行,方法调用的过程中都离不开stack。那么,在一个成熟的类库里面,它的实现是怎么样的呢?也许平时我们实践的时候也会尝试着去写一个stack的实现玩玩。这里,我们就仔细的分析一下jdk里的详细实现。 Stack     如果我们去查jdk的文档,我们会发现stack是在Java.util这个包里。它对应的一
用Java实现栈(Stack)之数组实现
数组实现栈package com.yang.review; /** *-----------栈------------- * 下面的是使用数组实现栈 * * @author 阳 * *栈是一种后进先出的数据结构 * *----------LIFO------------ */ public clas
Java集合知识
关于Java集合的一些资料,关于Vector、Stack等。
山科java实验2-5 使用一维数组编码实现一个栈(Stack)类
使用一维数组编码实现一个栈(Stack)类,要求提供以下操作:(1)boolean isEmpty():判断栈当前是否为空;(2)入栈操作void push(obj):把数据元素obj插入堆栈;(3)出栈操作Object pop():出栈,并返回删除的数据元素;(4)Object getTop():取堆栈当前栈顶的数据元素并返回;(5)利用Stack类实现一个方法:输入一个正整数,输出该整数所对应...
java中heap和stack的区别
暂无
java中栈Stack类操作
/** * Stack类 * 栈:桶型或箱型数据类型,后进先出,相对堆Heap为二叉树类型,可以快速定位并操作 * Stack,支持泛型 * public class Stack extends Vector * Stack的方法调用的Vector的方法,被synchronized修饰,为线程安全(Vector也是) * Stack methods: * push :
java.util.Stack里Stack默认容量有多大?
如果是java.util.Stack的话,通过查看源码,Stack只有一个空构造方法,它继承了Vector。Vector中的无参构造如下:public Vector() { this(10);}this(10)调用了public Vector(int initialCapacity) { this(initialCapacity, 0);}查看注释,/** *
Java的Stack类
自己写了一个Java的Stack类,并与原有的Stack比较
恶补java(十一)-------Stack类的使用
package com.gc.Stack; /** * java中stack的使用方法,堆栈是一种"后进先出"(LIFO)的数据结构,只能在一端进行插入(称为"压栈")或删除(称为"出栈")数据的操作. * Java中,使用java.util.Stack类的构造方法创建对象 * public class Stack extends vector * 构造方法:public Stack()创
java中Stack有什么用,举例说明?
马克-to-win:Stack有时也可以称为“后入先出”(LIFO)集合。换言之,我们在堆栈里最后“压入”的东西将是以后第一个“弹出”的。和其他所有Java集合一样,我们压入和弹出的都是“对象”。 例:3.2.1 import java.util.*; public class TestMark_to_win { static String[] months = { "一", "二", "三" }...
Java 栈 stack方法总结
前言 最近开始在重新刷leetcode,发现之前刷过的很多算法题现在又陆陆续续忘记了。真是应了那句话,面试造火箭,进去拧螺丝。刷了几道在贪心算法中使用stack来完成的。就重新总结下栈Stack的方法。 Stack和Collection的关系 Stack来自于Vector,那么显然stack的底层实现是数组。 Stack的方法 java中Stack只有一个无参构造函数。 属于stack自...
自定义一个Stack类
思想:用一个数组读入元素,再反向取元素即可模拟栈中元素先进后出,后进先出。源代码:#include &amp;lt;iostream&amp;gt; using namespace std; const int Max_SIZE=100;//定义栈大小 class Stack { public: Stack(); ~Stack(); void Push(int x);//入栈 v...
Java 类集简介(Stack子类)
import java.util.Stack; public class Demo { public static void main(String[] args) throws Exception { Stack&amp;lt;String&amp;gt; all = new Stack&amp;lt;&amp;gt;(); all.push(&quot;A&quot;); all.push(&quot;B&quot;); all.push(&quot;C...
十一、一个简单的栈stack实现
一、栈的出栈和入栈规则——先入后出或者说是后入先出 二、简单栈代码展示 /** * @use 自定义栈 * @author lattice * */ class MyStack { private Object[] elements; private int size=0; //设置栈size private static final int MYSTACK_
java集合:stack及其应用举例
一 API栈是一种线性数据结构,遵从 LIFO(后进先出)的操作顺序,所有操作都是在顶部进行。Java 集合框架中的 Stack 继承自 Vector:跟 Vector 一样,它是 数组实现的栈。jdk1.8源码如下:public class Stack&amp;lt;E&amp;gt; extends Vector&amp;lt;E&amp;gt; { /** * Creates an empty Stack...
java中堆(heap)和栈(stack)的区别
   在学习java的过程中,经常会见到椎和栈的介绍,但是一直都是了解了个大概,而且看了之后又经常会忘掉,所以这次在网上查找了一下资料,把对堆和栈的介绍记录下来,以供复习使用。     在java中内存的占用主要分为四块:静态区、代码区、堆、栈。其中,堆和栈是使用最多的。 静态区:内存在程序编译时就分配好的区域,主要存放一些静态变量(static的); 代码区:存放程序方法的二进制代码,而...
java数据类型-Stack
Stack是一种后进先出的数据结构类型(数组)(last in frist out);实现了Vector;在Vector的基础添加了五个方法: push(E item)#把项压入堆栈顶部。 pop() #移除堆栈顶部的对象,并作为此函数的值返回该对象。 peek() #查看堆栈顶部的对象,但不从堆栈中移除它。 boolean empty()#测试堆栈是否为空。 int search(Obj
类 Stack--后进先出(LIFO)的对象堆栈 回顾
java.util 类 Stack&amp;lt;E&amp;gt;java.lang.Object java.util.AbstractCollection&amp;lt;E&amp;gt; java.util.AbstractList&amp;lt;E&amp;gt; java.util.Vector&amp;lt;E&amp;gt; java.util.Stack&amp;lt;E&amp;gt; 所有已实...
Java 用数组实现栈 (Stack),包括栈的初始化,入栈、出栈等操作
这是以前面试搜狐碰上的一道笔试题:用数组的方式实现Stack,
java.util.Stack的用法及简介
看蓝桥杯比赛试题,发现一题用到了Stack这个类,以前不是很懂行,于是乎光哥就查了api,搜了一些相关知识.总结如下.仅供自己以后复习用到时方便. 题目: 下面的代码用于判断一个串中的括号是否匹配 所谓匹配是指不同类型的括号必须左右呼应,可以相互包含,但不能交叉 例如: ..(..[..]..).. 是允许的 ..(...[...)....]...
Java集合篇:Stack
在Java中Stack类表示后进先出(LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的。每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下:  Stack通过五个操作对Vector进行扩展,允许将向量视为堆栈。这个五个操作如下: 操作 操作 empty() 测试堆栈是否为空。 peek() 查看堆栈顶部的对象,但不从堆栈...
Java集合之Stack 源码分析
1.简介栈是数据结构中一种很重要的数据结构类型,因为栈的后进先出功能是实际的开发中有很多的应用场景。Java API中提供了栈(Stacck)的实现,简单使用如下所示 import java.util.Stack;public class StackTest { /** * @param args */ public static void main(Strin
Java中Vector类和Stack类的学习
1.Vector类 API文档的解释:      Vector类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。 每个向量可通过维护 capacity 和 capacityIncrement 来优化存储空间的管理。capacity 至少和向量大小一样
Leetcode 单调栈问题总结(超详细!!!)
0x00 单调栈主要回答这样的几种问题 比当前元素更大的下一个元素 比当前元素更大的前一个元素 比当前元素更小的下一个元素 比当前元素更小的前一个元素 0x01 问题一 维护一个单调递减的栈。 Leetcode 496:下一个更大元素 I(超详细的解法!!!) Leetcode 503:下一个更大元素 II(超详细的解法!!!) Leetcode 739:每日温度(超详细的解法!!!) cl...
用堆栈类StackOfInteger降序输出最小因子
运用了类和对象以及循环来实现: import java.util.Scanner; public class Text { public static void main(String[] args) { Scanner input=new Scanner(System.in); int num=input.nextInt(),ori=num,i=2; S
java集合框架:浅谈如何使用LInkedList实现队列(Queue)和堆栈(Stack)
  Java中的LinkedList 是采用双向循环列表实现的。 利用LinkedList 可以实现栈(stack)、队列(queue)   下面写两个例子 学生类: int stuId; public int getStuId() { return stuId; } public void setStuId(int stuId) { this.stuId = stu...
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 关于java类机器学习 关于java的学习体会