java语言中常用到的集合,根据自己所学以及查询的资料进行的汇总

一、集合的定义

集合:是在计算机中用于存储一种或多种引用类型数据,并且长度可变的容器。

外延:List集合、Queue集合、Set集合

二、各类集合的特点

  List集合(继承Collection接口):有序存储可重复元素

外延:ArrayList集合、Vector集合、LinkedList集合

ArrayList集合:基于数组实现、长度可变的、分配连续内存空间的List集合。特点:线程异步、线程不安全、效率高    遍历以及随机访问元素的效率高

Vector集合:基于数组实现的,线程同步的遗留集合类。特点:线程同步的、多线程安全的、效率低

LinkedList集合:采用链表存储方式,实现了List接口和Queue接口的集合。  插入,删除元素效率比较高

LinkedList实现了 List、Deque、Queue 接口

      List集合实现类的使用场合:

要求快速访问元素,则使用ArrayList 集合。

要求快速插入和删除元素,则使用LinkedList集合。

当对多线程元素操作时,则使用Vector集合。

要求数据先进后出时,则使用Stack集合类。

 Queue集合(继承Collection接口)(队列 先进先出):用于存储 可重复元素的、先进先出的集合。(只允许在表的前端进行删除操作,而在表的后端进行插入操作的线性表 )

Queue接口实现类:LinkedList、PriorityQueue

  常用数据结构:

Set集合(继承Collection接口):用于无序存储不可重复元素的集合(不可通过索引访问元素)

实现类:HashSet集合、LinkedHashSet集合、TreeSet集合

HashSet集合:基于哈希表(jdk1.8版本之前:哈希表=数组+链表

jdk1.8版本之后: 哈希表 = 数组 + 链表  或 哈希表 = 数组 + 红黑树(提高查找速度)

)的Set集合。

链表长度达到8个,数组的长度达到64个,则链表将转换为红黑树。

红黑树转链表位桶节点数量最小值 6。

HashSet集合存储步骤:

1.使用哈希算法计算元素对应的哈希值,使用此哈希值作为地址存储(hashCode()方法)

2.判断此哈希值对应的位置上是否已经存有元素

3.若没有就将此元素存储到该位置上

4.若有则使用equals方法判断两个对象是否相等,相等就不存储,不相等则与上个元素存在一起

重写hashCode() 用于获得元素的存储位置

重写equals() 用于在两个元素位置相同的时候比较两个元素是否相等

实体类重写以上两个方法可以避免添加重复对象

         LinkedHashSet集合:基于双向链表和哈希表、继承自HashSet的Set集合。

使用链表维护输入顺序

          TreeSet集合:基于红黑树、实现了Set接口,具有排序功能的Set集合。

实体类进行treeset排序时需要实现Comparable接口

Comparable接口:使实现类自身具备某种比较规则以便对其对象进行 自然排序的接口。

自然排序:是要求自定义类实现Comparable接口并实现其compareTo(Object   obj)方法,在此方法中指定排序规则的算法。

public class Student implements Comparable {

    public int compareTo(Student o) {//重写比较方法,返回值为整数
        return this.age - o.age;//结果为负数,排在o对象之前                                   // 结果为正数,排在o对象之后                                // 结果为0,说明两个对象相等                                //返回年龄的差,说明年龄小的排在前

    }
}
//如果插入年龄相同的两个对象,则按照姓名排序public class Student implements Comparable {

    public int compareTo(Student o) {
        if(this.age == o.age)
            return this.name.compareTo(o.name);
        return this.age - o.age;
    }
}

 Comparator比较器:  在外部自定义比较规则以便容器对其存储数据进行 定制排序的对象。

定制排序:是要求自定义类实现Compartor接口并重写其compare(Object arg0, Object arg1)方法,在此方法中依据          XX 属性进行排序的算法。也称比较器排序。

使用自定义比较器时注意:将比较器作为参数传入TreeSet构造器中

