Collection 接口

宏观图

快速使用

import java.util.*;

public class Demo {
public static void main(String[] args) throws Exception{
Collection collection = new ArrayList();
// 添加
collection.add("小明");
collection.add("小红");
collection.add("小红"); // 遍历:使用增强for
for (Object obj: collection) {
String str = obj.toString();
System.out.println(str);
} // 遍历:使用迭代器
Iterator iter = collection.iterator();
while (iter.hasNext()){
String str = iter.next().toString();
System.out.println(str);
} // 删除
collection.remove("小红"); // 其它
System.out.println(collection.size()); // 2
}
}

常用方法

boolean add(Object obj) 添加一个对象
boolean addAll(Collection o) 将一个集合中的所有对象添加到此集合
int size() 返回该集合的长度
void clear() 清空此集合的所以对象
boolean remove(Object obj) 移除集合中的 obj 对象
boolean removeAll(c) 移除此集合中,c中包含的元素
boolean retainAll(c) 移除此集合中,c没有包含的元素(交集)
boolean contains(Object obj) 该集合是否存再 obj 这个对象
boolean equals(Object obj) 该集合是否与obj集合相等
boolean isEmpty() 该集合是否为空
Object[] toArray() 将此集合转换成数组
Iterator iterator() 迭代器

List 接口

List 接口继承了 Collection 接口。

有序,有索引,可重复。

快速使用

import java.util.*;

public class Demo {
public static void main(String[] args) throws Exception{
List list= new ArrayList();
// 可根据索引添加
list.add("two");
list.add(0,"one");
list.add("three"); // 可根据索引删除
list.remove(2); // 根据取值
System.out.println(list.get(0)); // one
System.out.println(list.get(1)); // two // 重新赋值
list.set(0, "first");
list.set(1, "second"); // 生成子列表
List subList = list.subList(0, list.size());
System.out.println(subList); // [first, second] // 遍历: 因为列表有索引,可以使用普通的for
for (int i = 0; i < list.size(); i++) {
String arg = list.get(i).toString();
} // 遍历: 使用列表迭代器
ListIterator iter = list.listIterator();
while (iter.hasNext()){
String arg = iter.next().toString();
}
}
}

常用方法

继承方法,请看 Collection。

add(int index, Object e) 根据索引添加元素
get(int index) 根据索引取元素
set(int index, Object e) 根据索引重新赋值
remove(int index) 根据索引删除元素
indexOf(Object e) 获取该元素的索引
subList(int fromIndex, int toIndex) 根据范围,取该列表的元素,重新生成的新的列表
listIterator() 列表生成器

List 实现类

下面三个类,都采用 List 接口实现。Vector 开发中在基本不再使用。

Set 接口

Set 接口继承了 Collection 接口。并没有添加的新的方法。

无序,无索引,自动去重。

快速使用

package com.demo.study3;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; public class Demo {
public static void main(String[] args){
// 由于接口,只能调用实现类
Set<String> student = new HashSet<>(); // 添加元素
student.add("小明");
student.add("小红");
student.add("小明");
student.add("小军");
System.out.println(student); // [小明, 小军, 小红] // 删除元素
student.remove("小军"); // 遍历 1. 增强for
for (String name:
student) {
System.out.println(name);
}
// 遍历 2. 生成器
Iterator iterator = student.iterator();
while (iterator.hasNext()){
System.out.println("iter: " + iterator.next());
} // 其它
System.out.println(student.size()); // 数量
System.out.println(student.contains("小明")); // 是否存在
student.clear(); // 清空
}
}

Set 实现类

HashSet 存储过程

过程

  1. 根据 hasCode 计算保存位置,如果此位置为空直接保存,不为空看步骤2
  2. 再执行 equals 方法,如果 equals 方法为 true 则去重,否则形成链表并保存

实例

我们添加了三个Person对象,两个是相同的数据,结果没有去重。

package com.demo.study4;

import java.util.HashSet;
import java.util.Objects; public class Demo {
public static void main(String[] args) {
HashSet set = new HashSet();
// 实例化对象
Person p1 = new Person("小明", 18);
Person p2 = new Person("小智", 35);
Person p3 = new Person("小智", 35);
// 添加对象
set.add(p1);
set.add(p2);
set.add(p3);
// 输出个数
System.out.println(set.size()); // 3
}
}

那如果去重呢,那就是 Person 类进行重写 hasCode,equals 方法。

package com.demo.study4;

import java.util.HashSet;
import java.util.Objects; public class Demo {
public static void main(String[] args) {
HashSet set = new HashSet();
// 实例化对象
Person p1 = new Person("小明", 18);
Person p2 = new Person("小智", 35);
Person p3 = new Person("小智", 35);
// 添加对象
set.add(p1);
set.add(p2);
set.add(p3);
// 输出个数
System.out.println(set.size()); // 3
}
} class Person{
String name;
int age;
// 构造方法
Person(String name, int age){
this.name = name;
this.age = age;
}
// 重写 equals 方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
// 重写 hasCode 方法
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}

TreeSet

快速使用

你需要使用接口(comparable)进行定义比较规则,也可以先定义这样就不需要使用借口了。String 内部已实现无需使用接口。

import java.util.TreeSet;

