JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)
Java的集合可以分为两种,第一种是以数组为代表的线性表,基类是Collection;第二种是以Hashtable为代表的键值对。 。。。
- 线性表,基类是Collection:
数组类:
person[] p; system.out.println(p.length);//报错,不允许对null对象进行任何实际操作。 person[] p=new person[5];
Vector类——数组的改进:
1)四个构造函数
Vector(int initialCapacity,int capacityIncrement);
Vector(int initialCapacity);
Vector();
Vector(<E> c); ==>Vector<String> v=new Vector<String>();
2)注意点
如果使用了泛型,则Vector内只能添加同样类型的对象(泛型指示的对象);如果没使用泛型,那么我们可以把任意的Object类型对象(Boolean/Character/Byte/Short/Integer/Long/Double/Float)添加进Vector,但是不能把基本数据类型(Boolean/Char/Byte/Short/Int/Long/Double/Float)放入Vector中。 如:int i=10; Integer ig=new Integer(10); Vector v=new Vector(); v.addElement(i);//wrong v.addElement(ig);//write
如果没使用泛型,Vector对象事先不知道会是何种类型的数据放入,所以一切数据皆用Object类型来存储。这就存在Vector中对象丢失原始类型的现象,所以我们得到对象后必须用强制类型转换,将对象还原回它放入Vector之前的类型。
如:Vector boys=new Vector(); boys.addElement(new Boy("wang")); boys.addElement(new Girl("zhang"));//这里不会有错 for(i<boys.size()){((Boy)boys.elementAt(i)).print();}//当i==1时,会出错,显然不能用访问Boy对象的方法去访问Girl对象。 我们可以看到Vector很灵活,同一个Vector可以容纳不同类型的对象,但是这种灵活性是以牺牲存放在其中的对象类型为代价的,这也给访问造成了麻烦。
3)常见操作
v.addElement(E obj);//直接插入后面
v.insertElementAt(E obj,int index);//插入,并,后移
v.setElementAt(E obj,int index);//替换
boolean removeElement(Object obj);//删除第一个obj,返回操作结果(未找到,或,失败,false;找到并成功,true)
void removeElementAt(int index);//
void removeAllElements();//
int size();
E elementAt(int index);//依次访问
Stack类——FILO、继承Vector:
1)构造函数
Stack();
Stack<String> st=new Stack();
2)方法
E pop();//访问栈顶元素,并,弹出 while(st.empty()!=true) { System.out.println(st.pop().toString()); }//注意类型转换
E peek();//访问栈顶元素,但,不弹出。 while(st.empty()!=true) { System.out.println(st.peek().toString()); }//死循环
E push(E item);//
boolean empty();//
链表式的List接口及LinkedList实现类:
1)List接口方法
void add(int index,E element);
booleam add(E obj);//插入后面
E remove(int index);
boolean remove(Object obj);//删除第一个
E get(int index);//注意类型转化
int size();
int indexOf(Object obj);//索引值,或,-1
void clear();
List<E> subList(int fromIndex,int toIndex);
2)LinkedList类构造函数
LinkedList();
LinkedList(Collection c);
LinkedList(<E> c);
3)LinkedList类的方法(除了List接口方法外,增加的方法。即:LinkedList的方法包括List接口方法+自身特有的方法)
void addFirst(E obj); void addLast(E obj);
E getFirst(); Object getLast();
E removeFirst(); Object removeLast();
set接口——不允许有重复元素:
1)set接口方法
boolean add(E o);//无重复元素,且,插入成功,true;有重复元素,或,插入失败,false;
boolean remove(Object o);//有指定元素,且,删除成功,true;无制定元素,或,删除失败,false;
boolean isEmpty();
int size();
2)既然要防止重复,就要找到高效率的结构,一般基于“散列表”(HashSet)或基于“树结构”(TreeSet)。
TreeSet比较复杂;HashSet主要是一个散列函数,两个构造方法:HashSet(); HashSet(<E> c);
- 键值对:
Hashtable类:
1)构造函数
Hashtable();
Hashtable(int initialCapacity);
Hashtable(int initialCapacity,float loadFactor);//初始容量和装载因子,装载因子为0.75为好
Hashtable(<K,V> t);
2)Hashtable方法
V put(K key,V value);//插入,并,返回插入的值value
V get(Object key);//
boolean contains(Object value);//(一定注意类型一致,且,数值一致,且,内存地址一致):覆写
boolean containsKey(Object key);//(一定注意类型一致,且,数值一致,且,内存地址一致):覆写
boolean containsValue(Object value);//(一定注意类型一致,且,数值一致,且,内存地址一致):覆写
3)注意:对于Hashtable的contains系列方法
例如:ht.put(new Integer(1),new String("zhang"));
那么:ht.containtsKey(new String("zhang"))的返回值是false,因为内存地址不一致。
那么:ht.containtsKey(new Integer(1))的返回值是false,因为内存地址不一致。
对策:对于(假设String类型)的value(假设类型、值都一样),系统是通过调用Object的equals方法判断的,该方法要求类型、值、内存地址都相同才返回true。所以我们可以覆写该方法,public boolean equals(Object obj){ return (obj instanceof String)&&( String.equals( ((String)obj).getValue() ) }//即:不判断内存,只判断类型和值。
对于(假设Integer类型)的Key(假设类型、值都一样),除了覆写equals方法,public boolean equals(Object obj){ return (obj instanceof Integer)&&( Integer.equals( ((Integer)obj).getValue() ) }//即:不判断内存,只判断类型和值。 还需要覆写hashCode方法,否则,系统会通过调用Object的hashCode方法判断键值是否一样,该方法返回的是内存地址。 public int hashCode(){ return 1; }
总之:对于Hashtable的contains系列方法,必须要求我们通过覆写equals方法来定义对象相等的条件,同时要要覆写hashCode方法为同一类型的对象定义相同的散列吗。
Map接口——封装了散列表:
1)Map接口方法
V put(K key,V value);//插入,并,返回插入的值value
V get(Object key);//
boolean containsKey(Object key);//(一定注意类型一致,且,数值一致,且,内存地址一致):覆写
boolean containsValue(Object value);//(一定注意类型一致,且,数值一致,且,内存地址一致):覆写
V remove(Object key);
int size();
void clear();
boolean equals(Object o);//定义Map对象与Object对象相等的条件。。。。。
int hashCode();//定义此类Map对象拥有的hashCode。。。
Set<Map.Entry<K,V>>entrySet();//返回此键值对所包含的键到值映射关系。
HashMap类、TreeMap类——实现Map接口的类:
HashMap类似Hashtable,是无序的;TreeMap存放数据是有序的,默认升序,而且可以通过subMap方法得到有序的子序列。
两种遍历方法:
1)利用枚举类:
Iterator i=map.keySet().iterator();
while(i.hasNext()){ Object o=i.next(); System.out.println("key="+o+",value="+map.get(0)); }
2)利用Entry对象:
for(Entry<String,Integer> entry:map.entrySet()){ System.out.println("key="+entry.getKey()+",value="+entry.getValue()); }
JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)的更多相关文章
- 【Java】 大话数据结构(1) 线性表之顺序存储结构
本文根据<大话数据结构>一书,实现了Java版的顺序存储结构. 顺序存储结构指的是用一段地址连续的存储单元一次存储线性表的数据元素,一般用一维数组来实现. 书中的线性表抽象数据类型定义如 ...
- 【Java】 大话数据结构(2) 线性表之单链表
本文根据<大话数据结构>一书,实现了Java版的单链表. 每个结点中只包含一个指针域的链表,称为单链表. 单链表的结构如图所示: 单链表与顺序存储结构的对比: 实现程序: package ...
- 【Java】 大话数据结构(5) 线性表之双向链表
本文根据<大话数据结构>一书,实现了Java版的双向链表. 在每个数据结点中都有两个指针,分别指向直接后继和直接前驱,这样的链表称为双向链表. 双向链表的结构如图所示: 查找元素可以根据元 ...
- JAVA中的数据结构——集合类(序):枚举器、拷贝、集合类的排序
枚举器与数据操作 1)枚举器为我们提供了访问集合的方法,而且解决了访问对象的“数据类型不确定”的难题.这是面向对象“多态”思想的应用.其实是通过抽象不同集合对象的共同代码,将相同的功能代码封装到了枚举 ...
- 【Java】 大话数据结构(3) 线性表之静态链表
本文根据<大话数据结构>一书,实现了Java版的静态链表. 用数组描述的链表,称为静态链表. 数组元素由两个数据域data和cur组成:data存放数据元素:cur相当于单链表中的next ...
- 【Java】 大话数据结构(4) 线性表之循环链表
本文稍微介绍了一下循环链表. 将单链表终端结点的指针域由空指针改为指向头结点,形成一个环,这种头尾相接的单链表称为循环列表. 循环列表的结构如下图所示: 循环链表的优点:可以从任意一个结点出发,遍历所 ...
- 18、Java中的 数据结构
Java2中引入了新的数据结构 集合框架 Collection,下一节再谈论(非常重要,面试也常问). 1.枚举 (Enumeration) 1.1 Enumeration 源码: public in ...
- [转]详细介绍java中的数据结构
详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...
- 详细介绍java中的数据结构
详细介绍java中的数据结构 http://developer.51cto.com/art/201107/273003.htm 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个 ...
随机推荐
- GuessFist
import java.util.Scanner; import java.util.Random; /** *跟电脑玩石头剪刀布,需要从控制台输入信息, *然后去判断,然后给予反馈信息 */ pub ...
- Apollo,Python,Delphi与Oracle之间的神话关系
在希腊历史上Delphi曾被认为是世界的中心,Apollo杀死Python后将其据为己有,在其神庙上刻有Oracle,曰:Γνωθι δεαυτόν (认识你自己自身关怀,Cognosce te ip ...
- *windows下安装以及配置nginx
1.从nginx官网下载相应的安装包. http://nginx.org/
- Android Andbase应用开发框架
[运行说明]运行AndbaseDemo需要将文件中的Andbase库Add进demo中.1.andbase中包含了大量的开发常用手段.如网络下载,多线程与线程池的管理,数据库ORM,图片缓存管理,图片 ...
- (3)TXT转为XML
<?xml version="1.0" encoding="utf-8"?> <bocb2e> <head /> <t ...
- 传感器(2)常用api简介及列出当前设备支持的传感器代码
Android SDK提供了Android sensor framework,可以用来访问当前Android设备内置的传感器. ASF提供了很多类和接口,可以帮助我们完成各种与传感器有关的任务. 例如 ...
- DataGridView控件的使用---添加行
最简单的方法 可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行. 假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控 ...
- [原]用WebBrowser组件模拟人工运行搜索引擎自动点击搜索结果的实验
本代码只是业余时间无聊写着试试,用WebBrowser组件模拟人工运行搜索引擎自动点击搜索结果的实验 这是网络中盛传的提高搜索引擎点击率的一种方式,当然属于作弊,不推荐各位使用.另外这种方式的性能不佳 ...
- Java 比较两张图片的相似度
import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; /** * 比较两张图片 ...
- hdu 3501 Calculation 2 (欧拉函数)
题目 题意:求小于n并且 和n不互质的数的总和. 思路:求小于n并且与n互质的数的和为:n*phi[n]/2 . 若a和n互质,n-a必定也和n互质(a<n).也就是说num必定为偶数.其中互质 ...