Java之集合
前言:
在写程序当中,集合会经常使用,今天听了马老师的课,写一些自己的总结
正文:
集合最重要的就是一个图,一个类,三个知识点,六个接口
说到图就是上面的图,这个图可以帮我们理解这些接口的继承关系
1.容器 API
Collection接口
定义了存取一组对象的方法,其子接口Set和List分别定义了储存方式:
- Set中的对象没有顺序可以重复
- List的对象有顺序不可重复
Collection接口定义的方法(一个一个往里面存)(可以在API中查到,在这就不一一阐述了,仅仅列举一些)
import java.util.*;; public class TestCollection{
int i;
public TestCollection(int i) {
this.i=i; }
public static void main(String[] args) {
Collection c=new ArrayList();
c.add("hello");
c.add(new Integer(1));
System.out.println(c.size());
System.out.println(c);
} }
输出:
2
[hello, 1]
问题1:为什么在代码中加高亮的区域用Collection c=new ArrayList();而不用ArrayList c=new ArrayList();
答案:使用Collection接口就不会调用ArrayList的专用方法,这在以后如果想把ArrayList改成别的就会非常灵活
容器类对象调用remove和contains方法时,会调用equals和hashCode方法,对于自定义的类型要重写equals和hashCode方法以实现自定义对象的相等规则
注意:相等的对象有相等的hashCode
增加equals和hashCode方法方法如下(我在ADhero类中重写上面两种方法,在TestCollection中调用)
public class ADHero {
String name;
public ADHero(String name) {
this.name=name;
}
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if(obj instanceof ADHero) {
ADHero a=(ADHero) obj;
return(name.equals(a.name));
}
return(super.equals(obj));
}
public int hashCode() {
return name.hashCode();//直接让字符串来实现hashCode方法,因为字符串已经重写了hashCode方法
}
}
TestCollection类中的方法
import java.util.*;; public class TestCollection {
public static void main(String[] args) {
System.out.println(new ADHero("奥巴马").equals(new ADHero("奥巴马")));
} }
输出为:true
Iterator接口
所有实现Collection接口的容器类,都有一个iterator方法用以返回实现了Tterator接口的对象
Iterator对象称为迭代器,用以方便的对容器内的元素遍历操作
Iterator接口定义了如下方法
boolean hasNext(); //判断游标右边是否有元素
Object next(); //返回 游标右边的元素,并把游标移动到下一个位置
void remove;
Iterator方法举例
import java.util.*;;
public class TestCollection {
public static void main(String[] args) {
Collection c = new HashSet();
c.add(new ADHero("德莱文"));
c.add(new ADHero("奥巴马"));
c.add(new ADHero("迅捷斥侯"));
c.add(new ADHero("探险家"));
Iterator i = c.iterator();
while (i.hasNext()) {
ADHero adc = (ADHero) i.next();
System.out.println(adc.name);
} } }
输出
迅捷斥侯
奥巴马
探险家
德莱文
Iterator对象的remove方法是在迭代过程中删除元素的唯一方式
代码如下所示
ADHero类
public class ADHero {
String name; public ADHero(String name) {
this.name = name;
} public String getName() { //遇到输出的不是名字,而是id而重写的方法
return this.name = name;
} public String toString() {
return this.name = name;
} public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (obj instanceof ADHero) {
ADHero a = (ADHero) obj;
return (name.equals(a.name));
}
return (super.equals(obj));
} public int hashCode() {
return name.hashCode();
}
}
TestCollection 类
import java.util.*;; public class TestCollection {
public static void main(String[] args) {
Collection c = new HashSet();
c.add(new ADHero("德莱文"));
c.add(new ADHero("奥巴马"));
c.add(new ADHero("迅捷斥侯"));
c.add(new ADHero("探险家"));
for (Iterator i = c.iterator(); i.hasNext();) {
ADHero adc = (ADHero) i.next();
if (adc.getName().length() >3 ) {
i.remove(); } } System.out.println(c); } }
Set接口
Set接口是Collection的子接口, Set接口没有提供额外的方法,但实现Set接口的容器类的元素是没有顺序且不能重复, Set接口提供的容器类有hashSet和treeSet
Set接口方法举例1
import java.util.*;; public class TestCollection {
public static void main(String[] args) {
Set s=new HashSet();
s.add(new ADHero("奥巴马"));
s.add(new ADHero("皮城女警"));
s.add(new ADHero("暴走萝莉"));
s.add(new ADHero("暴走萝莉"));//相同元素不会被加入
s.add(new ADHero("皮城女警"));//相同元素不会被加入
System.out.println(s);
}
}
输出:
皮城女警, 奥巴马, 暴走萝莉]
Set接口方法举例2
import java.util.*;; public class TestCollection {
public static void main(String[] args) {
Set s1=new HashSet();
Set s2=new HashSet();
s1.add(new ADHero("奥巴马"));
s1.add(new ADHero("皮城女警"));
s1.add(new ADHero("暴走萝莉"));
s2.add(new ADHero("奥巴马"));
s2.add(new ADHero("皮城女警"));
s2.add(new ADHero("赏金猎人"));
Set s3=new HashSet(s1);
s3.retainAll(s2);
System.out.println(s3);
Set s4=new HashSet();
s4.addAll(s2);
System.out.println(s4);
}
}
输出:
[皮城女警, 奥巴马]
[赏金猎人, 皮城女警, 奥巴马]
List接口
List接口是Collection的子接口,实现List接口的容器类元素是有顺序的,而且可以重复
List容器中的元素都对应一个整数型的序号记载其在容器内的位置,可以根据序号存取容器内的元素
List容器类有LinkLIst和ArrayList
List接口的方法及其方法的类型
代码如下
import java.util.*;; public class TestCollection {
public static void main(String[] args) {
List l1 = new LinkedList();
for (int i = 0; i <= 9; i++) {
l1.add("a" + i);
}
System.out.println(l1);
// 把2位置的元素设置成a100
l1.set(2, "a100");
System.out.println(l1);
// 得到3位置上的元素
System.out.println(l1.get(3));
// 得到a6的位置
System.out.println(l1.indexOf("a6"));
// 删掉3位置上的元素
l1.remove(3);
System.out.println(l1);
}
}
输出
[a0, a1, a2, a3, a4, a5, a6, a7, a8, a9]
[a0, a1, a100, a3, a4, a5, a6, a7, a8, a9]
a3
6
[a0, a1, a100, a4, a5, a6, a7, a8, a9]
List常用的算法
类java.util.Collection提供一些静态方法实现基于List容器的方法
代码:
import java.util.*;; public class TestCollection {
public static void main(String[] args) {
List l1 = new LinkedList();
for (int i = 0; i <= 9; i++) {
l1.add("a" + i);
}
// 随机排序
Collections.shuffle(l1);
System.out.println(l1);
// 逆序
Collections.reverse(l1);
System.out.println(l1);
// 排序
Collections.sort(l1);
System.out.println(l1);
// 使用二分法查找
System.out.println(Collections.binarySearch(l1, "a5"));
}
}
输出:
[a2, a1, a3, a6, a0, a7, a5, a9, a8, a4]
[a4, a8, a9, a5, a7, a0, a6, a3, a1, a2]
[a0, a1, a2, a3, a4, a5, a6, a7, a8, a9]
5
Comparble接口
问题:上面的排序中什么确定容器中的“大小”顺序?
所有可以实现排序的类都可以实现java.lang.Comparable接口,此接口中只有一个方法
public void compareTo(Object obj){}
该方法返回值
- 返回 0 表示this=obj
- 返回正数 表示this>obj
- 返回负数 表示this<obj
实现了Comparable接口通过实现compareTo方法从而确定该类对象的排序方式
Map接口定义了储存键(key)-值(value)对的方法(一对一对往里面存)
如何选择数据结构
衡量的标准;读的效率和写的效率
Array读快写满
Linked改快读慢
Hash两者之间
Map接口
实现Map接口的类用来储存键-值对
Map接口的实现类有HashMap和TreeMap
Map接口中储存的键-值对有键来标识,所以键不能重复
下面是Map接口的部分方法,具体作用可以查找API文档
代码小练习
public class TestCollection {
public static void main(String[] args) {
Map<String, Integer> m1 = new HashMap<String, Integer>();
Map<String, Integer> m2 = new TreeMap<String, Integer>();
m1.put("one", 1);
m1.put("two", 2);
m1.put("three", 3);
m2.put("a", 4);
m2.put("b", 5);
// 数量
System.out.println(m1.size());
System.out.println(m2.size());
if (m1.containsKey("two")) {
int i = m1.get("two");
System.out.println(i);
}
// m1除掉key值为one的值
System.out.println(m1.remove("one"));
Map m3 = new HashMap(m2);
// m1复制到m3
m3.putAll(m1);
System.out.println(m3);
}
}
定义集合时可以同时定义对象的类型,如上面代码所示,这样定义就可不用强制转换,在key中只能是字符串,value只能是数字
Java之集合的更多相关文章
- 【Java】集合_学习笔记
一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- 谈谈Java的集合组件
让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...
- java.util 集合框架集合
java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...
- Java基础——集合框架
Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...
- Java学习-集合(转)
在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...
- java的集合框架之一
java是一套很成熟的东西,很多商用的东西都喜欢用它,用的人多,稳定.不过一般也不怎么说起它,因为太常见了,私下里说,写java应用层得就像农民工,每一处都是搭积木,根据设计师的东西如何优雅地搭好积木 ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...
- Java之集合初探(一)
一.集合概述.区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器. 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的 ...
- Java面向对象 集合(下)
Java面向对象 集合(下) 知识概要: (1)Map集合的体系结构 (2)Map集合的方法 (3)HashMap TreeMap (4)集合框架中的常用工具类 ( ...
随机推荐
- redis 高性能的原因
1. redis 数据存储在内存中: 2. redis 是单线程: 3. redis 多路复用: 指令先放到队列里 4.redis 使用resp 协议
- Codeforces Round #551 (Div. 2)D(树形DP)
#define HAVE_STRUCT_TIMESPEC#include <bits/stdc++.h>using namespace std;int val[300007],num[30 ...
- web前端面试第一次[定时器]
BOM中定时器--计时器 定时器参数两个:(函数,时间(单位ms(1000ms=1s))) 时间设置1s,每过1s执行一次函数 //设置定时器 setInterval(funtion(){ alert ...
- Django学习之ORM练习题
一.表关系 创建表关系,并创建约束 班级表:class 学生表: student cid caption grade_id sid sname gender class_id 1 一年一班 1 1 乔 ...
- unique 验证 criteria 使用
model array('code', 'unique', 'criteria' =>array('condition' =>'schoolid=:schoolid','params' = ...
- mysql学习指令
mysql 用户管理和权限设置 参考文章:http://www.cnblogs.com/fslnet/p/3143344.html Mysql命令大全 参考文章: http://www.cnblogs ...
- Python Web 框架原理
Web Socket 所谓 Web 服务,本质上就是用户使用一个 socket 客户端(浏览器)去访问一个 socket 服务端. 下面是一个最基础的基于 socket 的 Python Web 服务 ...
- Vue 集成easyUI
原 Vue 集成easyUI https://blog.csdn.net/m0_37948170/article/details/84960320 参考vue官网用cli创建了Vue项目之后: n ...
- DICOM设备Raw Data与重建
DICOM设备Raw Data与重建 现在的医疗影像设备基本都已DICOM为标准.但现在许多医院的技术人员都以为只要支持DICOM就一切OK,其实不然.DICOM中有Storage.Prin ...
- 输入、输出(iostream)
在一个程序当中输入和输出都扮演着重要的角色,所以掌握基本输入输出是入门一门语言所必不可少的.本文主要简单叙述java的输入和输出. package ios; import java.util.Scan ...