java中的数据结构与集合类
最近在学算法,但是稍微复杂一点的算法都用到了数据结构,数据结构java有已经实现的类,为了以后写算法题方便,现把算法中用到的所有数据结构结合java集合类整理一编
一、首先从java的角度来看
从上方的图来分析,最顶层的和数据结构相关的就是map和collection
- 继承collection的都是线性结构涉及到的线性结构有
- list 继承其的类都具最基础的添加和删除方法
add remove
- set 继承此类的具有无重复的特点,具有添加和删除方法
add remove
- queue 可以说是队列,实现他的直接接口都是各种队列,具体方法有很多,下面详细分析的时候再写
- list 继承其的类都具最基础的添加和删除方法
- 继承map的方法数据结构中都带有键值对即 <K,V> ,这种数据结构在算法题中用处非常大,很多的地方都会用到,是十分重要的数据结构
- 此外还有迭代器类和方法,也十分重要
二、从数据结构的角度来看
数据结构有 栈 队列 链表 优先队列 树 等等结构在java中全部实现可以说相对于C语言做算法题的时候省了很多功夫
Java集合类使用注意
集合类一般都有泛型,泛型中不能写基本类型,只能写其中的包装类,一般包装类不谈,有一个包装类不常用,而且比较特殊 char
的包装类是 Character
,我就经常会忘记。。。
链表 ArrayList LinkedList Arrays
这里主要介绍ArrayLIst
和Arrays
这两个类,这也是我常常使用到的。
ArrayList
和LinkedList
是很相似的结构但是内里稍有不同,ArrayList
内部使用数组实现,LinkedList
内部使用链表实现。使用起来各有不同的优势,但是我常用的就是ArrayList
。
ArrayList
- add() 添加
- remove() 删除
- get() 根据下标取值
- toArray()
- isEmpty()
- size()
Arrays
Arrays
这是在算法题中经常用到的一个类,他提供了很多实用方法。可以称之为强大的工具类
-
数组排序 Arrays.sort()
此方法可以给数组排序,一切数字类型数组,甚至char和byte型数组均可以排序
** 比较特殊的一点还而已数组和数字一起排序sort(int[],int,int)
。实用这个方法可以解决几个简单的排序算法题,这应该说是钻了空子,找了捷径。 -
数组复制 Arrays.copyOf()
此方法也经常出现在数组的复制中,有些算法题会用到数组复制,使用这个方法即可 -
数组复制从
i
到j
Arrays.copyOfRange(int[],i,j)
此方法也是算法题中常用
Stack 栈
基本数据结构之一,原则是先进后出,或者后进先出
栈这种数据结构或者说Stack类比较好掌握,方法不多而且很好理解
更新:后来了解到,这个类官方并不推荐使用。首先这个类是过去实现的线程安全类,现在有更好的实现方式。其次还有另一个类更符合概念,推荐直接使用LinkedList
LinkedList既可以当做栈这种数据结构来用,也可以当做队列来用。因为LinkedList是用链表来实现的。入队的操作就是把新元素直接添加到链表最后,入栈的操作是添加到链表最前头。pop()和poll()方法都是一个作用,从链表头取元素,但是由于添加时不一样就实现了两种数据结构,通用得还有peek()方法
- pop() 弹栈
- push() 入栈
- peek() 查看栈顶元素并返回
- empty() 判断是否为空
Queue 队列
Queue是个接口,所以使用起来比Stack要稍微复杂一些
队列的特点是先进先出,但是Queue实现的类中优先队列略有不同
- LinkedList 实现了Queue接口可以直接当队列来使用
- offer() 加入
- poll() 移出并返回
- peek() 查看并返回
- element() 查看并返回
- PriorityQueue 优先队列 树形结构
优先队列相对于普通队列在出队的时候有区别,不是先进的先出,而是优先级高的先出
优先级队列用于实现一些奇怪的算法,比如第k大的数。虽然算法难度上写的是简单级别,但是如果不知道这个数据结构就很难做-_-||- add() 就是调用了offer()方法,不知道为啥要多此一举-_-||
- offer() 加入
- peek() 查看并返回
- poll() 移出并返回
- 默认优先级为自然顺序,可通过实现Comparator接口来改
- 实现情况为小顶堆 详细介绍点击
示例:
import java.util.Comparator;
import java.util.PriorityQueue;
public class YouXianQueue {
public static void main(String[] args) {
// TODO Auto-generated method stub
//比较器Comparator,把优先队列变成大顶堆
Comparator<Integer> com=new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//根据第一个值小于、等于、大于第二个值,分别返回-1,0,1
//强烈注意,包装类无法直接比大小!!!!!
if(o1.intValue()>o2.intValue()) return -1;
else if(o1.intValue()<o2.intValue()) return 1;
else return 0;
}
};
//特记载一个简单写法,jdk1.8的新特性
Comparator<Integer> parator = (o1,o2)->{
return o2-o1;//三行代码完成上面内容
};
PriorityQueue<Integer> yx1=new PriorityQueue<Integer>(5,com);//添加比较器变成大顶堆
for(int i=6;i>=0;i--) {
yx1.offer(i);
}
for(int i=0;i<5;i++) {
System.out.println(yx1.poll());//自然顺序取,每次取最小值
}
PriorityQueue<String> yx2=new PriorityQueue<String>(6);//6是初始堆大小,默认值为11
yx2.offer("c");
yx2.offer("a");
yx2.offer("d");
yx2.offer("f");
for(int i=0;i<4;i++) {
System.out.println(yx2.poll());//自然顺序取,每次取最小值
}
}
}
Map <K,V> 键值对结构
我常用HashMap,所以主要介绍HashMap。其他的我用熟了再补充
HashMap
哈希键 对应值- put() 添加
- get() 获取
新增知识点一
Java中对红黑树进行了实现 TreeSet
红黑树是一种具有复杂规则的自平衡二叉排序树,规则十分复杂,但是现在java中已经实现了所以直接用就行了。平衡二叉树就是使用在大量可比较类型数据的快速查找。特征是插入比较慢,但是查找比较快。
先这样吧,以后学的精深了再来改,欢迎提出问题