Java集合框架学习笔记

编程自学指南:java程序设计开发,Java高级API-集合框架学习笔记 编程自学指南:java程序设计开发,Java高级API-集合框架学习笔记,Java 集合框架是 Java 提供的一组用于存储和操作数据的类和接口,位于 java.util 包中。它提供了各种数据结构(如列表、集合、映射等),能方便开发者处理不同类型的数据。 阅读详情

一、为什么要有集合?

Student[] arr = new Student[10];
//问题:长度不可变
arr[11] = new Student();  // 数组越界
//不便于删除、添加
arr.remove();  // 数组没有remove方法
arr.add();     // 数组没有add方法

二、集合的体系结构

Collection接口:单列集合的顶级接口
    |--List接口:有序
        |--ArrayList类:底层是动态数组,set和get速度快,add和remove速度慢因为要移动数据
        |--Vector类:线程安全的ArrayList
        |--LinkedList类:底层是双向链表,add和remove速度快,set和get速度慢因为没有下标
        
Map接口:双列集合的顶级接口
    |--HashMap类
    |--TreeMap类
    |--Hashtable类

三、Collection接口

是什么?

单列集合的顶级接口

方法:

boolean add(E e)         // 添加元素e
boolean remove(Object o) // 删除元素o
int size()              // 返回集合中元素个数
boolean isEmpty()        // 判断集合是否为空
boolean contains(Object obj)  // 判断集合中是否包含obj
Iterator iterator()     // 返回迭代器对象

四、List接口

是什么?

它是一个元素存取有序的集合

方法:

void add(int index,E element)  // 把元素添加到指定下标的位置,其他元素后移
E get(int index)               // 返回指定下标的元素
E set(int index,E element)     // 修改指定下标处的元素
E remove(int index)            // 删除指定下标的元素

案例:

   List<String> stringlist = new ArrayList<>();
//        增加数据
        stringlist.add("aaaa-1");
        stringlist.add("aaaa-2");
        stringlist.add("aaaa-3");
        stringlist.add(0,"bbb-4");

        System.out.println("增强for循环");
        for (String s : stringlist) {
            System.out.println(s);
        }
//        修改数据
        System.out.println("修改");
        stringlist.set(1,"bbb-3");
        System.out.println("for循环遍历");
        for (int i = 0; i <stringlist.size() ; i++) {
//            查询数据
            System.out.println(stringlist.get(i));
        }
//        删除数据
        System.out.println("删除");
        for (int i = stringlist.size()-1; i >=0 ; i--) {
           stringlist.remove(i);
        }
        stringlist.clear();
        System.out.println("迭代器遍历");
        Iterator<String> iterator = stringlist.iterator();
        while (iterator.hasNext()){
            String str =iterator.next();
            System.out.println(str);
        }

五、ArrayList类

特点:

  • 基于动态数组实现

  • 查询快(get、set),增删慢

  • 线程不安全

  • 可以存储null

  • 有扩容机制

扩容机制:

// JDK 1.8
int newCapacity = oldCapacity + (oldCapacity >> 1);  // 1.5倍扩容

常用方法:

// 继承自Collection和List的方法
add(E e)
remove(Object o)
get(int index)
set(int index, E element)

// 特有方法
ensureCapacity(int minCapacity)  // 确保最小容量
trimToSize()                     // 调整容量到实际大小

示例:

  List<String> stringlist = new ArrayList<>();
//        增加数据
        stringlist.add("jack");
        stringlist.add("rost");
        stringlist.add("lisi");
        stringlist.add("zhangsan");
        stringlist.add("lisi");
        stringlist.add("jetty");

        int oneIndex = -1;
        int lastIndex = -1;
        for (int i = 0; i <stringlist.size() ; i++) {

            if ("lisi".equals(stringlist.get(i))){
                if (oneIndex == -1){
                    oneIndex = i;
                }
                lastIndex = i;
            }

        }
        System.out.println("list第一次出现的下标"+oneIndex+" "+"list最后一次出现的下标"+lastIndex);


        stringlist.remove(0);
        stringlist.remove(stringlist.size()-1);
        for (String str:stringlist) {
            System.out.println(str);
        }
    }

六、Vector类

特点:

  • 基于动态数组实现

  • 线程安全(synchronized修饰方法)

  • 查询快,增删慢

  • 历史遗留类,不推荐使用

