Java基础进阶_5

Collection集合的体系:
          Collection<E>(接口)
            /         \
        Set<E>(接口)         List<E>(接口)
        /     \         /                  \           \
HashSet<E>(实现类)  TreeSet<E>(实现类)   LinkedList<E>(实现类) Vector(线程安全) ArrayList<E>(实现类)
    /
LinkedHashSet<E>(实现类)

Collection集合体系的特点:       Set系列集合: 添加的元素,是无序,不重复,无索引的。           -- HashSet:添加的元素,是无序,不重复,无索引的。           -- LinkedHashSet:添加的元素,是有序,不重复,无索引的。           -- TreeSet: 不重复,无索引,按照大小默认升序排序!! ( 可排序集合 )       List系列集合:添加的元素,是有序,可重复,有索引的。           -- LinkedList: 添加的元素,是有序,可重复,有索引的。底层是基于链表存储数据的,查询慢,增删快           -- ArrayList: 添加的元素,是有序,可重复,有索引的。底层基于数组存储数据的,查询快,增删慢

目标:Set系列集合元素去重复的流程。集合和泛型都只能支持引用数据类型。1.对于有值特性的,Set集合可以直接判断进行去重复。2.对于引用数据类型的类对象,Set集合是按照如下流程进行是否重复的判断。    Set集合会让两两对象,先调用自己的hashCode()方法得到彼此的哈希值(所谓的内存地址)    然后比较两个对象的哈希值是否相同,如果不相同则直接认为两个对象不重复。    如果哈希值相同,会继续让两个对象进行equals比较内容是否相同,如果相同认为真的重复了    如果不相同认为不重复。
如果希望Set集合认为两个对象只要内容一样就重复了,必须重写对象的hashCode和equals方法。
目标:Set系列集合元素无序的根本原因。Set系列集合添加元素无序的根本原因是因为底层采用了哈希表存储元素。JDK 1.8之前:哈希表 = 数组 + 链表  + (哈希算法)JDK 1.8之后:哈希表 = 数组 + 链表 + 红黑树  + (哈希算法)    当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
目标:LinkedHashSet是HashSet的子类,元素是“有序” 不重复,无索引。LinkedHashSet底层依然是使用哈希表存储元素的,但是每个元素都额外带一个链来维护添加顺序!!不光增删查快,还有序。缺点是多了一个存储顺序的链会占内存空间!!而且不允许重复,无索引。

总结:     如果希望元素可以重复,又有索引,查询要快用ArrayList集合。(用的最多)     如果希望元素可以重复,又有索引,增删要快要用LinkedList集合。(适合查询元素比较少的情况,经常要首尾操作元素的情况)     如果希望增删改查都很快,但是元素不重复以及无序无索引,那么用HashSet集合。     如果希望增删改查都很快且有序,但是元素不重复以及无索引,那么用LinkedHashSet集合。
 
目标:TreeSet集合。TreeSet: 不重复,无索引,按照大小默认升序排序!!TreeSet集合称为排序不重复集合,可以对元素进行默认的升序排序。TreeSet集合自自排序的方式:    1.有值特性的元素直接可以升序排序。(浮点型,整型)    2.字符串类型的元素会按照首字符的编号排序。    3.对于自定义的引用数据类型,TreeSet默认无法排序,执行的时候直接报错,因为人家不知道排序规则。
TreeSet集合对自定义引用数据类型排序,默认无法进行。但是有两种方式可以让程序员定义大小规则:     a.直接为对象的类实现比较器规则接口Comparable,重写比较方法(拓展方式)     b.直接为集合设置比较器Comparator对象,重写比较方法注意:如果类和集合都带有比较规则,优先使用集合自带的比较规则。
 
目标:Collections工具类的使用。java.utils.Collections:是集合工具类Collections并不属于集合,是用来操作集合的工具类。Collections有几个常用的API:     - public static <T> boolean addAll(Collection<? super T> c, T... elements)         给集合对象批量添加元素!     - public static void shuffle(List<?> list) :打乱集合顺序。     - public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。     - public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
 
 
 

