在学校学习的《数据结构》课程中,对各种数据结构已经有了较为深刻的认识(C++实现),因此在学习Java的过程中,直接应用框架即可。
博客总结于《Java语言程序设计进阶篇》
在面向对象思想里,一种数据结构也被认为是一个容器。它能存储其他对象(数据或元素)的对象。定义一种数据结构从本质上讲就是定义一个类。
集合
- Set 存储不重复的元素
- List 存储一个由元素构成的有序集合
- Queue 需要用先进先出方式处理
Collection接口是处理对象集合的根接口,它有许多公共方法。其中,addAllset1.addAll(set2)
把指定集合中所有元素都添加到这个集合中;removeAllset1.removeAll(set2)
从这个集合中删除指定集合中的元素;retainAllset1.retainAll(set2)
保留两个集合中的共同元素。
Set
Set接口提供的三个具体类是散列类HashSet、链式散列集LinkedHashSet和树形集TreeSet。
HashSet类可以用来存储互不相同的任何元素,大多数类的都实现了hashcode方法。遍历时可以用迭代器或者是for-each循环。
public static void main(String[] args){
Set<String> set = new HashSet<String>();
set.add("Hello");set.add("world");
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next()+" ");
}
//或者是如下
for(Object element: set){
System.out.println(iterator.next()+" ");
}
}
LinkedHashSet用链表实现来扩展HashSet类,支持对规则集内的元素排列。HashSet中的元素是无序的,LinkedHashSet可以按照插入规则集的顺序提取。如果不需要维持顺序则选用效率更高的HashSet。
TreeSet扩展了一些方法。其他用法相同。
first()返回第一个元素 last()返回最后一个元素 headSet(A)返回A之前的元素 tailSet(A)返回A之后的元素 lower(A)小于A的最大元素 higher(A)大于A的最小元素 floor(A)小于等于A的最大元素 ceiling(A)大于等于A的最小元素 pollFirst()pollLast()删除并返回第一个/最后一个元素
Comparator
有时希望将元素插入到一个树结合中,但这些元素不是Comparable的实例也就是不能直接排序,这时候需要自定义一个比较器来比较这些元素,需要创建一个接口类。
总结:Comparator用于比较没有实现Comparable的类的对象。
public static void main(String[] args){
Set<GeometricObject> set = new TreeSet<GeometricObject>(
new GeometricObjectComparator());
set.add(new Rectangle(4,1));
set.sdd(new Circle(30));
for(GeonetricObject element:set){
System.out.println(element.getArea());
}
}
线性表
- add(index,element)在指定下标处插入元素
- addAll(index,collection)在指定下标处插入集合
- remove(index)删除指定下标元素
- set(index,element)在指定下标设置新元素
- indexOf(element)获取指定元素在线性表中第一次出现时的下标
- lastIndexOf(element)最后一次出现的下标
- subList(fromIndex,toIndex)获得一个子线性表
ArrayList是数组线性表,LinkedList是链表。因此,LinkedList除了实现List接口的方法外,还提供了从线性表两端提取、插入和删除元素的方法。
Vector类与ArrayList类一样,但同步方法用于防止两个或多个线程同时访问某个向量时引起数据损坏。对于不需要同步的程序来说,ArrayList的效率更高。栈类Stack是作为Vector的扩展类实现的。empty();peek();pop();push(o:E);search(o:Object);
队列是先进先出的数据结构,优先队列的元素被赋予优先级,拥有最高优先级的元素首先被删除。增加了offer(element: E)
向队列插入一个元素,队列为空返回null poll();
获取并删除队列头,队列为空抛异常 remove()
获取并删除队列头peek();
获取但不删除队列头,队列为空返回null element();
获取但不删除队列头,队列为空抛异常。
Deque为双端队列,有addFirst(e),removeFirst(),addLast(e),removeLast(),getFirst()和getLast()
链表创建队列实例
public static void main(String[] args){
Queue<String> queue = new LinkedList<String>();
queue.offer("hello");
queue.offer("world");
while(queue.size()>0){
System.out.println(queue.remove());
}
}