与ArrayList的区别:

  1. 线程安全性:Vector线程安全,ArrayList非线程安全

  2. 扩容机制:Vector默认扩容2倍,ArrayList扩容1.5倍

  3. 性能:Vector有同步开销,性能较低

常用方法:

// Vector特有的方法
addElement(E obj)    // 添加元素
elementAt(int index) // 获取指定位置元素
elements()           // 返回枚举

示例:

public static void main(String[] args) {
        List<Integer> intList = new Vector<>();
        intList.add(1);
        intList.add(2);
        intList.add(3);
        intList.add(4);
        intList.add(5);
        System.out.println(intList);
        intList.set(3,23);
        System.out.println(intList);
        Integer integer = intList.get(2);
        System.out.println(integer);
        intList.remove(1);
        System.out.println(intList);
    }

七、LinkedList类

特点:

  • 基于双向链表实现

  • 增删快(add、remove),查询慢

  • 实现了List和Deque接口

  • 线程不安全

  • 每个元素包含前驱和后继指针

底层结构:

private static class Node<E> {
    E item;         // 数据
    Node<E> next;   // 后继节点
    Node<E> prev;   // 前驱节点
}

常用方法:

// List接口方法
add(E e)
get(int index)
remove(int index)

// 链表特有方法
addFirst(E e)      // 头部添加
addLast(E e)       // 尾部添加
getFirst()         // 获取头部元素
getLast()          // 获取尾部元素
removeFirst()      // 删除头部元素
removeLast()       // 删除尾部元素

// 队列方法
offer(E e)         // 添加到队列尾部
poll()             // 移除并返回头部元素
peek()             // 查看头部元素

示例:

LinkedList<String> list = new LinkedList<>();
list.add("Java");
list.addFirst("C++");  // 头部添加
list.addLast("Python");  // 尾部添加
String first = list.getFirst();  // "C++"
String last = list.getLast();    // "Python"
list.removeFirst();  // 删除头部

八、HashSet类详解 ⚡

8.1 什么是HashSet?

HashSet是Set接口最常用的实现类,基于HashMap实现。它存储唯一的元素,但不保证迭代顺序。

// HashSet的声明
public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

8.2 核心特点

  • ✅ 无序性:不保证元素的存储顺序

  • ✅ 唯一性:不允许重复元素

  • ✅ 允许null:可以存储一个null元素

  • ✅ 高性能:添加、删除、查找都是O(1)时间复杂度

  • ❌ 非线程安全:多线程环境下需要同步

8.3 底层实现原理 🔍

HashSet底层实际上是HashMap:

// HashSet源码关键部分
public class HashSet<E> {
    // 底层使用HashMap存储
    private transient HashMap<E,Object> map;
    
    // 虚拟的value值
    private static final Object PRESENT = new Object();
    
    // 构造方法
    public HashSet() {
        map = new HashMap<>();  // 默认初始容量16,加载因子0.75
    }
    
    // 添加元素 - 实际上是把元素作为key放入HashMap
    public boolean add(E e) {
        return map.put(e, PRESENT) == null;
    }
}

哈希表工作原理:

// 简化版的工作流程
public boolean add(E element) {
    // 1. 计算hashCode
    int hash = element.hashCode();
    
    // 2. 通过哈希算法计算索引位置
    int index = (hash & 0x7FFFFFFF) % table.length;
    
    // 3. 如果该位置为空,直接放入
    if (table[index] == null) {
        table[index] = new Node<>(hash, element);
        return true;
    }
    
    // 4. 如果该位置不为空,遍历链表/红黑树
    // 比较hashCode,如果相同再调用equals()方法
    // 如果equals()返回true,表示元素已存在,不添加
    // 如果equals()返回false,添加到链表末尾
}

8.4 使用示例 📝

import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        // 1. 创建HashSet
        Set<String> fruitSet = new HashSet<>();
        
        // 2. 添加元素
        fruitSet.add("Apple");
        fruitSet.add("Banana");
        fruitSet.add("Orange");
        fruitSet.add("Apple");  // 重复元素,不会被添加
        fruitSet.add(null);     // 可以添加null
        
        System.out.println("集合内容: " + fruitSet);
        System.out.println("集合大小: " + fruitSet.size());  // 4
        
        // 3. 判断是否包含
        System.out.println("是否包含Apple: " + fruitSet.contains("Apple"));  // true
        
        // 4. 删除元素
        fruitSet.remove("Banana");
        System.out.println("删除Banana后: " + fruitSet);
        
        // 5. 遍历HashSet
        System.out.println("\n=== 遍历方式 ===");
        // 方式1: 增强for循环
        for (String fruit : fruitSet) {
            System.out.println(fruit);
        }
        
        // 方式2: 迭代器
        java.util.Iterator<String> iterator = fruitSet.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        
        // 方式3: forEach (Java 8+)
        fruitSet.forEach(System.out::println);
    }
}

