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. Install MySQL wsl1

    To install MySQL on WSL (ie. Ubuntu) env Ubuntu 22.04.1 LTS mysql Ver 8.0.32-0ubuntu0.22.04.2 for Li ...

  2. OCR接口

    OCR基础框 import pytesseract from PIL import Image img = Image.open('实际数据1.jpeg') #具体位置截图 image1 = Imag ...

  3. pip python的包成功,但是import的时候报错

    今天,一位同学线上反馈import python包失败了,同时附带两张图: 图1.报错代码 图2.报错提示 结合上面两个图片,我们发现这个同学import全部失败,初步怀疑该同学的本地环境上没有num ...

  4. django admin 字段设置

    来源:http://xieboke.net/article/100/ django admin 后台里有些输入框长度.宽度.提示语等,可能不满足我们的需求,这个时候,我们就需要对 admin 的样式进 ...

  5. @JsonFormat

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8" 不管是前端传后台,还是后台传前端, ...

  6. 攻防世界-fileclude

    攻防世界的一道文件包含题目 include("文件名"):会将文件中的内容视为代码块接入include所在代码中,输出的只是执行后的结果,文件中的注释.定义等无法查看. 本题中可以 ...

  7. BIP弹框内容显示的隐藏

    viewModel.on("customInit", function (data) {         // 关闭或取消关原因详情--页面初始化         viewMode ...

  8. jmeter取样器之KafkaProducerSampler(往kafka插入数据)

    项目背景 性能测试场景中有一个业务场景的数据抽取策略是直接使用kafka队列,该场景需要准备的测试数据是kafka队列里的数据,故需要实现插入数据到kafka队列,且需要实现控制每分钟插入多少条数据. ...

  9. 金蝶K3无法查看关联信息

    场景: 某个用户点击采购订单界面--关联信息,界面显示正在加载,但是无法显示所有关联单据. 步骤: 1. 在其他电脑登录存在同样问题. 2. 其他模块可以正常显示 3. 删除该用户t_UserProf ...

  10. SAP日志表 CDHDR和CDPOS

    1. 标准日志表CDHDR 和 CDPOS OBJECTCLAS = 'INFOSATZ' 信息记录 OBJECTCLAS = 'BANF' 采购申请 OBJECTCLAS = 'EINKBELEG' ...