集合

                       集合

目录

                       集合

一.Collectio(父接口)

二.List子接口

二.1.List集合

List实现类:

ArrayList重点:

Vector类.

LinkedList类.

泛型集合[解决应用问题]

泛型:高级类别的知识

三.Set子接口

三.1.Set集合

四.遍历

Map集合体系

一.Map接口

特点.

方法.

二.HashMap

三.Hashtable

五.TreeMap.


 

  • 概念:对象的容器,存储对象的对象,可代替数据

  • 特点:容器的工具类,定义了对多个对象进行操作的常用方法

  • 位置:java.util.*;

一.Collectio(父接口)

  • 特点:代表一组任意类型的对象,无序,无下标

  • 方法

  • boolean add(OBject obj)//添加一个对象

  • boolean addAll(Collection c)//将一个集合中所有对象添加到集合中

  • void clear()//清空此集合中的所有对象

  • boolean contains(Object o)//检查此集合中是否包含o对象

  • boolean equals(Object o)//比较此集合是否与指定对象相等

  • Boolean isempty()//判断集合是否为空

  • boolean remove(Object o)//在此集合中移除o对象

  • int size()//返回此集合中的元素个数

  • Object[] toArray()//此集合中转换成数组

二.List子接口

二.1.List集合

  • 是Collection集合的子类

  • 特点:有序,有下标,元素可以重复

  • 方法:

  • void add(int index,Object o)//在index位置插入对象o

  • boolean addAll(int index,Collection c)//将集合中一个元素添加到

  • //此集合中的Inde位置

  • Object get(int index)//返回集合中指定位置的元素

  • List subList(int fromIndex,int toIndex)//返回formIndex和toIndeX之间的元素

List实现类:

  • ArrayList重点:

  • jdk7之前创造无参构造方法,初始值为10
    * jdk8创造无参构造方法,初始值为0,如果不用,不占空间,当插入元素之后为10,数组扩容,降低内存的使用
package LIst;
import  java.util.ArrayList;
class AList {
    /**
     * jdk7之前创造无参构造方法,初始值为10
     * jdk8创造无参构造方法,初始值为0,如果不用,不占空间,当插入元素之后为10
     * @param args
     */
​
    public static void main(String[] args){
        ArrayList al =new ArrayList();
        boolean result = al.add("Hello");//对象的容量存储对象的对象
        System.out.println(result);//存储到下标为0的数组里面
        Object  obj= al.get(0);//将底层object下标的0的元素返回
        System.out.println(obj);
        al.add("A");
        al.add("B");
        al.add("C");
        al.add("D");
        for (int i = 0; i <al.size() ; i++) {
            System.out.println(al.get(i));//get方法基于下标获取元素
        }
        System.out.println(al.toString());//[Hello, A, B, C, D]
        //al.clear();//清空
        System.out.println(al.isEmpty());//是否为空
//        al.remove("D");//移除某个对象
//        System.out.println(al.toString());//[Hello, A, B, C]
  boolean remove  =al.remove("D");
  Object removeoj =al.remove(1);
        System.out.println(removeoj);//A 移除后得到的数字下标的内容
    }
​
​
}
 
  • 数组结构实现:查询快,增删慢,必须开辟连续空间

  • jdk1.2版本,执行效率快,线程不安全

Vector类.

  • 数组结构实现:查询快,增删慢

  • jdk1.0版本,运行效率慢,线程安全

LinkedList类.

  • .链表结构:增删快,查询慢,无需开辟连续空间

package LIst;
​
import java.util.List;
​
public class LinkedList {
    public static void main(String[] args) {
       List linkedList =new java.util.LinkedList();
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        linkedList.add("d");
        for (int i = 0; i <linkedList.size() ; i++) {
            System.out.println(linkedList.get(i));
        }
        System.out.println(linkedList.toString());
        linkedList.remove(1);
        linkedList.size();
        linkedList.set(2,"F");//修改
        System.out.println(linkedList.toString());
    }
}

泛型集合[解决应用问题]

  • 概念:参数化类型,类型安全的集合,强制集合元素的类型必须

  • 特点:编译即可检查,而非运行时抛出异常

  • 访问时,不必类型转换

  • 要求前后类型一致

  • 不同泛型之间引用不能相互赋值,泛型不存在多态

泛型:高级类别的知识

概念:约束,规范类型

泛型的场景:

实例泛型:创建对象时,为类定义的泛型,进行参数化赋值

静态泛型:比较数据

三.Set子接口

三.1.Set集合

特点:无序,无下标,元素不能重复(当插入新元素,如果新元素与已有元素进行equals比较,结果true,则拒绝新元素的插入)

方法:全部继承Collection中的方法

HashSet

  • 底层是HashMap.即是所有需要存入HashSet的值,直接保存在HashMap中

  •  