//创建比较器类 MyComparatorpublic class MyComparator implements Comparator{
        public int compare(Object arg0, Object arg1) {
            Student o1=(Student)arg0;
            Student o2=(Student)arg1;
            if(o1.getAge() == o2.getAge())
                return o1.getName().compareTo(o2.getName());                           return o1.getAge() - o2.getAge();
        }
}
TreeSet<Student> set = new TreeSet<Student>(new MyComparator());//将比较器作为参数传入TreeSet构造器中
set.add(new Student(“Joker", 18));
set.add(new Student(“Faker", 16));
set.add(new Student(“Sky", 23));
set.add(new Student(“Petter", 23));

for (Student s : set) {
    System.out.println(s);
}

Set集合的使用场景:

当要求数据是不重复,且无序的可用HashSet集合。

当要求数据不能重复,且要排序并不能为空选择TreeSet集合

Map集合:容器框架中以键值对形式存储元素的容器。

实现类:HashMap 、TreeMap、Hashtable

HashMap集合:基于哈希表实现、线程不安全的Map容器

实现类:LinkedHashMap

HashSet底层是HashMap实现的。

HashMap遍历输出的方法:

keySet()   获取所有键的集合

values()   获取所有值得集合

entry()      遍历输出键值对

注意:hashMap集合添加key=自定义对象元素时,该对象需重写hashCode()和equals()方法

hashMap:key可以为null,且key唯一、value可以为null,且多个value可以重复、线程不安全

LinkedHashMap集合:是继承自HashMap,基于双向链表存取有序 的Map容器。(哈希表+双向链表)

特点:LinkedkedHashSet底层就是LinkedHashMap实现的

LinkedHashMap是HashMap的子类; 只是比HashMap多了一条链,用于保存添加元素的顺序。

key唯一,value不唯一   、key value 都可为空  线程不安全、输出顺序与添加顺序一致。

Hashtable集合:是基于基于哈希表实现的、线程安全的Map容器。

特点:key唯一,value不唯一        key value 都不可为空        线程安全

 TreeMap集合:是基于红黑树实现的、具有排序功能的Map容器。(根据其键进行自然排序的功能、根据创建对象时提供的 Comparator 进行排序)

特点 :TreeSet底层就是TreeMap实现的

key唯一,value不唯一           针对键排序            线程非安全         key不可以为null

注意:遍历时需定制比较规则 (1.创建比较器类实现Comparator   2.TreeMap<Person,String> t = new  TreeMap<Person,String>(new MyComparator()) ;)

Map集合的使用场合:

当需要存储键值对,都是无序的首选HashMap 。

当需要存储键值对并按 key 排序可以选择TreeMap。

当需要存储键值对并保持插入顺序选择LinkedHashMap 。

需要线程同步,首选Hashtable。

三、迭代器(Iterator)

常用方法:

使用演示:

调用Iterator()得到一个指向集合序列第一个元素的迭代器;

用循环调用hasNext()方法,如果有元素,返回true;

在循环中,使用next()方法获得集合的下一个元素;

ArrayList dogs = new ArrayList<Dog>();
Iterator<Dog> it=dogs.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}

ListIterator迭代器(列表迭代器):

在iterator的基础上新增的一种迭代器,它新增了hasprevious()和previous()方法,可以进行向前遍历。具有双向遍历列表的功能。

ArrayList dogs = new ArrayList<Dog>();
.....
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(feifeiDog);
ListIterator<Dog> iter = dogs.listIterator() ;
System.out.println("由前向后输出:") ;
while(iter.hasNext()){  判断是否有下一个元素
Dog dog = iter.next() ;  遍历下一个元素
             System.out.print("\t"+dog + "\n") ;
}
System.out.println("\n由后向前输出:") ;
while(iter.hasPrevious()){  判断是否有前一个元素
            Dog dog = iter.previous() ;  遍历前一个元素
            System.out.print("\t"+dog + "\n") ;
} 

 foreach的使用

for(元素类型t 元素变量x : 遍历对象obj){      引用了x的java语句; }

for(Dog dog:dogs){
        System.out.print("\t"+dog + "\n") ;

//foreach一般只用于遍历集合!

}

  

         foreach的特点

java5的新特征 、for语句的特殊简化版本 遍历数组、集合方便

 三种集合遍历方式:

//for循环
for (int i = 0; i < 1000000; i++) {
            temp = list.get(i);
		   syso(temp);
        }
//迭代器
 while(it.hasNext()){
            temp = it.next();
		   syso(temp);
        }
//foreach
 for(Object t : list)
            temp = t;
            syso(temp);
    }

  

         效率:for循环>iterator迭代器>foreach

原文地址:https://www.cnblogs.com/haogege1204/p/12240235.html

时间: 2024-10-05 23:25:39

java语言中常用到的集合,根据自己所学以及查询的资料进行的汇总的相关文章

Java EE中常用的四个框架

Java EE中常用的四个框架     Struts     Struts是一个基于Sun Java EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.     Struts框架可分为以下四个主要部分,其中三个就和MVC模式紧密相关:     1.模型 (Model),本质上来说在Struts中Model是一个Action类(这个会在后面详细讨论),开发者通过其实现商业逻辑,同时用户请求通过控制器(Controller)向Action的转发过程是基于由struts-config

Java语言中学习数组、运算符、流程控制的一些理解

一.数组 1.数组的概念及作用 数组是相同数据类型的元素的集合:   数组本身是引用数据类型,即对象.但是数组可以存储基本数据类型,也可以存储引用数据类型. 例如: int [] a = new int [] {1,2,3,4,5,6,}; String [] s = new String [] {"小兔","小小兔","小小小兔",} : Employee [] e = Employee [10];(Employee是自定义类). 2.数组的声

Java语言中的---字符串

day09 Java语言中的---字符串 一.字符串概述: 字符串在程序中是一个非常重要的知识点,在处理一系列程序的时候都会定义一些字符串来使用.下面我们就来看看如何定义和使用一个字符串. 二.字符串(String): 1.字符串的分类:字符串根据能否可以改变被分为常用的三种, (1)"String"类:这个类是Java本身自带的一个类,无需定义.可以直接使用,但是当你在操作这个类的时候你就可以直接创建实例.同时这也是一个不可变的类,也就是说你对某个字符串新增或者删除时,原来的这个字符

Java语言中的----数组

day07  Java语言中的--数组 一.数组的概述: 什么是数组?数组是干什么用的?为啥要学数组?这些都是疑问.再你学完数组以后就知道了,数组是存储在相邻内存位置的单一数据类型的元素集合.什么是单一数据类型?就是在你定义数组的时候的数据类型,就只能存储这一个类型的数组.那么我们访问他的时候就直接通过指定数组的名字和下标就可以直接访问数组元素了. 二.数组: 1.定义数组         数据类型 数组名[] = new  数据类型[内存数据大小]         int a[] = new 

Java语言中的正则表达式

正则表达式是什么? 正则表达式是一种强大而灵活的文本处理工具.初学正则表达式时,其语法是一个难点,但它确实是一种简洁.动态的语言.正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题:匹配.选择.编辑以及验证.一般来说,正则表达式就是以某种方式来描述字符串. 日常例子 在文本中查找“halu126”,我们通常会在查找框中输入“halu126”,这就是一个最简单的正则表达式的例子,使用精确的匹配这样的字符串,如果我 们即想在文本中找到“halu126”,又想找到“Halu126”,

day20 java 语言中的读取写入数据(一)

day20  java 语言中的读取写入数据(一) 一.io概述 io数据流的读写功能,在实际的生活中也很常见,比如文件的上传.下载,日志的自动更新等都与io读写密切相关.io又被分为了读取数据和写入数据两个大的功能.下面就来看看读取数据的几种类. 二.读取数据的几种方式 读取数据被分为了字节流读取数据,和字符流读取数据两种. (一):字符输入流: 1.fileReader类.是字符流读取数据 2.BufferedReader类.带有缓冲流读取数据 (二):字节输入流: 1.FileInputS

day21 java 语言中的读取写入数据(二)

day21  java 语言中的读取写入数据(二) 一.概述: 使用IO流写文件,就体现的是下载的功能.所以说很有必要单独说一下. 二.写入功能:(下载) 写入功能同样也是被分隔为了字符流写入和字节流写入两个方式. (一):字符流写入数据 1.FileWriter类. 2.bufferedwriter类.带缓冲流 (二):字节流写入数据 1.FileOutputStream类. 2.bufferoutputstream类.带有缓冲流 三.具体实例     (一):字符流写入数据 //io数据流输

day22 Java语言中的------JDBC连接

day22 Java语言中的------JDBC连接 一.JDBC概述: "JDBC"就是Java连接数据库,根据数据库的不同建立的连接也有一定的区别.我们主要还是对MySQL数据库进行数据的操作.JDBC架构中主要包含两种:一种是JDBC应用程序层,一种是JDBC驱动程序层.下表是JDBC与各种数据库连接的图示.下面就具体的来了解一下Java与数据库之间的一个关系. 二.JDBC: 在具体开始学习JDBC之前,做好相应的准备工作.在MySQL数据库官网下载好相应的jar包(mysql

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan