前言:

  在写程序当中,集合会经常使用,今天听了马老师的课,写一些自己的总结

正文:

  集合最重要的就是一个图,一个类,三个知识点,六个接口

  说到图就是上面的图,这个图可以帮我们理解这些接口的继承关系

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之集合的更多相关文章

  1. 【Java】集合_学习笔记

    一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...

  2. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

  3. 谈谈Java的集合组件

    让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...

  4. java.util 集合框架集合

    java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...

  5. Java基础——集合框架

    Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...

  6. Java学习-集合(转)

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  7. java的集合框架之一

    java是一套很成熟的东西,很多商用的东西都喜欢用它,用的人多,稳定.不过一般也不怎么说起它,因为太常见了,私下里说,写java应用层得就像农民工,每一处都是搭积木,根据设计师的东西如何优雅地搭好积木 ...

  8. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  9. Java之集合初探(一)

    一.集合概述.区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器. 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的 ...

  10. Java面向对象 集合(下)

      Java面向对象 集合(下) 知识概要:               (1)Map集合的体系结构 (2)Map集合的方法 (3)HashMap TreeMap (4)集合框架中的常用工具类 ( ...

随机推荐

  1. vue + element ui table表格二次封装 常用功能

    因为在做后台管理项目的时候用到了大量的表格, 且功能大多相同,因此封装了一些常用的功能, 方便多次复用. 组件封装代码: <template> <el-table :data=&qu ...

  2. 配置VSCode开发Vue项目

    一.安装VSCode.NodeJS VSCode:https://code.visualstudio.com/ NodeJS:https://nodejs.org/en/ 二.打开VSCode,安装常 ...

  3. 列举mvc ActionResult的返回值

    8.列举ASP.NET MVC ActionResult的返回值有几种类型? 主要有View(视图).PartialView(部分视图).Content(内容).Json(Json字符串).Javas ...

  4. python词云图与中文分词

    2019-12-12中文文本分词和词云图具体功能介绍与学习代码: import jiebaa="由于中文文本的单词不是通过空格或者标点符号来进行分割"#jieba.lcut()s是 ...

  5. Vue下URL地址栏参数改变却不能刷新界面

    在完成毕业设计(基于Vue的信息资讯展示与管理平台)的过程中,处理如下图所示的 点击左侧栏目列表跳转到对应文章列表 的问题时,初次点击可以跳转到对应的页面,但是当第二次点击时,虽然地址栏的参数改变了, ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:将悬停的颜色应用在行或者单元格上

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

  7. JS echarts统计

    柱状图 function drawbarFunc(xs, ys) { //var xs1 = []; //var ys1 = []; require.config({ paths: { echarts ...

  8. SystemVerilog基本语法总结(上)

    SystemVerilog基本语法总结(上) 在总结SV的语法之前,先分享一些关于SV的笔试题目,这样更显得具有针对性的总结. a. 验证中,代码覆盖率是指(衡量哪些设计代码在激活触发,而哪一些则一直 ...

  9. 087、Java数组之对象数组的静态初始化

    01.代码如下: package TIANPAN; class Book { private String title; private double price; public Book(Strin ...

  10. partialview 用法

    using  MvcApplication1.Models; @model MvcApplication1.Models.UserInfoModel @{     ViewBag.Title = &q ...