8.5 存储自定义对象 📦

重要:存储自定义对象必须重写hashCode()和equals()方法!

import java.util.HashSet;
import java.util.Objects;

class Student {
    private String id;
    private String name;
    
    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }
    
    // 必须重写hashCode和equals方法
    @Override
    public int hashCode() {
        // 使用Objects工具类生成hashCode
        return Objects.hash(id, name);
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Student student = (Student) obj;
        return Objects.equals(id, student.id) && 
               Objects.equals(name, student.name);
    }
    
    @Override
    public String toString() {
        return "Student{id='" + id + "', name='" + name + "'}";
    }
}

public class CustomObjectExample {
    public static void main(String[] args) {
        Set<Student> studentSet = new HashSet<>();
        
        Student s1 = new Student("001", "张三");
        Student s2 = new Student("002", "李四");
        Student s3 = new Student("001", "张三");  // 与s1相同
        
        studentSet.add(s1);
        studentSet.add(s2);
        studentSet.add(s3);  // 不会被添加,因为与s1相同
        
        System.out.println("学生集合: " + studentSet);
        System.out.println("集合大小: " + studentSet.size());  // 2
    }
}

九、LinkedHashSet类详解 🔗

9.1 什么是LinkedHashSet?

LinkedHashSet是HashSet的子类,在HashSet的基础上维护了元素的插入顺序。

// LinkedHashSet的声明
public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

9.2 核心特点

  • ✅ 有序性:保证元素的插入顺序

  • ✅ 唯一性:不允许重复元素

  • ✅ 允许null:可以存储一个null元素

  • ✅ 性能良好:接近HashSet的性能

  • ❌ 内存占用稍大:需要维护链表结构

9.3 底层实现原理 🏗️

LinkedHashSet底层是LinkedHashMap:

// LinkedHashSet源码关键部分
public class LinkedHashSet<E> extends HashSet<E> {
    // 调用父类构造器,创建LinkedHashMap
    public LinkedHashSet() {
        super(16, .75f, true);
    }
}

// HashSet中的构造器
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

数据结构:数组 + 双向链表

索引   元素链表
 0  -> null
 1  -> Entry1("A") <-> Entry2("B")  // 双向链表保持顺序
 2  -> Entry3("C")

9.4 与HashSet的对比 📊

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetExample {
    public static void main(String[] args) {
        System.out.println("=== HashSet(无序)===");
        Set<String> hashSet = new HashSet<>();
        hashSet.add("Banana");
        hashSet.add("Apple");
        hashSet.add("Orange");
        hashSet.add("Grape");
        
        for (String fruit : hashSet) {
            System.out.println(fruit);  // 顺序不确定
        }
        
        System.out.println("\n=== LinkedHashSet(有序)===");
        Set<String> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add("Banana");
        linkedHashSet.add("Apple");
        linkedHashSet.add("Orange");
        linkedHashSet.add("Grape");
        
        for (String fruit : linkedHashSet) {
            System.out.println(fruit);  // 输出:Banana, Apple, Orange, Grape
        }
    }
}

9.5 性能对比表 📈

操作

HashSet

LinkedHashSet

添加元素

O(1)

O(1)

删除元素

O(1)

O(1)

查找元素

O(1)

O(1)

遍历元素

快

稍快(按插入顺序)

内存占用

较小

较大(多存储两个指针)

顺序保证

无

插入顺序


十、TreeSet类详解 🌳

8101 什么是TreeSet?

TreeSet是基于红黑树(自平衡二叉查找树)实现的Set,元素会自动排序。

// TreeSet的声明
public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable

10.2 核心特点

  • ✅ 有序性:元素自动排序

  • ✅ 唯一性:不允许重复元素

  • ❌ 不允许null:不能存储null元素

  • ✅ 范围查询:支持子集、头部、尾部视图

  • ⚡ 性能:添加、删除、查找都是O(log n)

10.3 排序方式 🎯

