一些java中记忆的问题

news2024/10/6 6:11:39

什么是封装

封装是将对象的属性和方法(或称为成员)结合成一个独立的单元,隐藏对象的属性和实现细节,仅对外公开接口(方法)与对象进行交互。

链表数据结构

链表是一种常见的数据结构,它由一系列节点(Node)组成,每个节点包含数据和一个或多个指向其他节点的引用(即指针)。与数组不同,链表中的元素在内存中不是连续存储的。链表提供了一种灵活的方式来组织数据,尤其适用于需要频繁插入和删除操作的场景。

链表的类型

  1. 单向链表(Singly Linked List)

    • 每个节点包含数据和一个指向下一个节点的引用。
    • 最后一个节点的引用指向 null,表示链表的结束。
  2. 双向链表(Doubly Linked List)

    • 每个节点包含数据、一个指向下一个节点的引用和一个指向前一个节点的引用。
    • 链表的头节点的前引用和尾节点的后引用指向 null
  3. 循环链表(Circular Linked List)

    • 单向或双向链表的一种变体,其中最后一个节点的引用指向头节点,形成一个环。
  4. 双向循环链表(Doubly Circular Linked List)

    • 双向链表的一种变体,最后一个节点的后引用指向头节点,头节点的前引用指向尾节点。

单向链表的实现示例

以下是一个简单的单向链表的实现:

class Node {
    int data;
    Node next;

    Node(int data) {
        this.data = data;
        this.next = null;
    }
}

class SinglyLinkedList {
    Node head;

    // 添加元素到链表的头部
    public void addFirst(int data) {
        Node newNode = new Node(data);
        newNode.next = head;
        head = newNode;
    }

    // 添加元素到链表的尾部
    public void addLast(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
            return;
        }
        Node current = head;
        while (current.next != null) {
            current = current.next;
        }
        current.next = newNode;
    }

    // 打印链表中的所有元素
    public void printList() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.println();
    }
}

public class Main {
    public static void main(String[] args) {
        SinglyLinkedList list = new SinglyLinkedList();
        list.addFirst(1);
        list.addLast(2);
        list.addLast(3);
        list.printList();  // 输出: 1 2 3
    }
}

链表的优点

  1. 动态大小:链表可以动态调整大小,没有固定的容量限制。
  2. 插入和删除效率高:在已知位置插入或删除元素的时间复杂度为O(1)。
  3. 内存利用率高:链表的内存利用率比数组高,因为不需要预先分配大量连续内存。

链表的缺点

  1. 访问效率低:链表不支持高效的随机访问,访问任意元素的时间复杂度为O(n)。
  2. 额外的内存开销:每个节点除了存储数据外,还需要存储指向下一个节点的引用,增加了内存开销。
  3. 复杂的实现:与数组相比,链表的实现和操作更复杂,需要处理指针的维护。

链表的应用场景

  1. 频繁插入和删除操作:例如实现队列、栈等数据结构。
  2. 需要动态调整大小的场景:例如实现链式散列表(Hash Table)。
  3. 内存利用率要求高的场景:例如大数据处理中的内存管理。

arrylist vector linklist 的区别

ArrayListVectorLinkedList 是 Java 中常用的集合类,它们都有各自的特性和用途。以下是它们之间的主要区别:

1. ArrayList

  • 底层实现:基于动态数组。
  • 线程安全:不是线程安全的,多个线程同时访问时需要手动同步。
  • 性能:由于是动态数组,支持快速随机访问(时间复杂度为 O(1)),但在插入和删除元素时,特别是在数组中间位置,会涉及大量元素的移动,性能较低(时间复杂度为 O(n))。
  • 适用场景:适用于频繁读取和访问元素的场景。

2. Vector

  • 底层实现:基于动态数组。
  • 线程安全:线程安全的,所有方法都被 synchronized 修饰,多个线程可以安全地访问。
  • 性能:由于线程安全的开销,性能比 ArrayList 略低。同样支持快速随机访问,但插入和删除元素时性能较低。
  • 适用场景:适用于多线程环境下,需要频繁读取和访问元素的场景。

3. LinkedList

  • 底层实现:基于双向链表。
  • 线程安全:不是线程安全的,多个线程同时访问时需要手动同步。
  • 性能:不支持高效的随机访问(时间复杂度为 O(n)),但在插入和删除元素时,性能较高(在链表两端操作的时间复杂度为 O(1),在中间插入删除的时间复杂度为 O(n))。
  • 适用场景:适用于频繁插入和删除元素的场景。

