首页 > 编程语言 >Java之集合

Java之集合

时间:2024-03-22 18:04:43浏览次数:27  
标签:Java HashSet ArrayList 链表 增删 线程 数组 集合

一. List

        存取有序,可以存储重复的元素,可以用下标进行元素的操作

1.ArrayList

        在Java数组中,长度是固定的,因此在数组被创建后,不能修改长度,这意味着开发者需要实现知道数组的长度。但在一般情况下,只有在运行时才知道数组长度。为了解决这个问题,ArrayList因此而生.底层是使用数组实现,所以查询速度快,增删速度慢。线程不安全。相当于动态数组,在多线程中不建议使用

1.1)ArrayList的扩容机制

        如果当前数组为空,则先设置容量为默认值10,此时还未初始化数组

        确认实际的容量,如果不够就扩容,扩容函数grow。

        首先将容量扩大为原来的1.5倍,如果数组是空数组,则将数组初始化,默认容量为10,如果不是,在判断是够超出最大容量,超过则直接复制最大值,否则赋予心智,复制原来数组到新数组。

2.LinkedList

        基于双向链表结构实现的,因为地址不是连续的,都是一个节点和一个节点相连,没差查询都是重头查询,所以查询速度慢,但是增删只是断裂某个节点对整体影响不大,所以增删速度快,提供了特殊的方法,对头尾的元素操作(进行增删查),线程不安全。也可当作堆栈、队列、双端队列,在多线程中不建议使用

3.vector

        底层是数组,方法加了synchronized来保证线程安全,所以效率较慢,使用ArrayList替代

总结

        对于随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

        对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据(可以在上述ArrayList代码中体现)

二. Set

        无序、不可重复的单例集合

1. HashSet

        底层是哈希表(数组+链表、数组+红黑树),当链表大于8时就会转换成红黑树,当红黑树小于6时就会转换成链表,其实就是HashMap的实现,键存储的是key。值存放的是一个final修饰对象,内部采用了HashMap作为数据存储,HashSet其实就是在操作HashMap的key,HashSet中没有对应同步的操作,因此是线程不安全的。支持null元素(因为hashMap也支持null键和null值)。

2.TreeSet

        底层是红黑树,就是TreeMap 的实现,可以实现有序集合,String和Integer可以根据值进行排序,如果是对象需要实现Compartor接口,重写compareTo()方法执行比较规则。

3. LinkedHashSet:实现了HashSet,多一条链表来记录位置,所以是有序的。

        

标签:Java,HashSet,ArrayList,链表,增删,线程,数组,集合
From: https://blog.csdn.net/DFSYyyds/article/details/136941458

相关文章

  • 关于javaScript的计算精度的解决办法
    项目中我们常常需要做一些计算,由于浮点数的二进制表示可能不精确,经常会遇到计算精度问题,例letresultNum=0.1+0.2;console.log(resultNum);//0.30000000000000004这个时候,如果我们不单独处理,那么页面上展示的时候就出现布局错乱等问题,比如我们可以保留两位小数采用Number(r......
  • Java版本spring cloud + spring boot企业电子招投标系统源代码
    招投标管理系统是一个集门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理于一体的综合性应用平台。它适用于招标代理、政府采购、企业采购和工程交易等业务的企业,旨在提高项目管理的效率和质量。该系统以项目为主......
  • Java 04 杂
    1.Scannerjava.io包的PrintWriter类可用于以通常可读的形式(文本)写入输出数据。java.util包的Scanner类用于从不同的源(例如输入流,用户,文件等)读取输入数据Scannerinput=newScanner(System.in);System.out.print("输入姓名:");//从键盘接收输入......
  • Java 基础IO 输入输出流3
    1.了解IO一个输入流用于从源读取数据。并且,输出流用于将数据写入目标。System.out是一种输出流。--向显示器控制台输出-字节流JavaInputStream类JavaOutputStream类字符流JavaReader类JavaWriter类2.InputStream输入文件读取-字节读取-序列化读取3.OutputStr......
  • 2020-8-9-JAVA机考题
    二叉排序数及中序遍历实现,socket应用,日志模拟的实现试题一/***实现要求:*1、根据已有的代码片段,实现一个二叉排序树;*2、用中序遍历输出排序结果,结果形如:0,1,2,3,4,5,6,7,8,9,*3、注意编写代码注释*/publicclassBinaryTree{ publicstaticvoidmain(String[]a......
  • 2020-5-5-JAVAWEB
    测试、反射、注解、Mysql、JDBC、Tomcat、servlet、HTTP、EL表达式、JSTL、Filter过滤器、代理模式、监听器、Redis、Maven测试1黑白盒测试黑盒测试:不需要写代码,给输入值,看程序能否给出期望的输出值白盒测试:需要写代码,关注程序具体执行流程2测试步骤1)定义测试类包名:cn.itca......
  • java:欧拉公式e^ix==cosx+i*sinx 用Math类中的方法输出90°以内的欧拉函数数值,保留四位
    publicclassMain{//本题的要求:e^ix==cosx+i*sinxdoubleb,c;chari;publicstaticvoidmain(String[]args){for(doublej=0;j<90;j++){//用循环依次整出0-90度doublesum=0;//temp是e^ix;doublea=j;a=Math.toRadi......
  • Java房屋出租项目实现
    项目概述这个房屋出租管理系统主要包含三个类:House类、HouseService类和HouseView类和Utility类。该项目采用了面向对象的设计思想,将房屋信息的表示、业务逻辑和用户界面分别封装在不同的类中,提高了代码的可维护性和扩展性。House类House类用于表示房屋信息,包含了房屋的编号......
  • Java - 冒泡排序
      //冒泡排序publicclassBubbleSort{ publicstaticvoidmain(String[]args){ //定义一个整型的数组 int[]array={64,34,25,12,22,11,90} bubbleSort(array); for(inti:array){ System.out.println(i+""); } } publicstaticvoidbubbl......
  • Java并发之CAS (Compare and Swap)(转载)
    CAS(CompareandSwap)比较并替换,CAS是实现乐观锁的一个重要操作。CAS是一个硬件指令,保证是原子操作。Java中通过UnSafe来实现。原子类:AtomicBoolean,AtomicInteger,AtomicLong等使用CAS实现。1.概述CAS的基本步骤:执行函数CAS(V,E,N),如果V值等于E值,则将V的值设为N。若......