原文地址:https://www.cnblogs.com/superyucong/p/12686434.html

时间: 2024-08-04 04:24:08

Java基础进阶_5的相关文章

java基础进阶篇(六)_HashTable------【java源码栈】

一.概述 ??前面介绍了HashMap的结构和原理,这里介绍个类似HashMap的结构Hashtable. ??HashTable 官方解释是HashMap的轻量级实现, 和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射. ??所以我们结合HashMap来介绍HashTable, 比较下两者的区别. ??HashTable 使用的很少, 它支持线程安全, 通过内部方法加上 synchronized 实现, 因此同步锁的密度太大了, 在实际情

java基础进阶篇(七)_LinkedHashMap------【java源码栈】

目录 一.概述 二.特点 三.应用场合 四.构造方法 1.参数为空 2.accessOrder 五.源码结构分析 六.常见问题 1.如何实现的元素有序? 2.如何保证顺序的正确以及同步 3.如何实现两种顺序(插入顺序或者访问顺序)? 4.为什么重写containsValue()而不重写containsKey()? 七.常用方法 一.概述 ??LinkedHashMap是HashMap的子类,关于HashMap可以看下前面的章节:java基础进阶篇 HashMap public class Lin

Java基础进阶整理

Java学习笔记整理 本文档是我个人整理的,首先是想通过完成本文档更加扎实自己的基础加强对java语言的理解,然后就是想给入了门的同志们做下贡献. 当然,本文档主要是对java语言基础(当然还有很多基础没有涉及到)的进行较全面的理解已经整理,只要充分掌握了基础知识,学习高级部分的知识才会事半功倍犹如轻车熟路一般容易上手. 正文: CLASSPATH的设置:我们知道运行java必须要设置CLASSPATH环境变量,但是sun  java 1.4之后改进了设计,JRE会自动搜索当前路径下的类文件,而

java基础进阶:SQL的运用

SQL的基础的运用 /* --1.学生表 Student(S,Sname,Sage,Ssex) --S 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(C,Cname,T) --C --课程编号,Cname 课程名称,T 教师编号 --3.教师表 Teacher(T,Tname) --T 教师编号,Tname 教师姓名 --4.成绩表 SC(S,C,score) --S 学生编号,C 课程编号,score 分数 */ --创建测试数据 --1

Java基础---进阶练习(二十八)

程序代码: package fangwei;import java.util.Scanner;//通过scanner工具来获取用户的输入成绩 //scanner类位于Java.util包中,要导入此包public class First { public static void main(String[]args){  Scanner input=new Scanner(System.in);//创建scanner对象  System.out.println("请输入考试成绩"); 

java基础进阶篇(五)_HashSet------【java源码栈】

目录 一.概述 二.源码分析 1.HashSet 源码 2.两个重要成员变量 三.构造方法 1.public HashSet(); 2.public HashSet(Collection<? extends E> c); 3.public HashSet(int initialCapacity, float loadFactor); 4.public HashSet(int initialCapacity); 5.特殊的构造方法 四.常用方法 1.int size() 2.boolean is

Java基础进阶_2

抽象类: 使用abstract关键字修饰的类为抽象类,其内部可以有类的一切成员,还可以有abstract修饰的抽象方法(不一定有),抽象方法只有方法的声明,没有方法体,有抽象方法的类必须声明为抽象类. 抽象类不能够创建对象(为什么?反证法:假设创建了抽象类的对象,使用其对象调用抽象方法,而方法没有方法体,没有意义),但其必须是有构造器的,是提供给其子类创建对象时,初始化父类成员使用的. 抽象类的子类必须实现父类的抽象方法,如果不实现,也必须将子类定义为抽象方法. 抽象类存在的意义:为了被子类继承

Java基础进阶_6

案例:输入一个字符串,统计每个字符出现的次数. public class CountDemo { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.print("请输入字符串:"); String str = s.nextLine(); Map<Character,Integer> res = new HashMap<>(); for (

程序设计C语言二级考试教程 Java基础视频教程 安卓软件开发教程 Unity3D游戏制作入门教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut