观前提醒:本文内容多为入门时的学习笔记,笔记内容有些混乱!!!

| | | |

| | | |

| | | |

泛型只能是引用类型,不能是基本类型。

如果希望集合中存储的是基本类型数据,需要基本类型对应的“包装类”,如下:

基本类型        包装类(都位于java.lang包中)
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean // 自动装箱:基本类型 --> 包装类型 例如:int --> Integer
// 自动拆箱:包装类型 --> 基本类型 例如:Integer --> int

List

List接口不但继承了Collection接口的全部方法,还增加了一些根据元素【索引】进行操作的特有方法,如下:

  • public void add(int index, E element):将指定元素添加到集合的指定位置
  • public E get(int index):获取指定位置的元素值
  • public E remove(int index):删除指定位置的元素值,返回被移除元素
  • public E set(int index, E element):用指定元素替换指定位置的元素,返回指定位置的修改之前的元素

ArrayList

每个 ArrayList 实例都有一个容量,随着向 ArrayList 中不断添加元素,其容量也自动增长。

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; public class Main {
public static void main(String[] args) {
ArrayList<Integer> arr = new ArrayList<>(); // 定义一个空列表
ArrayList<Character> arr_char = new ArrayList<>(5); // 使用指定的初始容量构造一个空列表
System.out.println(arr_char.size()); // 0 返回集合中元素的个数,虽然arr_char容量为5,但是还没有元素 arr.add(0);
System.out.println(arr); // [0] Collection<Integer> coll = new ArrayList<>();
Collections.addAll(coll, 1,2,3,4);
arr.addAll(coll);
System.out.println(arr); // [0, 1, 2, 3, 4] arr.add(3, -1); // 在索引3的位置上插入元素10
System.out.println(arr); // [0, 1, 2, -1, 3, 4] arr.addAll(0, coll); // 在0位置上插入coll中的元素
System.out.println(arr); // [1, 2, 3, 4, 0, 1, 2, -1, 3, 4] System.out.println(arr.indexOf(-1)); // 7 返回-1元素的索引值
System.out.println(arr.get(7)); // -1 获取索引7对应的元素值
System.out.println(arr.set(7, 1)); // -1 将-1这个元素修改为1,并返回修改之前的元素
System.out.println(arr); // [1, 2, 3, 4, 0, 1, 2, 1, 3, 4] System.out.println(arr.remove(7)); // 1 删除索引7对应的元素,并返回该元素
System.out.println(arr); // [1, 2, 3, 4, 0, 1, 2, 3, 4]
System.out.println(arr.subList(3, 6)); // [4, 0, 1] 截取索引在[3, 6)之间的元素,返回值是List<E> arr.sort((o1, o2) -> o1 - o2); // 升序排列 无论升序还是降序都需要传入Comparator实现类的实例
System.out.println(arr); // [0, 1, 1, 2, 2, 3, 3, 4, 4]
arr.sort((o1, o2) -> o2 - o1); // 降序排列
System.out.println(arr); // [4, 4, 3, 3, 2, 2, 1, 1, 0] System.out.println(arr.contains(0)); // true 集合中包含元素0,返回true
System.out.println(arr.containsAll(coll)); // true 如果该集合包含指定集合中的所有元素,则返回true
System.out.println(arr.removeAll(coll)); // true 删除arr中所有包含在coll中的元素
System.out.println(arr); // [0] System.out.println(arr.isEmpty()); // false 判空 ArrayList arr2 = (ArrayList<Integer>)arr.clone(); // 拷贝,返回值是一个Object实例,可进行向下转型
System.out.println(arr == arr2); // false
arr2.clear(); // 将集合中元素清空
System.out.println(arr); // [0]
System.out.println(arr2); // []
}
}

LinkedList

LinkedList集合的特点:

  1. 底层是一个【链表】结构:查询慢,增删快
  2. 里边包含了大量操作首尾元素的方法

下面代码介绍几个LinkedList特有方法,其他List和Collection接口定义的一些共性方法不在介绍:

import java.util.LinkedList;

public class Main {
public static void main(String[] args) {
/* LinkedList中特有的一些重用方法:
- public void addFirst(E e):将指定元素插入此列表的开头。
- public void addLast(E e):将指定元素添加到此列表的结尾。
- public void push(E e):将元素推入此列表所表示的堆栈。 - public E getFirst():返回此列表的第一个元素。
- public E getLast():返回此列表的最后一个元素。 - public E removeFirst():移除并返回此列表的第一个元素。
- public E removeLast():移除并返回此列表的最后一个元素。
- public E pop():从此列表所表示的堆栈处弹出一个元素。 - public boolean isEmpty():如果列表不包含元素,则返回true。
*/
//创建LinkedList集合对象
LinkedList<String> linked = new LinkedList<>();
//使用add方法往集合中添加元素
linked.add("a");
linked.add("b");
linked.add("c");
System.out.println(linked); //[a, b, c] // addFirst()等价于push()
linked.addFirst("www1");
System.out.println(linked); // [www1, a, b, c]
linked.push("www2");
System.out.println(linked); // [www2, www1, a, b, c] // 将指定元素添加到此列表的结尾。此方法等效于add()
linked.addLast("com");
System.out.println(linked); // [www2, www1, a, b, c, com] if(!linked.isEmpty()){ // 判空
String first = linked.getFirst(); // 获取表头元素
System.out.println(first); // www2
String last = linked.getLast(); // 获取表尾元素
System.out.println(last); // com
System.out.println(linked); // [www2, www1, a, b, c, com]
} String first = linked.pop(); // 弹出第一个元素,相当于removeFirst()
System.out.println("被移除的第一个元素:"+first); // 被移除的第一个元素:www2
String last = linked.removeLast();
System.out.println("被移除的最后一个元素:"+last); // 被移除的最后一个元素:com
System.out.println(linked); // [www1, a, b, c]
linked.removeFirst();
System.out.println(linked); // [a, b, c] linked.add(2, "bc"); // 可以使用索引
System.out.println(linked); // [a, b, bc, c]
System.out.println(linked.get(2)); // bc 通过索引获取元素
}
}

Set

Set集合特点:

  1. 不允许重复的元素
  2. 没有索引,不能使用带索引的方法

HashSet和LinkedHashSet

HashSet是Set接口的一个实现类,LinkedHashSet也是Set接口的一个实现类,同时还是HashSet的子类。

HashSet的常用方法:

public boolean add(E e)
public boolean remove(Object o)
public void clear()
public boolean contains(Object o)
public boolean isEmpty()
public boolean isEmpty()
// 以上方法不再介绍
import java.util.*;

public class Main {
public static void main(String[] args) {
/*
java.util.HashSet 是 Set接口 的一个实现类
特点:
1. 无序集合,存储顺序和取出顺序可能不一致
2. 底层是一个哈希表,查询速度非常快
*/
Set<Integer> set1 = new HashSet<>();
set1.add(1); set1.add(3); set1.add(2); set1.add(1);
System.out.println(set1); // [1, 2, 3] // 遍历方式:
Iterator<Integer> it = set1.iterator(); // 返回该集合中所有元素的迭代器
while (it.hasNext()){ // hasNext()判断是否还有下一个元素
System.out.println(it.next()); // next()获取下一个元素
} // 1 2 3 // 使用foreach语句遍历集合
for (int x : set1)
System.out.println(x); // 1 2 3 // =============================================================== /*
java.util.LinkedHashSet是HashSet的一个子类
底层结构是【哈希表+链表】,链表用来记录元素添加顺序,可以实现顺序存储
*/
Set<Integer> set3 = new LinkedHashSet<>();
set3.add(1); set3.add(3); set3.add(2); set3.add(1);
System.out.println(set3); // [1, 3, 2]
}
}

哈希表图解

Set集合中元素不重复的原理

『Java』List Set的更多相关文章

  1. 『Java』Collection接口 Collections类

    接口Collection public interface Collection<E>定义了所有单列集合中共性的方法,所有的单列集合都可以使用共性方法. Collection的常用子接口有 ...

  2. 『Java』成员内部类 匿名内部类

    成员内部类 成员方法类是定义在一个类中的方法外的类,例如: public class Outer{ // 外部类 class Inner { // 内部类 // 内部类成员 } // 外部类成员 } ...

  3. 『Java』接口的使用方法

    以下三个文件存在于同一个包下: 定义接口Dome_Interface.java: package cn.xxmmqg.Interface; // 接口不能直接使用,必须有一个"实现类&quo ...

  4. 『Java』StringBuilder类使用方法

    String类存在的问题 String类的底层是一个被final修饰的byte[],不能改变. 为了解决以上问题,可以使用java.lang.StringBuilder类. StringBuilder ...

  5. 『Java』String类使用方法

    Java中的字符串 java.lang.String类表示字符串类,Java程序中所有字符串文字都可以看作实现该类的实例. 特点: 字符串不可变:字符串的值在创建后不能在发生改变 public cla ...

  6. 『Java』数组

    在学习数组之前先学习java.util.Arrays类中的一个静态方法Arrays.toString(). 该方法可以将传入的数组格式化为一个字符串,便于我们查看数组内容,例如: import jav ...

  7. 2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算

    2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算 经过第一阶段的学习,同学们已经熟悉了这门语言基本的用法.在一次又一次对着电脑编写并提交代码,进行练习的时候,有没有觉 ...

  8. 2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目

    2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目 结合本课程时间安排,以及同学们的专业和课程内容,制定了以下六个题目供各小组选择.如有其他项目方案设想,可自行与老师沟通.老 ...

  9. 2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周

    2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周 博客要求 组内同学需各自发表博客 博客中需包含以下内容: 相关过程截图 关键代码解释 遇到的困难及解决 ...

随机推荐

  1. SpringBoot Cache 深入

    这上一篇文章中我们熟悉了SpringBoot Cache的基本使用,接下来我们看下它的执行流程 CacheAutoConfiguration 自动装配类 根据图中标注,看到它引用了CachingCon ...

  2. css实现相框效果

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...

  3. Blazor 组件入门指南

    翻译自 Waqas Anwar 2021年3月19日的文章 <A Beginner's Guide to Blazor Components> [1] Blazor 应用程序是组件的组合, ...

  4. Redisson 分布式锁源码 09:RedLock 红锁的故事

    前言 RedLock 红锁,是分布式锁中必须要了解的一个概念. 所以本文会先介绍什么是 RedLock,当大家对 RedLock 有一个基本的了解.然后再看 Redisson 中是如何实现 RedLo ...

  5. [心得体会]jvm

    1. jvm基本架构图 橙色: 线程共享的, gc主要的场所 灰色: 线程不共享 2. 类加载器 启动类加载器(c++加载器) 扩展类加载器(java应用程序加载器) 应用加载器(加载classpat ...

  6. fail-fast 与 fail-safe

    fail-fast: fail-fast(快速失败),是Java集合的一种错误检测机制.当在遍历集合的过程中该集合在结构(改变集合大小)上发生变化时候,有可能发生fail-fast(快速失败行为不能得 ...

  7. 基于redis的分布式锁防止高并发重复请求

    需求: 我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统)(1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致.(2)A渠道系统再调用外部厂商C系统.(3)A ...

  8. buu 刮开有奖

    一.查壳, 二.拖入ida,分析 直接搜字符串完全没头绪,在看了大佬的wp才找到了,关键函数. 明显那个String就是我们要求的flag,要开始分析程序. 字符串长度为8,同时这个函数对字符串进行了 ...

  9. Java | 变量 & 常量

    变量 Java是一种强类型语言,每个变量都必须声明其数据类型,变量本质上就是代表一个"可操作的存储的空间",在定义之后空间位置是确定的,但是里面放置什么值是不确定的,我们操作的时候 ...

  10. 从代码生成说起,带你深入理解 mybatis generator 源码

    枯燥的任务 这一切都要从多年前说起. 那时候刚入职一家新公司,项目经理给我分配了一个比较简单的工作,为所有的数据库字段整理一张元数据表. 因为很多接手的项目文档都不全,所以需要统一整理一份基本的字典表 ...