常见的数据结构java实现

本文介绍了如何使用Java实现常见的数据结构,包括链表的创建与操作,如LinkedList类中的add()、remove()等方法;栈的实现,以及Stack类中的push()、pop()等方法;树集的创建与操作,如TreeSet类的排序特性;树映射的实现,如TreeMap类的key-value对存储;以及散列表的实现,如Hashtable类的put()、get()等方法。此外,还讨论了HashSet和TreeSet的区别与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.常见数据结构的Java实现 
(1)链表的基本操作  掌握该方法即可
(2)栈
(3)树集
(4)树映射
(5)散列表
(6)散列集


2.链表的创建
使用java.util包中的LinkedList类,可以创建一个链表对象。例如:
LinkedList mylist=new LinkedList();  //创建了一个空双链表
也可以使用add()方法向链表依次增加节点。例如增加节点:
mylist.add(“It”);
mylist.add(“is”);
mylist.add(“a”);
mylist.add(“door”);
这样就形成了4个节点的链表,数据依次为“It”、“is”、“a”、“door”,4个节点是自动链接的。 


3.LinkedList类中的常用方法


public boolean add(Object element) //向链表末尾添加一个新的节点,该节点中的数据是参数element指定的对象。
public void add(int index, Object element ) //向链表指定位置添加节点,该节点中的数据是参数element指定的对象。
public void addFirst(Object element) //向链表头添加新节点,该节点中的数据是参数element指定的对象。
public void addLast(Object element) //向链表尾添加新节点,该节点中的数据是参数element指定的对象。
public Object removeFirst() //删除第一个节点,并返回这个节点中的对象。
public Object removeLast() //删除最后一个节点,并返回这个节点中的对象。
public Object remove (int index) //删除指定位置的节点
public Object get (int index) //得到指定位置的节点
public Object getFirst() //得到链表第一个节点的对象。
public Object getLast() //得到链表最后一个节点的对象。
int indexOf(Object element):返回节点对象element在链表中首次出现的位置,如果链表中无此节点对象则返回-1。
public int lastIndexOf(Object element):返回节点对象element在链表中最后出现的位置,如果链表中无此节点对象则返回-1。
public Object set(int index,Object element) //将当前链表index位置节点中的对象替换成参数element指定的对象,返回被替换对象。
public int size( ) //返回量表的长度,即节点的个数。
public boolean contains(Object element):判断链表节点对象中是否含有element。


4.使用Iterator类遍历链表


迭代器(Iterator),又叫做游标(Cursor)。
提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 


Boolean  hasNext():如果仍有元素可以迭代,则返回 true。
Object next():返回迭代的下一个元素。
void remove():从迭代器指向的集合中移除迭代器返回的最后一个元素。
一个链表对象可以使用iterator()方法获取Iterator变量, Iterator对象中每个数据成员刚好是链表节点中的数据,而且这些数据成员是按顺序存放在Iterator对象中的, Iterator对象使用next()方法可以得到其中的数据成员。




5.栈
栈(Stack)也是一种特殊的线性表,是限定仅在表尾进行插入和删除运算的线性表,是一种后进先出(LIFO)的数据结构。
只能在一端进行输入或输出数据的操作,堆栈把第一个放入该堆栈的数据放在最底下,而把后续放入的数据放在已有数据的顶上,表尾称为栈顶(top),表头称为栈底(bottom)。
栈的物理存储可以用顺序存储结构,也可以用链式存储结构。向堆栈中输入数据的操作称为“压栈”,从栈中输出数据的操作称为“弹栈”。


6.栈的常用方法
使用java.util包中的Stack类创建一个堆栈对象,堆栈对象可以使用以下方法:
public Object push(Object data) //输入数据,实现压栈操作
public Object pop() //输出数据,实现弹栈操作
public boolean empty() //测试堆栈是否为空。如果空,返回true,否则返回false
public object peek() //查看堆栈顶端的数据,但不删除该数据。
public int search(Object data) //返回对象在栈中的位置,最顶端的位置是1,向下依次增加,如果堆栈不含此数据,则返回-1。




7.用链表实现栈
可以采用链表的方法来实现栈。
用方法addFirst(Object element)实现进栈操作。
用方法removeFirst()实现出栈。
用方法getFirst()实现栈顶数据查询。
用方法isEmpty() 实现栈是否为空。


8.树集
TreeSet类是实现Set接口的类。
树集是由一些节点对象组成的数据结构,节点按着树形一层一层的排列。
树集是个有序集合,可以按照任何顺序将元素插入该集合,该元素将被纳入它的相应的排序位置;当迭代通过该集合时,各个值将自动按照排序后的顺序出现;将元素添加给树集的速度要比将它添加给散列表慢,但是仍然比添加到数组或链接式列表中的正确位置快。