public class Demo {
public static void main(String[] args) {
// 创建 TreeSet 对象
TreeSet<Student> treeSet = new TreeSet<>();
// 创建 Student 对象
Student student1 = new Student("kidd", 16);
Student student2 = new Student("tom", 20);
Student student3 = new Student("kidd", 18);
Student student4 = new Student("kidd", 18);
// 将 Student 对象添加到 TreeSet 集合当中
treeSet.add(student1);
treeSet.add(student2);
treeSet.add(student3);
treeSet.add(student4); System.out.println(treeSet.toString()); // [Student{name='kidd', age=16}, Student{name='kidd', age=18}, Student{name='tom', age=20}]
}
} class Student implements Comparable<Student>{
// 定义属性
String name;
int age; // 构造方法
public Student(String name, int age){
this.name = name;
this.age = age;
} // Object 的 toString 方法重写
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} // 使用Comparable接口的compareTo进行该如何比较。
@Override
public int compareTo(Student o) {
int i1 = this.name.compareTo(o.name);
int i2 = this.age - o.age;
return i1==0 ? i2:i1;
}
}

Java Collection体系的更多相关文章

  1. Java Collection Framework概述

    文章出自:听云博客 Collection概述 Java collection是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等. Java集合主要可以划分为4个部分:Li ...

  2. Java 技术体系图

    Java 程序员 高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变 参数.可变返回类型.增强循环.静态导入 核心编程 IO.多线程.实体类. 集合类.正则表达式. XML 和属性文件 图形编 ...

  3. Java collection 容器

    http://www.codeceo.com/article/java-container-brief-introduction.html Java实用类库提供了一套相当完整的容器来帮助我们解决很多具 ...

  4. 一点一点看JDK源码(一)Collection体系概览

    一点一点看JDK源码(一)Collection体系概览 liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 Collection为集 ...

  5. Java Collection开发技巧

    Java Collection(集合) 集合中的一些技巧: 通过Collections类的静态方法,可以对集合进行一些操作 1 java.util.List<Integer> number ...

  6. Java技术体系图

    Java程序员高级特性              反射.泛型.注释符.自动装箱和拆箱.枚举类.可变              参数.可变返回类型.增强循环.静态导入        核心编程       ...

  7. Java知识体系

    Java知识体系 java知识结构.jpg web框架.jpg 计算机课程体系.png 2016-08-19_090929.png 流行的哈希算法生存状况.jpg "JAVA之父" ...

  8. Java Collection好文章

    Java Collection好文章 http://my.oschina.net/xiaomaoandhong/blog/78394

  9. JAVA基础知识之IO——Java IO体系及常用类

    Java IO体系 个人觉得可以用"字节流操作类和字符流操作类组成了Java IO体系"来高度概括Java IO体系. 借用几张网络图片来说明(图片来自 http://blog.c ...

  10. JAVA技术体系发展路线

    JAVA技术体系 1.1 Java程序员 ·高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变参数.可变返回类型.增强循环.静态导入 ·核心编程 IO.多线程.实体类.集合类.正则表达式.XM ...

随机推荐

  1. typora文件中不显示公式

    行内公式在typora中不显示 解决办法 打开typora--文件(F)--偏好设置--markdown--内联公式--打勾选中 若改后没有反应,关闭重新打开.

  2. ChatGPT 爆火!真有那么神?设计师会失业吗?

    人工智能来了,咱们是不是都要失业了呢? 一款AI产品,在科技市场和资本市场掀起了一阵风暴. 一切的源头,来自一个由美国人工智能公司OpenAI开发的一种大型语言模型ChatGPT.它采用了Transf ...

  3. 成品直播源码,Flutter 夜间模式 全局字体

    成品直播源码,Flutter 夜间模式 全局字体 import 'package:flutter/material.dart';import 'package:flutter_widget/route ...

  4. Vue 双向绑定

    devtools工具 使用devtools工具可以让你更加方便的查看到Vue实例中数据的变化. 在chorme商店搜索安装即可. 双向绑定 v-model 双向绑定一般都是与input家族进行绑定. ...

  5. 监控可视化nagios xi

    官网下载 https://www.nagios.com/downloads/nagios-xi/linux/ 也可以手动下载解压并安装 cd /tmp wget https://assets.nagi ...

  6. 关于右值 std::move

    今天发现一个情况,对容器map 进行 std::move 之后,原map被清空了.     map<int, int> tmp;     tmp[1] = 1;     tmp[2] = ...

  7. 处理GET和POST的中文乱码问题

    一.doGet 1.先获取iso的错误字符串 2.回退.重编(用UTF-8) String name = request.getParameter("username"); byt ...

  8. SDIO接口WIFI&BT之相关常备知识

    SDIO接口WIFI&BT之相关常备知识 <VBAT>:>Main Power Voltage Soure Input      主电源输入(SDIO WIFI目前知道的都是 ...

  9. redis-RedisTemplate.opsForValue 常用方法

    16.multiSetIfAbsent(Map<? extends K,? extends V> map) 如果对应的map集合名称不存在,则添加,如果存在则不做修改. Map value ...

  10. Filter Pattern 2 (dubbo的实现方式)

    前一篇FilterPattern的范式,基本和Tomcat实现的filter chain是一样的: 这里介绍一下我看完dubbo关于Filter Pattern的实现思路,自己抽象出来的代码,以及理解 ...