java集合杂记

类集

java对数据结构的成熟实现

三大接口

Lterator: 迭代器,对所有数据结构最优的获取方式

collection :进行单值存储的集合,如数组

Map: 双值存储的方式,如钥匙对

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2LakyQ8u-1591722166927)(C:\Users\17243\AppData\Roaming\Typora\typora-user-images\image-20200609230734104.png)]

常见的数据结构

栈: 先进后出,只在尾部操作

队列: 先进先出

数组:查找方便,操作慢

链表: 存下一个元素的地址,查找慢

二叉树: 会存下左右俩边的地址,代表性有红黑二叉树

图: 由节点和边构成,节点,边都可以有权值,边还可以有方向

collection

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JyrBCKAd-1591722166929)(C:\Users\17243\AppData\Roaming\Typora\typora-user-images\image-20200608220258803.png)]

一般使用它的子类 List和Set,List用于允许重复的单值,Set用于不允许c重复的单值

List详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lFyQqAl7-1591722166932)(C:\Users\17243\AppData\Roaming\Typora\typora-user-images\image-20200608220930921.png)]

对Collectionl已有的扩充

List实现类

List子类: ArrayList(95%),LinkList(1%),Vector(4%),前俩使用最多

基于动态数组实现

Vector线程安全,排队操作,但是慢,ArrayList早期版本

ArrayList线程不安全,多人同时操作

基于双向链表实现

LinkList

ArrayList

数组结构存储, 增加删除慢,查找快

ArryList 空构造方法长度其实是0,传值时才会变长

Vector详解

增加删除慢,查找快

四个构造方法

Vector()扩容增量可自定义,如果是0默认翻一番)

LInkList详解

增加删除快,查找慢

可以看成队列,栈,队列有特定的addFrist(),removeFirst(),addLast(),removeLast()

对于栈还有push()方法和pop()方法

迭代器

Lterator 迭代器List,Set都可以用

LiskLtertor迭代器主要对List,是Lterator的子类

iterator, 理解为有个指针,next()控制指针下移,并且等于这个数据,previous()控制指针上移,并且等于这个数据,注意指针初始是在第一个数组的上面

forEach(增强for循环)

用于迭代数组或集合(集合只能是Collection下的)

语法

for(数据类型 变量名:集合或数组名){}
Set集合(没有相同元素)

没有get() 只能迭代器或者toArray()

元素随机存储,不能以下标操控

HashSet()

实质是散列函数

map双值存储的哈希表,hashset底层还是调用map的

存储没有顺序,先add不一定先输出

TreeSet

实质是二叉树存储,底层是调用treemap的

快速失败,集合改了,迭代器随着集合变

安全失败,集合改了,但是备份了一份,迭代器随着备份变(一般是安全失败)

集合内顺序按ascell码大小排序,与输入无关,若自定义单值,需要在自定义的里面实现Comparable,及里面的所有抽象方法----compareTo

例子

package com.home;


import com.sun.source.tree.Tree;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;
import java.util.TreeSet;

public class Iterator1 {
    public static void main(String[] args) {
        TreeSet<Person> set = new TreeSet<>();
        Person person1 = new Person("z", 16);
        Person person2 = new Person("w", 18);
        set.add(person1);
        set.add(person2);
        for (Person s : set
        ) {
            System.out.println(s);
        }
   /*     Iterator<String> iterator=set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
*/


    }


    static  class Person implements Comparable<Person> {
        private String name;
        private int age;

        @Override
        public int compareTo(Person p) {
            if (this.age > p.age) {
                return 1;
            }
            if (this.age == p.age) {
                return 0;
            }else {return -1;}
        }

        public Person(String name, int age) {


            this.age = age;
            this.name = name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            Person person = (Person) o;
            return age == person.age &&
                    Objects.equals(name, person.name);
        }

        @Override
        public int hashCode() {

            return Objects.hash(name, age);
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}


Map==Mapping

map一次存俩,称为键值对,每对键值对的键不同

keySet(): 对键遍历 values()对值遍历,变成单值存储的集合

put(key,value)添加一对键值对,此函数返回值若添加与原有不同为null,若有相同,返回被值为原来的值

remove(k,v)删除,若不匹配无法删除,返回值当删除成功就是被删的值,失败就是null,该用法可以看成取出,但是是取完就没了那种一次性的

HashMap

哈希表实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值