package Set;
​
import java.time.Instant;
import java.util.HashSet;
import java.util.Set;
​
public class HashSet01 {
    public static void main(String[] args) {
        //Set实现类,所有元素不可重复
        Set<Integer> number = new HashSet<Integer>();
    number.add(22);
        number.add(23);
        number.add(24);
        number.add(25);
        number.add(26);
        number.add(6);
        number.add(26);//插入成功被覆盖?还是过滤掉//
        number.add(16);
        number.add(36);
​
        System.out.println(number.add(11));
        for (Integer num:number) {
            System.out.print(num+"\t");
        }
        System.out.println();//16   36  22  6   23  24  25  26  11  
    }
}
  • HashSet如何去重?去掉了重复equals-->Object提供的equlal方法,内部使用this==obj进行判断

  • HashSet:

  • 基于HashCode实现元素不重复,

  • 当存入元素的哈希吗相同时,会调用equals进行比较,如果为true,拒绝插入

  • 先判断哈希值是否一样,==比较地址,equals比较内容

package Set;
​
import java.util.HashSet;
import java.util.Set;
​
public class HashSetQuZhong {
    public static void main(String[] args) {
        Student student1 = new Student("ton", 19, "man", 99.0);//0*000011
        Student student2 = new Student("jon", 29, "man", 99.0);
        Student student3 = new Student("son", 39, "man", 99.0);
        Student student4 = new Student("lon", 49, "man", 99.0);
        Student student5 = new Student("lon", 49, "man", 99.0);//0*000022
        Set<Student> studentSet = new HashSet<Student>();//ctrl+shift+o导包
        studentSet.add(student1);//0*000011
        studentSet.add(student2);
        studentSet.add(student3);
        studentSet.add(student4);
        studentSet.add(student1);//0*000011,去掉重复,调用equals-->Object提供的equals方法,内部使用this==obj惊醒方法
       studentSet.add(student5);//地址不一样.内容重复
        for (Student stu : studentSet) {
            System.out.println(stu.toString());
        }
        //HashSet没有必要插入新数据没有必要与已有的数据进行一一比较
        //HashSet原有equals方法进行比较,是具有前提的(俩个对象的哈希值是相同的)
        System.out.println(student4.equals(student5));//true
        System.out.println(student4.hashCode());
        System.out.println(student5.hashCode());
    }
}
​
class Student {
    String name;
    Integer age;
    String sex;
    Double score;
​
    public Student() {
    }
​
    public Student(String name, Integer age, String sex, Double score) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.score = score;
    }
​
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", score=" + score +
                '}';
    }
    @Override
    public  boolean equals(Object object){
        if (this == object) {
            return  true;
        }
        if (object == null) {//对象为空
            return false;
        }
        if (this.getClass() != object.getClass()) {//类型不一样
            return false;
        }
        Student s =(Student)object;
       if(this.name.equals(s.name)&&this.age.equals(s.age)&&this.sex.equals(s.sex)&&this.score.equals(s.score)){
           return true;
       }
       return  false;
​
        }
        //hashCode才是调用equals的前提
    //只有哈希码相同,才能用equals
        public  int hashCode(){
        return  123;
        }
    }
/*
Student{name='ton', age=19, sex=man, score=99.0}
Student{name='jon', age=29, sex=man, score=99.0}
Student{name='son', age=39, sex=man, score=99.0}
Student{name='lon', age=49, sex=man, score=99.0}
true
123
123
*/

LinkedHashSet:

  • 链表实现的HashSet,按照链表进行存储,即可保留元素的插入顺序

  • 底层使用linkedHashMap存储,节点形式完成单独数据的保存,并可以指向下一个节点,通过顺序访问节点,可保留插入顺序

package Set;
​
import java.util.LinkedHashSet;
​
public class LinkedHashSetTest {
    public static void main(String[] args) {
        //LinkedHashSet底层使用linkedHashMap链表结构,节点形式完成单独数据的保存,并可以指向下一个节点,通过顺序访问节点,可以保留元素插入顺序
        LinkedHashSet<String> linkedHashSet =new LinkedHashSet<String>();
        linkedHashSet.add("A");
        linkedHashSet.add("a");
        linkedHashSet.add("B");
        linkedHashSet.add("b");
​
        for (String set: linkedHashSet) {
            System.out.print(set+"\t");
        }
        System.out.println();
        LinkedHashSet<Integer> linkedHashSet1 =new LinkedHashSet<Integer>();
        linkedHashSet1.add(28);
        linkedHashSet1.add(11);
        linkedHashSet1.add(44);
        linkedHashSet1.add(11);
​
        for (Integer set1: linkedHashSet1) {
            System.out.print(set1+"\t");
        }
        System.out.println();
    }
​
​
​
}
/*
A   a   B   b   
28  11  44  
*/

TreeSet:

  • 基于排列顺序实现元素不重复

package Set;
​
import com.sun.org.apache.xml.internal.serializer.TransformStateSetter;
​
import java.util.TreeSet;
​
public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet<Integer> treeSet =new TreeSet<>();//自动排序,调用一组对象的compareTo方法,返回值为0位重复元素
        treeSet.add(3);
        treeSet.add(2);
        treeSet.add(1);
        treeSet.add(10);
        System.out.println(treeSet.add(3));//false
        for (Integer tree: treeSet) {
            System.out.print(tree+"\t");
        }
        System.out.println();
    }
}
//false
1   2   3   10  
  • 实现SortedSet接口,对集合元素自动排序

  • 元素对象的类型必须实现Comparable接口,指定排序规则

  • 通过CompareTo确定是否为重复元素 返回值为0

