【Java基础】学习笔记5 - 包装类与集合介绍

目录

    • 第四阶段
      • 包装类
      • String
      • StringBuffer
      • Arrays
      • System
      • Collection
      • ArrayList
      • Vector

第四阶段

包装类

装箱拆箱以及手动自动

package chapter4;public class Pack {public static void main(String[] args) {// 自动装箱int a = 100;Integer aa = a;// 自动拆箱int b = aa;// 手动装箱Integer a2 = Integer.valueOf(a);// 手动拆箱int b2 = a2.intValue();}
}

String

string 类的几个特性

  1. 实现了接口 Serializable(支持串行化),和 Comparable(表示可以被比较)
  2. 它是 final 类,不可被继承
  3. 他有一个属性 value,用于存放字符串内容
  4. value 被 final 修饰,不可以直接修改

直接赋值String s1 = "asd":从常量池查看是否有 asd 的空间,如果有就直接指向它;如果没有就重新常见并指向它;
s1 最终指向常量池的地址

构造器赋值String s2 = new String("asd"):堆中先创建空间,维护 value 属性,指向 asd 空间;如果常量池没有 asd 那就重新创建并通过 value 指向;
s2 最终指向堆中地址


str = s1 + s2 变量相加,操作在常量池中;

str = "asd" + "asd" 常量相加,操作在堆中;


StringBuffer

StringBuffer 和 StringBuilder 均为可变字符序列,不像 String 一样直接就 final 终结掉了

StringBuffer 是线程安全的,但是 StringBuilder 不是

当字符串缓冲区被单个线程使用是,推荐直接上 StringBuilder,因为其优化较好,速度快


由于 String 的 value 属性被 final,故我们每次对 string 类型变量进行相加操作时,实际上是先把旧的副本丢掉,并生成新的结果重新赋予变量;这样会导致大量副本留在内存形成碎片,影响性能


Arrays

使用 Arrays 可以对数组进行基本的操作

package chapter4;import java.util.Arrays;public class ArraysDemo {public static void main(String[] args) {int[] arr = {1, 2, 3};System.out.println(Arrays.toString(arr));Arrays.sort(arr);System.out.println(Arrays.binarySearch(arr, 3));}
}

传入自定义 comparable 接口,来实现排序方式多样化
实现降序排序

package chapter4;import java.util.Arrays;
import java.util.Comparator;public class ArraysDemo {public static void main(String[] args) {Integer[] numbers = {5, 2, 8, 1, 9};// 使用自定义的Comparator进行降序排序Arrays.sort(numbers, new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {// 降序排序,将比较结果反转return b.compareTo(a);}});// 输出排序结果for (Integer number : numbers) {System.out.println(number);}}
}

System

System.arraycopy 执行数组复制
五个参数分别为:原数组,原数组起始索引,目标数组,目标数组起始索引,欲复制多少个元素

package chapter4;import java.util.Arrays;public class SystemDemo {public static void main(String[] args) {int[] arr1 = {1, 31, 4, 12, 3, 12};int[] arr2 = new int[3];System.arraycopy(arr1, 0, arr2, 0, 3);System.out.println(Arrays.toString(arr2));}
}

BigInteger 大数整数类型
需要使用大数类型提供的方法来进行加减乘除运算

同理,还存在一个高精度小数大数运算

package chapter4;import java.math.BigInteger;public class BigNum {public static void main(String[] args) {BigInteger bigInteger1 = new BigInteger("12839371293");BigInteger bigInteger2 = bigInteger1.add(bigInteger1);System.out.println(bigInteger2);}
}

Collection

Collection(集合)是 Java 中用于存储和操作一组对象的接口。

Collection 接口定义了一些常用的方法,如下所示:

  • boolean add(E element):向集合添加一个元素。
  • boolean remove(Object element):从集合中移除一个元素。
  • boolean contains(Object element):检查集合是否包含指定元素。
  • int size():返回集合中元素的数量。
  • boolean isEmpty():检查集合是否为空。
  • void clear():清空集合中的所有元素。
  • Iterator<E> iterator():返回一个迭代器,用于遍历集合中的元素。
  • boolean addAll(Collection<? extends E> collection):将另一个集合中的所有元素添加到当前集合中。
  • boolean removeAll(Collection<?> collection):从当前集合中移除与另一个集合中相同的元素。

常见的 Collection 子接口包括:

  • List:有序的集合,允许重复元素。
  • Set:不允许重复元素的集合。
  • Queue:队列接口,定义了在集合中进行插入和删除操作的方法。
  • Map:键值对的集合,每个元素都包含一个键和一个值。

可以借助迭代器遍历

package chapter5;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class IterateDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("shit");list.add("fuck");Iterator<String> iterator = list.iterator();while (iterator.hasNext()){String str = (String) iterator.next();System.out.println(str);}}
}

