集合和String

文章详细介绍了Java中的集合接口和实现,如ArrayList和LinkedList的底层结构及扩容机制,强调了它们在增删查改操作中的性能差异。此外,还讨论了String对象的拼接、比较以及JDK1.7和1.8在字符串常量池处理上的区别,突出了效率和内存管理的重要性。
摘要由CSDN通过智能技术生成

1集合分类

interface Collection<E>,java中所有集合的底层接口,带有泛型E

interface List<E>有序,可重复

class ArrayList<E> 底层数据存储结构数组

class LinkedList<E> 底层数据存储结构为带有【链表头的双向链表】

class Vector<E> 底层数据存储结果数组,同时【线程安全,效率低】

interface Set<E> 无序,不可重复

class HashSet<E> 底层存储数据结构为哈希表结构

class TreeSet<E> 底层存储数据结构为平衡二叉树

2.ArrayList集合的底层数组扩容机制

  1. 私有化扩容方法,要求提供的参数是当前扩容所需的最小容量需求 minCapacity

  1. 获取原数组容量 oldCapacity

  1. 计算新数组容量,大约是原数组容量的1.5倍

  1. 判断新数组容量是否满足最小容量要求

  1. 判断新数组容量是否超出最大容量限制

  1. 创建新数组

  1. 从原数组中赋值数据到新数组中

  1. 保存新数组地址

3.ArrayList 和LinkedList的性能分析

ArrayList集合底层是数组结构

增删时:1 数组添加有可能导致数组扩容,扩容效率低

2. 在数组中添加或删除元素时会导致数据整体向后或向前移动,效率较低

3. 删除操作会导致有效元素个数和当前底层数组容量占比较低,浪费内存空间

改/查:

数组由于下标的存在可直接通过下标进行改查,效率极高

LinkedList集合底层是有链表头的双向链表结构

  1. 链表结构效率集中在链表头和链表尾,在两端进行操作时效率极高。(增删改查),但在链表中间的结点效率较低。

  1. 链表结构常用在一些队列中,例如线程池,数据库连接池,消息队列,任务队列。。。

4.String注意事项

4.1 String字符串的拼接

java中的字符串是一个常量,存储在内存的数据区(常量池)中,字符串+拼接时每一次都会生成一个新的字符串。

4.2 String字符串的比较

  1. == 判断,比较多是当前变量的数据存储情况,引用数据类型比较的是地址。

  1. 对于java而言""内包含的字符串内容只要是一样的,都是同一个字符串,为了节省空间。

  1. 任何时候,字符串判断是否一致,必须使用equals(Object)方法。equals方法是Object类方法,String进行重写后,比较的是字符串的数据内容。

4.3 JDK 1.7和JDK 1.8字符串常量池+处理的区别

  1. jdk1.7字符串拼接操作是在数据区/常量池进行的,操作过程效率较低。

  1. jdk1.8是根据第一个字符串,在内存堆区创建StringBuilder可变长字符串对象利用append进行拼接其他字符串,效率高,不占用数据区/常量池空间,最后通过toString方法转换为String字符串返回。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中分头背带裤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值