具体区别总结

  • 实现方式ArrayListVector 基于动态数组实现,而 LinkedList 基于双向链表实现。
  • 线程安全Vector 是线程安全的,ArrayListLinkedList 不是线程安全的。
  • 性能ArrayListVector 提供了快速的随机访问,但插入和删除性能较低;LinkedList 插入和删除性能较高,但随机访问性能较低。
  • 内存使用ArrayListVector 的内存使用更加紧凑,LinkedList 由于每个节点需要存储指针,内存开销较大。

使用示例

import java.util.ArrayList;
import java.util.Vector;
import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        // ArrayList 示例
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("A");
        arrayList.add("B");
        System.out.println("ArrayList: " + arrayList);

        // Vector 示例
        Vector<String> vector = new Vector<>();
        vector.add("A");
        vector.add("B");
        System.out.println("Vector: " + vector);

        // LinkedList 示例
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("A");
        linkedList.add("B");
        System.out.println("LinkedList: " + linkedList);
    }
}

选择哪种集合类,取决于具体的使用场景和需求。

迭代器 简述

迭代器(Iterator)是Java集合框架中的一种对象,用于遍历集合(如ArrayListHashSet等)中的元素。它提供了一种统一的方式来访问集合中的每一个元素,而不需要了解集合的底层实现。以下是迭代器的主要特性和使用方法:

主要特性

  1. 遍历集合:迭代器可以遍历集合中的每一个元素。
  2. 无须了解底层实现:使用迭代器时,不需要知道集合的具体实现方式,只需要按照统一的接口操作。
  3. 单向遍历:迭代器通常只能单向遍历集合,从第一个元素开始,一直到最后一个元素。
  4. 安全删除:通过迭代器,可以在遍历过程中安全地删除元素。

常用方法

迭代器接口 (java.util.Iterator) 提供了以下三个主要方法:

  1. boolean hasNext():如果迭代器中还有元素可以迭代,则返回 true
  2. E next():返回迭代器中的下一个元素。
  3. void remove():从集合中删除迭代器返回的上一个元素(可选操作)。

使用示例

以下是使用迭代器遍历 ArrayList 的一个简单示例:

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        // 获取迭代器
        Iterator<String> iterator = list.iterator();

        // 使用迭代器遍历集合
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
        }
    }
}

迭代器的优势

  1. 统一遍历方式:无论集合类型是什么,使用迭代器都可以统一地遍历集合。
  2. 避免并发修改异常:在遍历过程中,如果使用集合自身的修改方法(如addremove),可能会导致 ConcurrentModificationException。使用迭代器的 remove 方法可以安全地删除元素。
  3. 简化代码:迭代器可以简化代码,使得遍历集合的代码更加清晰和简洁。

注意事项

  • 只读迭代器:对于某些集合(如Collections.unmodifiableList返回的集合),迭代器可能是只读的,调用 remove 方法会抛出 UnsupportedOperationException
  • 并发修改:如果在迭代过程中修改了集合(不是通过迭代器),可能会导致 ConcurrentModificationException。要在遍历过程中安全地修改集合,应该使用迭代器的 remove 方法。

jdk1.8新特性