方式1:自然排序(元素实现Comparable接口)
import java.util.TreeSet;

// 自定义类实现Comparable接口
class Student implements Comparable<Student> {
    private String name;
    private int score;
    
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }
    
    // 按分数降序排序
    @Override
    public int compareTo(Student other) {
        // 分数高的排前面
        int result = other.score - this.score;
        
        // 分数相同按姓名排序
        if (result == 0) {
            result = this.name.compareTo(other.name);
        }
        return result;
    }
    
    @Override
    public String toString() {
        return name + "(" + score + ")";
    }
}

public class NaturalSortExample {
    public static void main(String[] args) {
        TreeSet<Student> treeSet = new TreeSet<>();
        
        treeSet.add(new Student("张三", 85));
        treeSet.add(new Student("李四", 92));
        treeSet.add(new Student("王五", 85));  // 分数相同,按姓名排序
        treeSet.add(new Student("赵六", 78));
        
        System.out.println("按分数排序:");
        for (Student student : treeSet) {
            System.out.println(student);
        }
        // 输出:
        // 李四(92)
        // 王五(85)
        // 张三(85)
        // 赵六(78)
    }
}
方式2:比较器排序(创建时传入Comparator)
import java.util.Comparator;
import java.util.TreeSet;

class Product {
    private String name;
    private double price;
    
    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }
    
    // getter方法省略...
}

public class ComparatorSortExample {
    public static void main(String[] args) {
        // 方式1:匿名内部类
        TreeSet<Product> treeSet1 = new TreeSet<>(new Comparator<Product>() {
            @Override
            public int compare(Product p1, Product p2) {
                // 按价格升序
                int result = Double.compare(p1.getPrice(), p2.getPrice());
                if (result == 0) {
                    result = p1.getName().compareTo(p2.getName());
                }
                return result;
            }
        });
        
        // 方式2:Lambda表达式(Java 8+)
        TreeSet<Product> treeSet2 = new TreeSet<>(
            Comparator.comparingDouble(Product::getPrice)
                     .thenComparing(Product::getName)
        );
        
        // 方式3:方法引用
        TreeSet<String> treeSet3 = new TreeSet<>(String::compareToIgnoreCase);
    }
}

10.4 TreeSet特有方法 🎁

import java.util.TreeSet;
import java.util.SortedSet;

public class TreeSetMethods {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        
        // 添加元素
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        numbers.add(40);
        numbers.add(50);
        
        // 1. 获取第一个和最后一个元素
        System.out.println("第一个元素: " + numbers.first());  // 10
        System.out.println("最后一个元素: " + numbers.last());  // 50
        
        // 2. 获取小于/大于某个值的元素
        System.out.println("小于25的最大元素: " + numbers.lower(25));  // 20
        System.out.println("大于25的最小元素: " + numbers.higher(25));  // 30
        
        // 3. 获取小于等于/大于等于的元素
        System.out.println("小于等于25的最大元素: " + numbers.floor(25));  // 20
        System.out.println("大于等于25的最小元素: " + numbers.ceiling(25));  // 30
        
        // 4. 获取子集
        SortedSet<Integer> headSet = numbers.headSet(30);  // 小于30的元素
        System.out.println("小于30的元素: " + headSet);  // [10, 20]
        
        SortedSet<Integer> tailSet = numbers.tailSet(30);  // 大于等于30的元素
        System.out.println("大于等于30的元素: " + tailSet);  // [30, 40, 50]
        
        SortedSet<Integer> subSet = numbers.subSet(20, 40);  // 20 <= x < 40
        System.out.println("20到40之间的元素: " + subSet);  // [20, 30]
        
        // 5. 删除并返回第一个/最后一个元素
        Integer first = numbers.pollFirst();  // 删除并返回10
        Integer last = numbers.pollLast();    // 删除并返回50
    }
}

10.5 三种Set实现类对比总结 📊

特性

HashSet

LinkedHashSet

TreeSet

底层数据结构​

哈希表

哈希表+双向链表

红黑树

元素顺序​

无序

插入顺序

自然排序/比较器排序

性能​

添加/删除/查找:O(1)

添加/删除/查找:接近O(1)

添加/删除/查找:O(log n)

允许null​

✅ 允许1个

✅ 允许1个

❌ 不允许

线程安全​

❌ 不安全

❌ 不安全

❌ 不安全

内存占用​

小

中

大

使用场景​

需要快速查找,不关心顺序