ArrayList

底层实现是数组,在多线程条件下不推荐使用

ArrayList 内部使用一个 Object 类型的数组来存储元素。

当创建一个 ArrayList 时,默认会创建一个初始容量为 10 的数组。随着元素的添加,如果数组的容量不足以存储新元素,ArrayList 会自动进行扩容,通常是以当前容量的一半增加容量。

ArrayList 可以通过索引直接访问和修改元素(时间复杂度为 O(1))。插入和删除操作涉及到元素的移动(平均情况下为 O(n))。

ArrayList 频繁进行插入和删除操作时,可能会造成数组的重新分配和复制,导致性能下降。


ArrayList 默认维护一个 elementData 数组
如果无参构造,其容量大小为 0;初次初始化容量变成 10,之后每次容量增加都是 1.5 倍;
如果初始化时指定容量,则后续扩容每次递增 1.5 倍;


源码分析

  1. 类声明和成员变量:ArrayList 类声明为public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable。它实现了 List 接口,并继承了 AbstractList 类。其中,E是泛型参数,表示 ArrayList 中存储的元素类型。ArrayList 还实现了其他接口,如 RandomAccess(支持快速随机访问)和 Cloneable(支持克隆)等。

  2. 成员变量:ArrayList 内部有两个重要的成员变量:

    • private static final int DEFAULT_CAPACITY = 10:默认的初始容量为 10。
    • private static final Object[] EMPTY_ELEMENTDATA = {}:当 ArrayList 创建时没有指定初始容量时,使用此空数组作为初始存储。
  3. 构造方法:

    • public ArrayList():无参构造方法,使用默认初始容量创建一个空的 ArrayList。
    • public ArrayList(int initialCapacity):指定初始容量的构造方法,创建一个指定初始容量的空 ArrayList。
    • public ArrayList(Collection<? extends E> c):接收一个集合参数的构造方法,创建一个包含集合元素的 ArrayList。
  4. 核心方法:

    • public boolean add(E element):将元素添加到 ArrayList 的末尾。
    • public void add(int index, E element):在指定位置插入元素。
    • public E get(int index):获取指定位置的元素。
    • public E remove(int index):删除指定位置的元素,并返回被删除的元素。
    • public boolean remove(Object element):删除第一个匹配到的元素。
    • public int size():返回 ArrayList 中元素的数量。
  5. 扩容机制:

    • 当插入元素时,如果当前容量不足,会进行扩容。扩容时,创建一个新的容量更大的数组,并将原数组中的元素复制到新数组中。
    • 扩容的策略是按当前容量的一半进行扩展,即新容量为原容量的 1.5 倍。
    • 扩容操作通过ensureCapacityInternal方法实现。

Vector