JDK 1.8(也称为Java 8)引入了许多新特性和改进,使其成为Java平台的一个重要版本。以下是一些主要的新特性:

  1. Lambda 表达式

    • Lambda 表达式提供了一种简洁的方式来传递行为,使代码更简洁和灵活。
    • 语法:(参数) -> 表达式 (参数) -> { 代码块 }
    • 例如:(int x, int y) -> x + y 表示一个接收两个整数并返回它们和的函数。
  2. 函数式接口

    • 函数式接口是仅包含一个抽象方法的接口,用于Lambda表达式和方法引用。
    • Java 8 提供了许多内置的函数式接口,如 Function<T, R>, Consumer<T>, Supplier<T>, Predicate<T> 等。
    • 可以用 @FunctionalInterface 注解来标识函数式接口。
  3. 方法引用

    • 方法引用提供了一种简洁的Lambda表达式的替代语法。
    • 语法:Class::methodNameinstance::methodName
    • 例如:String::valueOf 表示 valueOf 静态方法的引用。
  4. 接口默认方法

    • 接口现在可以有默认方法,允许在不破坏现有实现的情况下添加新方法。
    • 使用 default 关键字来定义默认方法。
    • 例如:default void log(String message) { System.out.println(message); }
  5. Stream API

    • Stream API 用于处理集合类(如List、Set)的数据操作。
    • 支持对集合进行声明性的数据处理,如过滤、排序、映射等。
    • 例如:List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
  6. Optional 类

    • Optional 类用于防止出现空指针异常。
    • 提供了许多方法来安全地处理可能为空的值。
    • 例如:Optional<String> optional = Optional.ofNullable(value);
  7. 新的日期时间 API

    • 引入了 java.time 包,提供了更好的日期时间处理。
    • 包括 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 等类。
    • 例如:LocalDate date = LocalDate.now();
  8. Nashorn JavaScript 引擎

    • Java 8 引入了 Nashorn,一个新的 JavaScript 引擎,用于替代 Rhino。
    • 允许在 Java 应用中嵌入 JavaScript 代码。
  9. Base64 编码和解码

    • 提供了 java.util.Base64 类用于Base64编码和解码。
    • 例如:String encoded = Base64.getEncoder().encodeToString("hello".getBytes());
  10. 并行数组(Parallel Array)

    • 提供了 Arrays.parallelSort 方法,用于并行排序数组,提高大数据集的处理性能。
  11. 改进的集合 API

    • 添加了一些新的方法,如 forEachremoveIfreplaceAllcomputemerge 等。

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

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

相关文章

linux固定主机ip

1.查看虚拟网络配置 NAT设置&#xff1a; 2.修改网卡配置文件 [rootlocalhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" DEFROUTE"yes"…

PD虚拟机不能复制Mac的文件怎么回事 PD虚拟机不能复制Mac的文件怎么办 Parallels Desktop怎么用

PD虚拟机不仅能提供跨系统协作的服务&#xff0c;还能进行虚拟机系统与原生系统间的文件共享、文本复制、文件复制等操作&#xff0c;让系统间的资源可以科学利用。但在实际操作过程中&#xff0c;PD虚拟机不能复制Mac的文件怎么回事&#xff1f;PD虚拟机不能复制Mac的文件怎么…

PDM系统中物料分类与编码规则生成方案

在企业管理软件中&#xff0c;PDM系统是企业管理的前端软件&#xff0c;用于管理研发图纸、BOM等数据&#xff0c;然后生成相关物料表或BOM&#xff0c;递交给后端ERP系统进行生产管理。在PDM系统中&#xff0c;有两种方式可以生成物料编码。 1第一种是用户可以通过软件接口将…

Open3D 点云的圆柱形邻域搜索

目录 一、概述 1.1原理 1.2应用 二、代码实现 2.1完整代码 2.2程序说明 三、实现效果 3.1原始点云 3.2搜索后点云 一、概述 1.1原理 圆柱邻域搜索的基本思想是确定点云中的哪些点位于给定圆柱的内部。一个圆柱可以由以下几个参数定义&#xff1a; 中心点&#xff1a;…

RedHat9 | Zabbix-Server监控服务部署

系统版本以及软件版本 使用的系统版本&#xff1a; Red Hat Enterprise Linux release 9.2 软件版本&#xff1a; zabbix-release-7.0-3.el9.noarchzabbix-web-7.0.0-release1.el9.noarchzabbix-web-mysql-7.0.0-release1.el9.noarchzabbix-web-deps-7.0.0-release1.el9.noar…

Vue3+.NET6前后端分离式管理后台实战(二十七)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(二十七)

C++ 函数高级——函数重载——基本语法

作用&#xff1a;函数名可以相同&#xff0c;提高复用性 函数重载满足条件&#xff1a; 1.同一个作用域下 2.函数名称相同 3.函数参数类型不同 或者 个数不同 或者 顺序不同 注意&#xff1a;函数的返回值不可以作为函数重载的条件 示例&#xff1a; 运行结果&#xff1a;

排序格式排序格式

排序格式排序格式

探讨4层代理和7层代理行为以及如何获取真实客户端IP

准备工作 实验环境 IP角色192.168.1.100客户端请求IP192.168.1.100python 启动的HTTP服务192.168.1.102nginx服务192.168.1.103haproxy 服务 HTTP服务 这是一个简单的HTTP服务&#xff0c;主要打印HTTP报文用于分析客户端IP #!/usr/bin/env python # coding: utf-8import …

【c++刷题笔记-数组】day29:452. 用最少数量的箭引爆气球、 435. 无重叠区间 、 763.划分字母区间

