ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

集合

2021-12-16 09:32:45  阅读:162  来源: 互联网

标签:Student 对象 元素 哈希 集合 TreeSet


1.数据结构

1.1 数据结构之栈先进后出

       进栈:数据进入栈模型的过程

           出栈:数据离开栈模型的过程

1.2 数据结构之队列先进先出

入队列:数据从后端进入队列模型的过程

出队列:数据从前端离开队列模型的过程

1.3 数据结构之数组查询快,增删慢

查询时,通过索引定位,查询效率高

删除数据时,要将原始数据删除,同时将后面的数据前移,效率低

增加数据时,要将添加位置后的每个数据后移再添加,效率低

1.4数据结构之链表-增删快、查询慢

1.5数据结构之哈希表

底层采用数组+数组实现,可以说是一个元素为链表的数组。

JDk8以后,底层采用数组+数组+红黑树实现

 

2.集合

集合的体系结构

集合

单列

Collection

List可重复有序

Set不可重复无序

双列Map

HashMap

 

2.1 List集合

2.1.1特点:

有序,存储和取出的元素顺序一致

可重复

2.1.2 List的实现类

ArrayList集合底层是数组结构实现,查询快、增删慢LinkedList集合底层是链表结构实现,查询慢、增删快

2.1.3 List集合的遍历

方法一:Iterator

 Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到      

 Iterator<String> it = list.iterator();         

//用while循环改进元素的判断和获取    

   while (it.hasNext()) {          

 String s = it.next();          

 System.out.println(s);      

 }

 

方法二:for循环

for(int i=0;i<list.size();i++){

    String s=list.get(i);

}

方法三:增强for

格式:for(元素类型 变量名:需要遍历的集合){}

例:for(int i:list){}

2.2 set集合

2.2.1 set集合的特点

元素存取无序;

没有索引、只能通过迭代器或增强for循环遍历,不能用for循环遍历;

不能存储重复元素

2.2.2 哈希值

哈希值是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。

Object类有一个方法可以获取对象的哈希值:hashcode();

Student s=new Student();s.hashcode();

同一个对象多次调用hashcode获取的哈希值相同;

默认情况下,不同对象的哈希值不相同;

 

2.2.3 HashSet

2.2.3.1 HashSet特点

底层数据结构是哈希表

对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致,没有带索引的方法,所以不能使用普通for循环遍历

由于是Set集合,所以是不包含重复元素的集合

2.2.3.2 HashSet如何保证元素唯一

  添加一个元素的过程:

1)调用对象的hashcode方法获取到对象的哈希值。利用对象的哈希值计算对象的存储位置

2)该位置是否有元素,没有,直接存储

3)有,遍历该位置的所有元素,和新存的元素比较哈希值,都不相同,存储

4)有相同的,调用对象的equals方法,比较对象内容

,不同,存储。相同,不存。

重点注意:

对于我们来讲保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须重写hashCode和equals方法建立属于当前对象的比较方式。

2.2.4 LinkedHashSet

集合特点

1)由哈希表和链表实现的Set接口,具有可预测的迭代次序

2)由链表保证元素有序,也就是说元素的存储和取出顺序是一致的

3)由哈希表保证元素唯一,也就是说没有重复的元素

2.2.5 TreeSet

2.2.5.1集合特点

(1)元素唯一

(2)没有索引,不能使用普通for循环遍历

(3)元素有序,不是存储的先后顺序,而是按照一定的规则进行排序。其排序方式取决于构造方法。

TreeSet():根据其元素的自然排序进行排序TreeSet(Comparator comparator) :根据指定的比较器进行排序

重点:

TreeSet如何保证元素唯一:

TreeSet是通过在自定义的类中实现Comparable接口,重写compareTo()方法,实现元素唯一。

而非equals()和hashcode()。Student类中不重写equals和hashCode方法,对于添加的元素是否有重复的最终结果并没有影响!因此TreeSet在比较的时候,根本没有调用equals方法!

2.2.5.2 TreeSet类放入的自定义类

对于TreeSet,假如添加对象的类中不实现Comparable接口重写compareTo方法或者TreesSet创建对象未传入自定义的比较类的话,那么运行时将会报错!

Exception in thread "main" java.lang.ClassCastException: cn.com.clearlight.setframe.set.bean.Student cannot be cast to java.lang.Comparable

————————————————

(方案一)实现Comparable接口,重写compareTo方法

 

public class Student implements Comparable<Student> {

    @Override

    public int compareTo(Student o) {

        // 先根据年龄来排序,若年龄相同,则根据String类型中实现的compareTo方法进行排序

        int temp = this.age - o.age;

        return temp == 0 ? this.name.compareTo(o.name) : temp;

    }

}

(方案二)再写一个学生比较类实现Comparator方法

第一步:新建一个学生比较类,实现Comparator类,并重写compare(T o1, T o2)

第二步:在创建TreeSet对象时,传入(学生比较类)作为参数

新建的ComparatorStudent学生比较类

public class ComparatorStudent implements Comparator<Student> {

 

 

    @Override

    public int compare(Student o1, Student o2) {

          // 先根据名字来排序,若名字相同,则根据年龄的大小来排序

        int temp = o1.getName().compareTo(o2.getName());

        return temp==0 ? o1.getAge()-o2.getAge() : temp;

    }

}

将ComparatorStudent作为Treeset的参数:

TreeSet<Student> ts = new TreeSet<>(new ComparatorStudent ());

 

(方案二也可这样写)

 

 public static void main(String[] args) {      

 //创建集合对象        

TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {          

 @Override            

public int compare(Student s1, Student s2) {          

      int temp = o1.getName().compareTo(o2.getName());

        return temp==0 ? o1.getAge()-o2.getAge() : temp;

});       

  //创建学生对象        

Student s1 = new Student("xishi", 29);      

  Student s2 = new Student("wangzhaojun", 28);    

    //把学生添加到集合        ts.add(s1);        ts.add(s2);      

}

}

 

3 Map集合

3.1 Map集合概述和特点

格式:

interface Map<K,V>

特点:

键值对映射关系

一个键对应一个值

键不能重复,值可以重复

元素存取无序。

注意:key同样put多次,用最后一次的键值

3.2 Map集合的遍历

     方法一:

 //获取所有键的集合

  Set<String> keySet = map.keySet();        

//遍历键的集合,获取到每一个键。用增强for实现      

 for (String key : keySet) {          

 //根据键去找值

 String value = map.get(key);        

   }

方法二:

//获取所有键值对对象的集合      

 Set<Map.Entry<String, String>> entrySet = map.entrySet();      

  //遍历键值对对象的集合,得到每一个键值对对象      

 for (Map.Entry<String, String> me : entrySet) {            

//根据键值对对象获取键和值            

String key = me.getKey();          

      String value = me.getValue();      

}

 

3 Collections

 

Collections类的作用是针对集合操作的工具类

方法说明:

public static void sort(List list)将指定的列表按升序排序public static void reverse(List<?> list)反转指定列表中元素的顺序

public static void shuffle(List<?> list)使用默认的随机源随机排列指定的列表

 

 

标签:Student,对象,元素,哈希,集合,TreeSet
来源: https://www.cnblogs.com/lyqjava/p/15696395.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有