9.用构造方法TreeSet()创建一个树集
可以使用java.util包中的TreeSet来创建一个树集,如
TreeSet mytree=new TreeSet();
mytree.add("boy");       //然后使用add方法为树集添加节点:
mytree.add("zoo");
mytree.add("apple");
mytree.add("girl");


10.用构造方法TreeSet(Comparator c)创建一个树集
很多对象不适合用字典序进行比较,在创建树集时可自己规定节点按着什么样的“大小”顺序排列。
假如我们有四个学生对象,他们有姓名和成绩,我们想把这四个对象做为一个树集的节点,并按着成绩的高低排列节点,而不是按着姓名的字典序排列节点。


11.(1)首先创建学生的NewStudent类必须实现接口:Comparable。
Comparable接口中有一个方法:
public int compareTo(Object b); 
所有可以排序的类都必须实现Comparable接口。
NewStudent类通过实现这个接口来规定它创建的对象的大小关系,如下所示。
Java规定:
a.compareTo(b)=0时,称二者相等;
s1.compare(s2)>0时,称a大于b;
s1.compare(s2)<0时,称a小于b。




12.TreeSet类的一些常用方法
TreeSet类的一些常用方法如下:
public boolean add(Object o):向树集添加加节点,添加成功返回true,否则返回false。
public void clear():删除所有的节点。
public void contains(Object o):如果包含节点o返回true 。
public Object first():返回根节点,即第一个节点(最小的节点)。
public Object last():返回最后一个节点(最大的节点)。
public isEmpty():判断是否是空树集,如果树集不含节点返回true 。
public boolean remove(Object o):删除节点o。
public int size():返回节点数目。


13.树映射
上一节学习的树集TreeSet适合用于数据的排序,结点是按着存储的对象的大小升序排列。TreeMap类实现了Map接口,称TreeMap对象为树映射。树映射使用:
public V put(K key,V value); 
方法添加结点,该结点不仅存储数据value,而且也存储和其关联的关键字key,也就是说,树映射的结点存储“关键字/值”对。和树集不同的是,树映射保证结点是按照结点中的关键字升序排列。TreeMap类的常用构造方法如下:
TreeMap():构造一个新的空映射,该映射按照键的自然顺序排序。
TreeMap(Comparator<? super K> c):构造一个新的空映射,该映射根据给定的比较器进行排序。


14.散列表Hashtable
散列表是使用相关关键字查找被存储的数据项的一种数据结构,关键字必须唯一,任何非 null 对象都可以用作键或值。
散列表在它需要更多的存储空间时会自动增大容量。例如,如果散列表的装载因子是0.75,那么当散列表的容量被使用了75%时,它就把容量增加到原始容量的2倍。
为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法


15.散列表是使用相关关键字查找被存储的数据项的一种数据结构,关键字必须唯一,任何非 null 对象都可以用作键或值。
散列表在它需要更多的存储空间时会自动增大容量。例如,如果散列表的装载因子是0.75,那么当散列表的容量被使用了75%时,它就把容量增加到原始容量的2倍。


为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法


16.Hashtable类的常用方法
Hashtable类的常用方法如下:
public Hashtable():创建具有默认容量和装载因子为0.75的散列表。
public Hashtable(int itialCapacity):创建具有指定容量和装载因子为0.75的散列表。
public Hashtable(int initialCapacity,float loadFactor):创建具有默认容量和指定装载因子散列表。
public void clear():清空散列表。
public boolean contains(Object o):判断散列表是否有含有元素o。
public Object get(Object key):获取散列表中具有关键字key的数据项。
public boolean isEmpty():判断散列表是否为空。
public Object put(Object key,Object value):向散列表添加数据项value并把关键字key关联到数据项value。
public Object remove(Object key):删除关键字是key的数据项。
public int size():获取散列表中关键字的数目。
elements()方法返回一个Enumeration对象,实现遍历散列表.




17.散列集
散列表是个链接式列表的阵列,每个列表称为一个散列表元,散列表为每个对象计算出一个整数,称为散列码,不存在重复的多个元素;若要查找表中的某个对象的位置,只要计算出它的散列码,再将它减去以散列表元的总数为模数的值,得出的数就是拥有该元素的散列表元的索引。如果大致知道散列表最终会拥有多少个元素,那么应该将初始散列表元的数量设置为大约是预期元素数量的150%,最好是将散列表的大小设置成一个素数。在Java中,使用加载因子决定何时要对散列表进行再散列。
Java的集合库提供了一个HashSet类,用于根据散列表来实现一个散列集;构造函数如下:
HashSet(int initialCapacity); 
HashSet(int initialCapacity,float loadFactor); 


只有在不在乎集合中的各个元素的顺序时,才能使用散列集。
Java增加了一个类LinkedHashSet,用于跟踪添加给散列集的元素顺序;其迭代器会按照元素的插入顺序来访问各个元素。








18.HashSet和TreeSet的比较:
HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值