452. 用最少数量的箭引爆气球 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;先按照左边界排序&#xff0c;当前的左边界大于前一个的右边界的时候&#xff0c;表示没有覆盖所以需要一根箭&#xff0c;反之则要更新为最小的右边界 重点&#xff1a;是区间覆盖问题…

FMEA在大型光伏电站安全生产管理中的应用

一、FMEA概述 FMEA&#xff08;Failure Modes and Effects Analysis&#xff09;即失效模式和影响分析&#xff0c;是一种用于识别和分析产品或过程中潜在故障模式及其影响的方法。它通过对产品或过程中可能出现的故障模式进行系统性地梳理和分析&#xff0c;评估其可能的影响…

Day59 动态规划part12

LC115不同的子序列&#xff08;未掌握&#xff09; 递推公式与LC392类似&#xff0c;但是初始化略有不同 LC392的dp数组含义为相同字符个数而本体的dp数组含义为出现的次数&#xff0c;因此dp[i][0]1 两种情况 s[i-1]t[j-1] dp[i][j] dp[i-1][j-1]dp[i][j] dp[i-1][j] s[…

CosyVoice - 阿里最新开源语音克隆、文本转语音项目 支持情感控制及粤语 本地一键整合包下载

近日&#xff0c;阿里通义实验室发布开源语音大模型项目FunAudioLLM&#xff0c;而且一次包含两个模型&#xff1a;SenseVoice和CosyVoice。 CosyVoice专注自然语音生成&#xff0c;支持多语言、音色和情感控制&#xff0c;支持中英日粤韩5种语言的生成&#xff0c;效果显著优于…

JAVA集合框架、CAS、AQS

目录 一、java 的集合框架有哪些? 二、说-下 ArrayList 和 LinkedList? 三、HashSet和TreeSet的区别? 四、HashMap 的数据结构是什么? 五、CAS机制 六、AQS理解 一、java 的集合框架有哪些? Collection 是 Java 集合框架中的一个根接口&#xff0c;位于 java.util 包中。它…

那些年背过的面试题——MySQL篇

本文是技术人面试系列 MySQL 篇&#xff0c;面试中关于 MySQL 都需要了解哪些基础&#xff1f;一文带你详细了解&#xff0c;欢迎收藏&#xff01; WhyMysql&#xff1f; NoSQL 数据库四大家族 列存储 Hbase K-V 存储 Redis 图像存储 Neo4j 文档存储 MongoDB 云存储 OSS …

RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录 1、引入 2、Fanout交换机 案例&#xff1a;利用SpringAMQP演示Fanout交换机的使用 3、Direct交换机 案例&#xff1a;利用SpringAMQP演示Direct交换机的使用 4、Topic交换机 案例&#xff1a;利用SpringAMQP演示Topic交换机的使用 1、引入 真实的生产环境都会经过e…

[240707] X-CMD v0.3.14: cb gh fjo zig 模块增强;新增 lsio 和 pixi 模块

目录 X-CMD 发布 v0.3.14✨ advise&#xff1a;Bash 环境下自动补全时&#xff0c;提供命令的描述信息✨ cb:支持下载指定版本的附件资源✨ gh:支持下载指定版本的附件资源✨ fjo:支持下载指定版本的附件资源✨ zig&#xff1a;新增 pm 和 zon 子命令✨ lsio&#xff1a;用于查…

Maven一键配置阿里云远程仓库,让你的项目依赖飞起来!

文章目录 引言一、为什么选择阿里云Maven仓库&#xff1f;二、如何设置Maven阿里云远程仓库&#xff1f;三、使用阿里云Maven仓库的注意事项总结 引言 在软件开发的世界里&#xff0c;Maven无疑是一个强大的项目管理工具&#xff0c;它能够帮助我们自动化构建、依赖管理和项目…

并发处理 优先图和多重图

优先图(Precedence Graph)视图可串性多重图(Polygraph) 优先图(Precedence Graph) 优先图用于冲突可串性的判断。 优先图结构&#xff1a; 结点 (Node)&#xff1a;事务&#xff1b;有向边 (Arc): Ti → Tj &#xff0c;满足 Ti <s Tj&#xff1b; 存在Ti中的操作A1和Tj…

43、nginx的优化、防盗链、重定向、代理

nginx的优化、防盗链、重定向、代理 一、nginx的优化 1.1、隐藏版本号 server_tokens off;隐藏版本号 [roottest1 conf]# vim nginx.confserver_tokens off;[roottest1 conf]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok ngin…