package Set;
​
import java.util.TreeSet;
​
public class TreeCompareTest {
    public static void main(String[] args) {
        TreeSet<Stu>treeSet =new TreeSet<>();
        treeSet.add(new Stu("ton",22));
        treeSet.add(new Stu("son",32));
        treeSet.add( new Stu("lon",12));
        treeSet.add( new Stu("jon",2));
        treeSet.add( new Stu("jeon",22));
        System.out.println(treeSet.size());//1
        for (Stu s:
            treeSet ) {
            System.out.println(s.name);//ton
            System.out.print(s+"\t");//2  12  22 32
        }
    }
}
class Stu implements Comparable<Stu>{
    String name;
    Integer age;
​
    public Stu(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
​
    @Override
    public int compareTo(Stu o) {
        System.out.println("Compare被Tree回调");
        //升序
        if (this.age <o.age ) {//比this小,this就要靠前
            return  -1;
        }else if(this.age>o.age){//比this大,this就要靠后
            return  1;
        }
        return 0;//结果一样,代表去重
    }
//    @Override
//    public int compareTo(Stu o) {
//        System.out.println("Compare被Tree回调");
//        //降序
//        if (this.age <o.age ) {//比this小,this就要靠前
//            return  1;
//        }else if(this.age>o.age){//比this大,this就要靠后
//            return  -1;
//        }
//        return 0;//结果一样,代表去重
//    }
}

四.遍历

package CollectionBianLi;
//迭代器专注collection接口的集合
import java.util.*;
​
public class TestIterator {
    public static void main(String[] args) {
        //对Collection体系集合进行遍历
        List<String> list =new ArrayList<>();
    list.add("A");
    list.add("B");
        list.add("C");
        list.add("D");
        list.add("E");
​
    //1.获得一个迭代器
 //hasNext():是否有下一个元素遍历  有 true,没有:false
     //next(); 返回下一个元素
        Iterator<String> iterator =list.iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
        Set<String> set =new HashSet<>();
    set.add("e");
        set.add("f");
        set.add("r");
        set.add("w");
        set.add("a");
      Iterator<String> iterator1  =set.iterator();
    while (iterator1.hasNext()){
        System.out.println(iterator1.next());
    }
    }
}
/*
A
B
C
D
E
a
r
e
f
w

Map集合体系

一.Map接口

特点.

  • 用于存储任意键值对(Key-Value)

  • 键:无序,无下标,不予许重复(唯一)

  • 值:无序.无下标,允许重复

方法.

  • V put(K key,V value)//将对象存入到集合,关联键值,Key重复则覆盖原值

  • Object get(Object key)//根据键获取对应的值

  • Set<K> keySet()//返回所有Key

  • Collcetion<V> values()//返回包含所有值的Collcetion集合

  • Set<Map,Entry<K,V>>//键值匹配的Set集合

二.HashMap

算法:拿到任何一个对象,通过hash(key)做运算:key>>>16(除以16),其可能得到0-15之间一个的数字,作为插入数组的下标

  • jdk1.2版本,线程安全,运行效率快,允许用null作为Key或者value

    package Map;
    ​
    import java.util.HashMap;
    ​
    public class TestBasicHashMap {
        public static void main(String[] args) {
            HashMap<Integer,String> map = new HashMap();
            map.put(1,"中国");
            map.put(2,"美国");
            map.put(3,"英国");
            map.put(1,"中国666");
            String country=map.get(1);
            System.out.println(country);//重复的key进行覆盖
            //中国666
        }
    }

     

三.Hashtable

  • jdk1.0版本,线程安全,运行效率慢,不予许用null作为key或者value

    四.Properties

    • Hashtable的子类,要求key或者value都是String,通常用于配置文件的读取

    五.TreeMap.

    • 实现了SortedMap接口(是Map的子接口),可以对Key自动排序,是Tree的底层

六.遍历

package Map;
​
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
​
public class HashMapTest02 {
    public static void main(String[] args) {
        Map<Integer,String> map= new HashMap<Integer, String>();
        map.put(1,"China");
        map.put(2,"japan");
    map.put(3,"Asia");
    map.put(4,"Lisa");
    //遍历方法,keySet
        Set Keys =map.keySet();
        for (Object k:Keys) {
            System.out.println(k);//获得所有的键
            System.out.println(map.get(k));//获得所有的值
        }
        //遍历方式2  values(); 获得值
  Collection<String> cs = map.values();
        for (String value:cs){
            System.out.println(value);//获得所有的值
        }
        //entrySet();键值对
        //Set集合存储的都是node  getKey(), getValue
      Set<Map.Entry<Integer,String>> entry  =map.entrySet();
        for (Map.Entry<Integer,String> e:entry) {
            System.out.println(e.getKey()+":"+e.getValue());//拿到的是键值对的对象
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值