需要保持插入顺序

需要元素排序

10.6 如何选择合适的Set? 🤔

// 场景1:只需要去重,不关心顺序
// 推荐:HashSet
Set<String> quickLookupSet = new HashSet<>();

// 场景2:需要去重,且要保持插入顺序
// 推荐:LinkedHashSet
Set<String> insertionOrderSet = new LinkedHashSet<>();

// 场景3:需要去重,且要自动排序
// 推荐:TreeSet
Set<String> sortedSet = new TreeSet<>();

// 场景4:需要线程安全的Set
// 推荐:Collections.synchronizedSet包装
Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<>());
// 或使用ConcurrentHashMap.newKeySet()(Java 8+)
Set<String> concurrentSet = ConcurrentHashMap.newKeySet();

总结对比

特性

ArrayList

Vector

LinkedList

底层结构

动态数组

动态数组

双向链表

线程安全

不安全

安全

不安全

查询速度

快

快

慢

增删速度

慢

慢

快

内存占用

小

小

大

扩容机制

1.5倍

2倍

不扩容

使用场景

记住选择原则:

  1. ArrayList:适合查询频繁,增删较少的场景

  2. Vector:多线程环境(但推荐使用Collections.synchronizedList或CopyOnWriteArrayList)

  3. LinkedList:适合频繁在头尾增删元素的场景,或用作队列/栈

  4. HashSet:最常用,性能最好,但不保证顺序

  5. LinkedHashSet:需要保持插入顺序时的选择

  6. 要性能 → HashSet

  7. 要顺序 → LinkedHashSet

  8. 要排序 → TreeSet

    • TreeSet:需要元素排序时的选择

calibre QRC提取寄生参数 typical将上面的文件QCI_flow里面的文件 在Cp 到当前 ,其实应该是某几个文件,但是我给忘记了 就全cp过来了 ,无影响,不过也希望大佬指正。 阅读详情

相关推荐

TCN+iTransformer时间序列预测实战:从风电功率预测到源码解析(附完整代码)

本文深入探讨了TCN与iTransformer融合模型在时间序列预测,特别是风电功率预测中的应用。通过解析iTransformer‘倒置’视角的创新架构与TCN强大的局部时序捕捉能力,文章提供了完整的融合方案设计、源码实现及实战调优经验,旨在构建更强大的下一代预测引擎。

weixin_29062671的博客 265

Java6学习笔记34——Java6中集合框架的学习

本文已搬家至【Java学习笔记】集合框架的学习

gnuhpc的专栏 1390

【Clickhouse从入门到精通】第51篇:ClickHouse权限管理体系详解

摘要 本文是ClickHouse权限管理系列文章的第51篇,重点解析ClickHouse RBAC权限体系中的GRANT/REVOKE机制。文章详细介绍了GRANT语句的基础语法与权限类型,包括SELECT、INSERT等常规权限以及WITH GRANT OPTION转授权功能。特别深入讲解了列级权限的实现方式,通过SELECT(col1,col2)语法实现字段粒度的访问控制,并展示了权限查询与验证方法。本文还对比了ClickHouse 20.4版本前后权限管理体系的差异,为构建安全的多租户数据平台提供了关

xyghehehehe的专栏 440

java学习笔记10——集合框架

总结:集合框架概述1.内存层面需要针对于多个数据进行存储。此时,可以考虑的容器有:数组、集合类2.数组存储多个数据方面的特点:> 数组一旦初始化,其长度就是确定的。> 数组中的多个元素是依次紧密排列的,有序的,可重复的> (优点)数组一旦初始化完成,其元素的类型就是确定的。不是此类型的元素,就不能添加到此数组中。arr[0]= 1;//编译报错> (优点)元素的类型既可以是基本数据类型,也可以是引用数据类型数组存储多个数据方面的弊端:> 数组一旦初始化,其长度就不可变了。

qq_58956810的博客 863

国产SR8201F以太网PHY芯片调试避坑指南:从机贴失败到杜邦线救场的实战记录

本文详细介绍了国产SR8201F以太网PHY芯片的调试避坑指南,涵盖硬件设计、PCB布局、SMT贴片及软件驱动等关键环节。通过实战案例解析,帮助工程师解决MII/RMII接口配置、电源设计、信号完整性等典型问题,提升以太网通信稳定性与EMC性能。

c6d7e8f9g的博客 1212

