JAVA Collection集合和常用数据结构

Collection集合和常用数据结构

一、collection和collections的区别

​ collection是集合类的上层接口,本身是一个接口,里面包含了一些集合的基本操作。

​ collections是集合类的一个工具类,里面提供了一些静态的方法可以直接操作集合对象

​ 比如:1、Collections.addAll( coll ,”1”,”2”) ; //一次添加多个数据进集合coll

​ 2、Collections.shuffle(coll); //打乱集合coll中的顺序

​ 3、Collections.sort(coll); //对coll集合排序

​ 4、Collections.srort(coll,new Compartor()); //更改排序规则

二、Collection集合

1、栈Stack 先进后出
//初始化一个栈
Stack<Integer> stack = new Stack<Integer>();

//数据进栈
stack.push("value");

//数据出栈
stack.pop();

//取出栈顶值(且值不会被弹出栈)
stack.peek();

//判断栈是否为空
stack.isEmpty();
栈的应用:用两个栈来实现队列

​ (原理把一组数据放进栈1后,在将栈1的数据弹出放进栈2,这样数据完成了一次交换,第一个入栈的数据,在栈1中是在最后面,在栈2中是在最上面,栈2的栈顶,就是构建的队列的头,栈1的栈顶,就是队列的尾。)

public class Solutcion{
    //初始化两个栈
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    //入队操作,入队的数据就先存储在stack1中
    public void puph(int node){
        stack1.push(node);
    }
    //出队操作,出队先进stack1的数据传个stack2,同时会清空stack1,那么下次数据进入stack1的时候 数据的顺序是不会被改变的。
    public int pop(){
        //如果stack2为空就从stack1中获得数据  不为空就直接弹栈
        if(stack2.isEmpty()){
            //将stack1的所有数据传给stack2
            while(!stack1.isEmpty()){
                //stack1弹栈的同时,stack2进栈
                stack2.push(stack1.pop());
            }
        }
        //返回stack2的栈顶元素,即队列的头部元素
        return stack2.pop();
    }
}

三、队列Queue 先进先出

​ 队列的基本操作 LinkedList集合实现了queue接口,可以当作Queue使用

//初始化队列
Queue<Integer> queue = new LinkedList<>();
//添加有两个方法 add和offer  add添加失败会报错,offer添加失败返回false

//移除队首:poll()和remove(), 如果队为空,poll会返回null.reomve会抛出异常

//获得队首且不移除:peek()和element(),队列为空,peek返回ull,element会抛出异常

//因此推荐使用 offer(),poll(),peek()进行操作
queue.offer(12);
queue.poll();
queue.peek();

四、Set集合 无序(不会记住元素的添加顺序)、不可不重复

4.1 HashSet

HashSet是接口的典型实现,使用set集合时多数是使用HashSet类来实现。HashSet按Hash算法存储集合中的元素,因此具有很好的存取和查找功能。底层数据结构是哈希表

哈希表是指一个元素为链表的数组,综合楼数组与链表的优点

HashSet特点:

​ 无序,存储顺序与添加顺序可能会不一样

​ HashSet不是同步的

​ 集合元素值可以为NULL

如果使用自定义类,则该类需要重写hashCode()和equals()方法

4.2 LinedHashSet

LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说当遍历集合LinkedHashSet集合里的元素时,集合将会按元素的添加顺序来访问集合里的元素。

五、list集合 有序(按照加入顺序排序)可重复

​ List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引

5.1 ArrayList

​ ArrayList是基于数组实现的List类,它封装了一个动态的增长的、允许再分配的Object[]数组。(查找快、增删慢)

5.2LinkedList

​ 实现List接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素。同时它还实现Deque接口,即能将LinkedList当作双端队列使用。自然也可以被当作"栈来使用"(增收快 )

六、Map

map:map集合的key不允许重复

Java.util.HashMap<k,v>集合:

​ 1、hashMap集合底层是哈希表,查询的速度特别快

​ JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8使用)

​ 2、hashMap集合是一个无序的集合,存进来的顺序和取出来的顺序不一样,因为会进行排序

LinkedHashMap集合继承了HashMap集合:

​ 1、LinkedHashMap集合是哈希表+链表(保证迭代的顺序)

​ 2、LinkedHashMap集合是有序的集合

map接口中常用的方法

Map<String,String> map = new HashMap<String,String>();

//1、加元素 k  value
map.put("胡歌","霍建华");
map.put("迪丽热巴","马儿扎哈");

//2、移除元素 根据键值
map.remove("胡歌");

//3、根据键值,获得对应的值
String name = map.get("迪丽热巴");

//4、判断集合中是否包含指定的键
boolean isContains = map.containsKey("胡歌");

//5、获得map集合中所有的key 生成一个set集合  keySet();  可以用来遍历
Set<String> set = map.keySet();
for(String key : set){
    //通过key获得value
    String value =map.ge(key);
    System.out.println(value);
}

//6、通过迭代器遍历map集合
Interator<String> it = set.iterator();
while(it.hasNext()){
    //通过key获得value
    String key = it.next();
    String value =map.ge(key);
    System.out.println(value);
}

//7、map接口中entry对象 类似于c++的pari<T,T>;对象
// entry有getKey()和getValue()两个方法
// 将map集合中所以属性和值,生成对应的entry对象,并保存在set集合中
// map接口中的方法:Set<map.Entry<String,String>> entrySet();
// 通过entyset遍历map
Set<<Map.Entry<String,String>> set = map.entrySet();
Interator<<Map.Entry<String,String>> it = set.iterator();
while(it.hashNext()){
    //取出每一个entry对象  
    <Map.Entry<String,String>> entry = it.next();
    String value = entry.getValue;
    String key = entry.getKey;
    
}

Map集合保证key是唯一的:

​ 作为key的元素,必须重写hashCode方法和equals方法。以保证key唯一

​ set集合也是一样的,set中的类型是重现了hashCode和equals方法的所以可以保持唯一

LinkedHashMap存储进来是有序的,也就是存进来是怎么样的,拿出来就是怎么样的。

HashTable 集合

特点:

​ 1、非空对象都可以作为键或值(hashMap可以存储null值,null键)

​ 2、同步的代表单线程,线程安全,但是速度慢

​ 3、底层也是哈希表

​ 4、HashTable和vector都在1.2后被更先进的集合(hashMap,ArrayList)取代了

​ 5、而HashTable的子类Properties依然活跃。Properties集合是一个唯一和IO流相结合的集合

数组

​ 数组的声明的两种方式:

数据类型[] 数组名字 : int[] a;
数据类型 数组名字[] : int a[];

​ 数组的初始化的方式

int[] a = new int[20];
int[] a = new int[]{1,2,3};
int[] a = {1,2,3};

​ 数组常用操作

//根据数组创建ArrayList
String[] str1 = {"a","b"};
ArrayList<String> array = new ArrayList<String>(Arrays.asList(str1));

//利用list判断数组内部是否包含某个值
boolean isContain = Arrays.asList(str1).contains("a");

//连接两个数组
int[] a1 = {1,2,3};
int[] a2 = {4,5,6};
int[] a3 = ArrayUtils.addAll(a1,a2);

//根据分隔符拼接数组元素
String s = StringUtils.join(str1,"-");
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值