java中的数据结构与集合类

最近在学算法,但是稍微复杂一点的算法都用到了数据结构,数据结构java有已经实现的类,为了以后写算法题方便,现把算法中用到的所有数据结构结合java集合类整理一编

一、首先从java的角度来看

java集合框架图

从上方的图来分析,最顶层的和数据结构相关的就是map和collection

  • 继承collection的都是线性结构涉及到的线性结构有
    • list 继承其的类都具最基础的添加和删除方法add remove
    • set 继承此类的具有无重复的特点,具有添加和删除方法add remove
    • queue 可以说是队列,实现他的直接接口都是各种队列,具体方法有很多,下面详细分析的时候再写
  • 继承map的方法数据结构中都带有键值对即 <K,V> ,这种数据结构在算法题中用处非常大,很多的地方都会用到,是十分重要的数据结构
  • 此外还有迭代器类和方法,也十分重要

二、从数据结构的角度来看

数据结构有 栈 队列 链表 优先队列 树 等等结构在java中全部实现可以说相对于C语言做算法题的时候省了很多功夫

Java集合类使用注意

集合类一般都有泛型,泛型中不能写基本类型,只能写其中的包装类,一般包装类不谈,有一个包装类不常用,而且比较特殊 char的包装类是 Character,我就经常会忘记。。。

链表 ArrayList LinkedList Arrays

这里主要介绍ArrayLIstArrays这两个类,这也是我常常使用到的。
ArrayListLinkedList是很相似的结构但是内里稍有不同,ArrayList内部使用数组实现,LinkedList内部使用链表实现。使用起来各有不同的优势,但是我常用的就是ArrayList

ArrayList

  • add() 添加
  • remove() 删除
  • get() 根据下标取值
  • toArray()
  • isEmpty()
  • size()

Arrays

Arrays这是在算法题中经常用到的一个类,他提供了很多实用方法。可以称之为强大的工具类

  • 数组排序 Arrays.sort()
    此方法可以给数组排序,一切数字类型数组,甚至char和byte型数组均可以排序
    ** 比较特殊的一点还而已数组和数字一起排序sort(int[],int,int)。实用这个方法可以解决几个简单的排序算法题,这应该说是钻了空子,找了捷径。

  • 数组复制 Arrays.copyOf()
    此方法也经常出现在数组的复制中,有些算法题会用到数组复制,使用这个方法即可

  • 数组复制从ij 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中已经实现了所以直接用就行了。平衡二叉树就是使用在大量可比较类型数据快速查找。特征是插入比较慢,但是查找比较快

先这样吧,以后学的精深了再来改,欢迎提出问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值