Allegro网表导入报错VOIDs not allowed in parent SHAPE的解决方案

在PCB设计流程中,网表导入是确保电气连接正确传递的关键步骤。其原理是将原理图的逻辑连接关系映射到物理版图的图形数据库中。这一过程的技术价值在于保证设计数据的一致性,避免后续生产中出现电气错误。然而,在Cadence Allegro等EDA工具的实际应用中,数据库内部状态的不一致可能引发操作失败,例如常见的“VOIDs are not allowed in the parent SHAPE”报错。这类问题通常源于多人协作、跨版本操作或频繁编辑后积累的数据结构冗余。针对此场景,核心的解决方法是执行Databa

weixin_30954817的博客 319

Java 集合框架,List,Set,Map学习笔记(自存)

解答:Java是面向对象的语言,所有的代码都必须写在类(class)里面。Java不像Python或C那样可以直接定义一个独立函数,函数(方法)必须属于某个类。是为了创建对象,以便调用containsDuplicate。

Svjs_jkngs的博客 1223

全新DEIM有效涨点改进目录 | 本专栏持续更新500+篇内容 | 包含各种顶会顶刊卷积、注意力、特征融合模块、有效特征聚合提取模块,上采样模块、下采样模块,二次创新模块、独家创新等几百种创新点改进

🚀【CVPR2025DEIM改进专栏速览】🔥 专栏提供500+篇目标检测创新改进方案,涵盖卷积/注意力/特征融合等创新改进点,均源自顶会论文及实战经验。支持多领域应用(工业/医疗/遥感等),配套完整教程和答疑服务。亮点包括: 1️⃣ 持续更新SOTA模型改进方案 2️⃣ 小白友好型实验操作指南 3️⃣ 跨学科科研支持(已助非计算机专业发表论文) 4️⃣ 提供虚拟环境配置方案。 订阅可获完整项目代码及交流群服务,适合研究生科研论文改进需求。价格呈上涨趋势,早订更优惠!

Ai缝合怪、助力小伙伴高效发论文 2040

JAVA基础学习笔记-day11-集合框架

使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。数组在内存存储方面的特点数组初始化以后,长度就确定了。数组中的添加的元素是依次紧密排列的,有序的,可以重复的。数组声明的类型,就决定了进行元素初始化时的类型。不是此类型的变量,就不能添加。可以存储基本数据类型值,也可以存储引用数据类型的变量数组在存储数据方面的弊端数组初始化以后,长度就不可变了,不便于扩展。

天才在左,疯子在右,而我只想做个不折不扣的乐天派 1163

华为OD机考双机位C卷:精准核酸检测 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 精准核酸检测,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 精准核酸检测。

qq_45776114的博客 1727

xilinx原语及bank简介

图8是HP bank与HR bank的IO模块,其中PAD是FPGA的金属管脚,IOB是输入、输出引脚的控制模块。此时使用原语就可以只调用需要的组件,不需要去考虑其余组件参数设置,就方便很多,借助此次机会就对IDDR、ODDR、IDELAYE2、ODELAYE2、IDELAYCRTL、ISERDESE、OSERDESE等几个原语做了简要了解,并对原语的各个模式进行了仿真,本文最初是介绍IDDR的,但在介绍IDDR这些原语之前,还需要了解一下7系列FPGA bank的分类和区别,所以就有了本文。

qq_43416206的博客 412

JAVA学习笔记(十四)——集合框架

PS:Hashset集合默认不能对内容一样的两个不同对象去重复!(因为不同对象的哈希值一般不同),解决办法:重写hashCode和equals方法。经典代码:Map<String, Integer> m = new HashMap<>();PS:如何获取Map集合的Stream流?PS:流只能收集一次!

qq_53911368的博客 650

Microsemi Libero系列教程(全网首发)

关于Libero IDE和Libero SoC Libero分为Libero IDE和Libero SoC,Libero IDE最新版本是v9.2 SP3(2016年4月4日)已经不再更新维护了,而Libero SoC是Libero IDE的升级版,官方推荐的开发工具,文中的Libero指的是Libero SoC。 Libero SoC Libero® SoC是Microsemi(美高森美)官方...

whik1194的博客 2万+

《Java面向对象程序设计》学习笔记——第 13 章 泛型与集合框架

Java 提供了实现常见数据结构的类,这些实现数据结构的类通称为 Java 集合框架。 在 JDK1.5 后, Java 集合框架开始支持泛型,本章首先介绍泛型,然后讲解常见数据结构类的用法。