Vector 是 Java 集合框架中的一个动态数组实现。Vector 与 ArrayList 类似,但具有线程安全的特性,因此在多线程环境下更适合使用。

  1. 类声明和继承关系:Vector 类声明为public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable。它实现了 List 接口,并继承了 AbstractList 类。与 ArrayList 类似,E是泛型参数,表示 Vector 中存储的元素类型。Vector 还实现了其他接口,如 RandomAccess(支持快速随机访问)和 Cloneable(支持克隆)等。

  2. 线程安全性:Vector 是线程安全的,Vector 通过在关键方法上使用synchronized关键字来实现线程安全,保证了对共享数据的原子性操作。

  3. 构造方法:

    • public Vector():无参构造方法,创建一个初始容量为 10 的空 Vector。
    • public Vector(int initialCapacity):指定初始容量的构造方法,创建一个指定初始容量的空 Vector。
    • public Vector(int initialCapacity, int capacityIncrement):指定初始容量和容量增量的构造方法,创建一个初始容量和容量增量的空 Vector。
    • public Vector(Collection<? extends E> c):接收一个集合参数的构造方法,创建一个包含集合元素的 Vector。
  4. 核心方法:

    • public synchronized boolean add(E element):将元素添加到 Vector 的末尾。
    • public synchronized void add(int index, E element):在指定位置插入元素。
    • public synchronized E get(int index):获取指定位置的元素。
    • public synchronized E remove(int index):删除指定位置的元素,并返回被删除的元素。
    • public synchronized boolean remove(Object element):删除第一个匹配到的元素。
    • public synchronized int size():返回 Vector 中元素的数量。

单线程环境下,如果不需要线程安全的特性,推荐使用 ArrayList 而不是 Vector,因为 ArrayList 的性能更好。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建自己的OCR服务,第二步:PaddleOCR环境安装

PaddleOCR环境安装&#xff0c;遇到了很多问题&#xff0c;根据系统不同问题也不同&#xff0c;不要盲目看别人的教程&#xff0c;有的教程也过时了&#xff0c;根据实际情况自己调整。 我这边目前是使用windows 10系统CPU python 3.7 搭建。 熟悉OCR的人应该知道&#xff0…

合宙Air724UG LuatOS-Air LVGL API控件-标签 (Label)

