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. ZIAO日报 202302

    2023.2 2023年2月14日 10:23 2023.2.14 继续读<Multi-View Transformer for 3D Visual Grounding>,读到了relat ...

  2. Mysql 系统参数查看

    1.查看数据库版本 select version(); 2.查看是否支持分区 show variables like '%partition%';show plugins;

  3. etcd 入门

    服务注册与服务发现 三部分的作用: 注册中心:记录服务和服务地址的映射关系 服务提供者:将服务注册到服务中心 服务发现者:对服务中心的服务进行调用 简单易懂的 raft 算法 Raft算法是一个一致性 ...

  4. 【rocky linux】firewalld切换到iptables 以及Failed to start IPv4 firewall with iptables.

    关闭[firewalld],安装iptables并启动 #关闭自带 firewall systemctl stop firewalld systemctl mask firewalld#显示当前 fi ...

  5. vue项目打包后,自由修改配置如接口地址等

    背景描述: 项目打包后,如果想更换接口域名或者项目名称,就需要再次打包.但是这样子操作有点耗费时间.如果把这些配置写到一个文件中,然后在index.html文件中引入使用,这样子会大大提高工资效率,节 ...

  6. 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的互转

    /**火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的互转  * Created by macremote on 16/5/3.  */ function GPSUtil (){   v ...

  7. 生成19位long型唯一数字id

    /** * 生成19位long型唯一数字id * @return */ public static long GetLong19UUID() { // String nanoRandom = Syst ...

  8. 关闭内核Debug_log打印!

    echo 0 > /proc/sys/kernel/printk  \r

  9. sed 命令添加字符串

    指定行替换字符串: sed '1,$ s/you/she/g' a.txt :(对源文件添加的话就用-i参数)-i参数是对源文件进行修改: 1 i 在第一行前面添加: 2 i 在第二行前面添加: $a ...

  10. git log 查看修改历史

    git log 后面可以跟文件名,表示查看对应文件的修改记录 git log --pretty=oneline --format="%h:%ad:%an:%s" -5 git lo ...