奇妙方程式的博客 2530

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java集合框架学习笔记

一、什么是集合 存放在java.util.*。是一个存放对象的容器。 存放的是对象的引用,不是对象本身 长度不固定 只能存放对象 二、collection接口 collection的使用 增加元素 add(); 判断是否包含某个元素 contains(); 删除某个元素 remove(); 遍历元素(iterator迭代器) package com.zheng.demo1; import java.util.ArrayList; import java.util.Collection; impo

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 606

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JAVA集合框架 学习笔记

JAVA集合框架 学习笔记

weixin_57407943的博客 152

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JAVA 集合框架学习笔记

集合框架 为什么使用集合框架 Java集合框架包含的内容 集合框架的接口 List接口的实现类 ArrayList集合类 List接口常用方法 LinkedList集合类 迭代器Iterator Set&HashSet HashMap

zhangyufeng0126的博客 1752

学习笔记069——Java集合框架

LinkedList 实现了链表的数据结构,“先进先出”,元素的存储空间是不连续的,随机分散在内存中的,元素和元素之间通过存储彼此的位置信息来形成连接关系,通过位置信息找到前后节点的关系。ArrayList 实现了长度可变的数组,可以在内存中分配连续的空间,底层是基于索引的数据结构,所以查询效率很高,缺点是添加或删除数据效率较低,需要完成元素的移动。优势是增删效率高,缺点是查询效率低,与 ArrayList 形成对比,它们的特性都是由于底层的存储结构决定的。

code__bee的博客 1294

Java集合框架个人学习笔记

从网上粘贴的结构图 Collection ├List │├LinkedList │├ArrayList │└Vector(了解,已过时) │ └Stack └Set Map ├Hashtable(了解,已过时) ├HashMap ├ConcurrentHashMap └WeakHashMap collection接口是集合的根接口,list和set都继承...

weixin_34378922的博客 105

java 集合框架学习_java的集合框架学习笔记

数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法。 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework)。 Java程...

weixin_29513805的博客 150

java中集合框架学习笔记

集合 数组定义的时候就指定了类型 1、add的方法的参数类型 是object,以便于接受任意类型对象2、集合中存储的都是对象的引用(地址) import java.util.*; class CollectionDemo { public static void main(String[] args) { ArrayList al = new Arraylist()...

weixin_43857959的博客 267

java学习笔记集合框架概述及List集合

------- android培训、java培训、期待与您交流! ---------- 一、集合框架概述 集合类(集合框架) 对象多了用集合存,数据多了用对象存。 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。 数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但

u013111003的博客 569

java集合框架学习笔记 了解java集合简单算法

上几篇我们从java集合框架的根目录出发,介绍了关于java集合的整体脉络,以便我们更加熟练地使用java集合框架,今天,我们将简单介绍java集合所运用到的算法如排序,查找,批操作等一些常用且十分简单的算法。 接口实现分离的设计不仅受益于层次分明,也体现在接口编程上。对于我们所要实现的算法,只实现一次便可通用于整个集合框架,最大可能地减少代码量、测试量及错误率。

我的头发呢? 293

【学习笔记】Java 集合框架

文章目录Java 集合框架ArrayList成员变量构造函数grow 方法add 方法remove 方法遍历时删除Vector成员变量构造函数扩容方法add 方法remove方法set方法IteratorStackLinkedList成员变量构造函数add 方法remove方法set方法get方法迭代器HashMap成员变量链表结点构造函数扩容机制hash 函数put 方法get方法红黑树LinkedHashMapEntry结点成员变量构造函数put和remove方法维护双向链表的方法get方法HashSe

码海畅游记录 231

Java学习笔记之集合框架1

集合框架

leezhiyuan的专栏 469

Java集合体系框架学习笔记

无序性不等于随机性无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。不可重复性是指添加的元素时,不仅仅equals还要hashCode同时相等才相等。以value形式存储 以key-value形式存在List接口 Queue接口 Set接口有序可重复 有序可重复 无序不重复 key无序无重复 value无序可重复CollectionKey-ValueOrdering键值对有序可重复随机读取允许存null线程安全ArrayList❌。

张紫娃的博客 701
上一篇: JavaSE-抽象类和接口详解
下一篇: Java异常处理全解析:从基础到高级实战
StackNoOverflow
博客等级 码龄1年 22粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值