标签 (Label) 标签是 LVGL 用来显示文字的控件。 示例代码 label lvgl.label_create(lvgl.scr_act(), nil) lvgl.label_set_recolor(label, true) lvgl.label_set_text(label, "#0000ff Re-color# #ff00ff words# #ff0000 of\n# align the lines …

时间管理类书籍阅读笔记

背景 这段时间看了时间管理方面的书籍&#xff0c;大部分和早晨时间利用相关。之所以有了利用早晨时间的想法&#xff0c;是某天下班后&#xff0c;感觉很疲惫&#xff0c;什么都不想做&#xff0c;于是就打了一晚上游戏&#xff0c;然后第二天重复着这样的生活。 突然意识到…

基于Spring、SpringMVC、Mybatis的超市管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的超市订单管理系统,java项目。 …

微信小程序替换双重循环渲染中报错图片

当微信小程序中的图片加载失败导致报错时&#xff0c;你可以通过以下步骤替换报错图片&#xff1a; 确保你有一个用于替换报错图片的备用图片&#xff0c;可以是与原始图片相同尺寸和格式的另一张图片。 在相关的.wxml文件中&#xff0c;找到显示报错图片的 <image> 标签…

AWK语言第二版 2.2选择

2.2 选择 Awk的基本结构组成&#xff0c;就是用一系列的样式选择出感兴趣的行&#xff0c;并对其进行操作。这样的程序很多都是一次性的&#xff0c;敲出来之后就用几次。然而&#xff0c;有些程序很有用&#xff0c;如果每次用之前都要重新敲一遍代码&#xff0c;就太麻烦了&…

Linux修改fs.inotify.max_user_watches(“外部文件更改同步可能很慢”和“当前的 inotify(7) 监视限制太低”)

fs.inotify.max_user_watches 参数是用于控制 Linux 内核中 inotify 子系统的观察者数量限制。inotify 是一种文件系统监控机制&#xff0c;它可以用于检测文件或目录的变化&#xff0c;并在事件发生时通知相关的应用程序。 具体而言&#xff0c;fs.inotify.max_user_watches …

B站:AB test [下]

Focus在&#xff1a;AB Test结束后&#xff0c;如何进行显著性检验&#xff1f;&#xff08;以判断改动是否有效果&#xff09; 引入&#xff1a;Z检验和T检验 而T检验适用于 n<30 的小样本 值得注意的是&#xff1a;统计上显著并不意味着现实中显著&#xff01; e.g. 加速…

尚硅谷大数据项目《在线教育之离线数仓》笔记008

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 P123 P124 P125 P126 P127 P128 P129 P123 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数…

设计模式的六大设计原则

一、单一职责原则 一个类只负责一个单一明确的职责。如果一个类同时负责多个职责&#xff0c;来自职责A的需求变更引起的修改可能会导致职责B的功能发生故障。 比如说一个类T原本是符合单一职责的&#xff0c;后来因为某种原因或者是需求变更了&#xff0c;需要将职责P细分为…

医院空调冷热源设计方案VR元宇宙模拟演练的独特之处

作为一个备受关注的技术-元宇宙&#xff0c;毋庸置疑的是&#xff0c;因为建筑本身契合了时尚、前卫、高端、虚拟、科幻、泛在、协作、互通等元素特征&#xff0c;因此在建筑行业更需要元宇宙&#xff0c;以居民建筑环境冷热源设计来说&#xff0c;元宇宙会打破既定的现实阻碍和…

D1D2. Candy Party

d1的题意是有n个人每个人都有一定的糖果&#xff0c;同时每个人必须给其他人一次糖果和接收其他人给他的一次糖果&#xff0c;同时给出的糖果和接收的数目都是2^x&#xff0c;最后确保每个人拥有的糖果数目一样 思路&#xff1a;我们可以先由平均数算出每个人最终要拥有的糖果…

LVS NAT模式负载均衡群集部署

目录 1 群集(集群) cluster 1.1 群集的类型 2 LVS的工作模式及其工作过程 2.1 NAT模式&#xff08;VS-NAT&#xff09; 2.2 直接路由模式&#xff08;VS-DR&#xff09; 2.3 IP隧道模式&#xff08;VS-TUN&#xff09; 3 LVS-NAt 模式配置步骤 3.1 部署共享存储 3.2 配…

SSL证书验签时要带www吗?

单域名证书&#xff1a;顶级域名如www.abc.com或abc.com 不管你提交订单的时候填写的域名是带www或不带www的域名&#xff0c;签发的证书均支持www和不带www的域名 单域名证书&#xff1a;子域名如mail.abc.com&#xff0c;签发的证书仅支持mail.abc.com 通配符证书&#xff…

MySQL触发器使用指南大全

一、介绍 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前或之后&#xff0c;触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性&#xff0c;日志记录&#xff0c;数据校验等操作。 使用别名OLD和NEW来引…

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

C++之生成key-value键值三种方式(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Linux命令(77)之curl

linux命令之curl 1.curl介绍 linux命令之curl是一款强大的http命令行工具&#xff0c;它支持文件的上传和下载&#xff0c;是综合传输工具。 2.curl用法 curl [参数] [url] curl参数 参数说明-C断点续传-o <filename>把输出写到filename文件中-x在给定的端口上使用HT…

Web server failed to start. Port 8080 was already in use.之解决方法

问题&#xff1a; Web server failed to start. Port 8080 was already in use&#xff0c;这句错误描述意思是当前程序的端口号8080被占用了&#xff0c;需要将占用该端口的程序停止掉才行&#xff1b;错误如图所示&#xff1a; 解决方法&#xff1a; 按住winr&#xff0c;输入…

React 消息文本循环展示

需求 页面上有个小喇叭&#xff0c;循环展示消息内容 逻辑思路 设置定时器&#xff0c;修改translateX属性来实现滚动&#xff0c;判断滚动位置&#xff0c;修改list位置来实现无限滚动 实现效果 代码 /** Author: Do not edit* Date: 2023-09-07 11:11:45* LastEditors: …