【Java】Collection集合和泛型

学习目标:会存取,掌握特性
学习方式:学习顶层接口/抽象类的共性方法,使用底层的子类创建对象使用

1 集合框架

集合类的继承体系:
Collection接口:
·············1) List接口:有序、允许重复、有索引
··························1.1) ArrayList集合【重点】
··························1.2) Vector集合【了解】
··························1.3) LinkedList集合【熟悉】
·············2) Set接口:不重复、无索引
··························2.1) TreeSet集合:无序(存取顺序可能不一致)【了解】
··························2.2) HashSet集合:无序【重点】
·······································2.2.1) LinkedHashSet集合:无序【熟悉】

集合特点
List有索引,可以存储重复元素,可以保证存取顺序
ArrayList底层是数组实现的,查询快,增删慢
LinkedList底层是链表实现的,查询慢,增删快
Set无索引,不可以存储重复元素,存取无序
HashSet底层是哈希表+红黑树实现,无索引,不可以存重复元素,存取无序
LinkedHashSet底层是哈希表+链表实现,无索引,不可以存重复元素,可以保证存取顺序
TreeSet底层是二叉树实现,一般用于排序

2 Collection集合常用功能

Collection是单列结合最顶层的接口,定义了单列集合共性方法,任意单列集合都可以使用
java.util.Collection:1. add(e); 2. remove(e); 3. inEmpty(); 4. clear(); 5. contains(e); 6. toArray(); 7. size()

public static void main(String[] args) {Collection<String> coll = new ArrayList<>();//add添加元素coll.add("a");coll.add("b");coll.add("c");System.out.println(coll);//[a,b,c]//remove删除元素boolean result = coll.remove("a");System.out.println(result);//删除结果:trueSystem.out.println(coll);//[b,c]//clear清空集合coll.clear();System.out.println(coll);//contains是否包含coll.add("b");boolean result2 = coll.contains("a");System.out.println(result2);//flaseboolean result3 = coll.contains("b");System.out.println(result3);//true//isEmpty判断集合是否为空System.out.println(coll.isEmpty());//false//size获取集合长度System.out.println(coll.size());//1//toArray集合--->数组 遍历集合元素Object[] arr = coll.toArray();for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);//打印Object对象 因为重写了toString 所以显示的是值而不是地址}
}

3 Iterator迭代器

常用方法:1. hasNext()、2. next()
Iterator迭代器是一个接口,无法直接使用,需要使用Iterator接口的实现类对象
Collection中有一个iterator()方法,返回的是迭代器的实现类对象,list和set 通用,无需索引。
【重点】使用方式

  1. 使用iterator()方法获取实现类对象,使用Iterator接口接收(多态)
  2. 使用hasNext判断是否还有下一个
  3. 使用next取出下一个元素

实现原理:iterator()获取迭代器的实现类对象,会把指针(索引)指向集合-1索引处。hasNext()判断是否有下一个。next取出一个元素后,会把指针向后移动一位。

实现示例

public static void main(String[] args) {Collection<String> coll = new ArrayList<>();coll.add("a");coll.add("b");coll.add("c");coll.add("d");coll.add("e");//迭代器有泛型 跟着集合走//多态    接口          实现类对象Iterator<String> it = coll.iterator();while(it.hasNext()){System.out.println(it.next());}}    public static void main(String[] args) {Collection<String> coll = new ArrayList<>();coll.add("a");coll.add("b");coll.add("c");//迭代器有泛型 跟着集合走//多态    接口          实现类对象Iterator<String> it = coll.iterator();//常用while循环while(it.hasNext()){String e = it.next();System.out.println(e);}//一个迭代器只能取一次 再取要创建新的迭代器 否则会报NoSuchElement异常for( Iterator<String> it2 = coll.iterator();it2.hasNext();){String e = it2.next();System.out.println(e);}//foreach语句 增强for循环JDK1.5开始出现 //专门用来遍历数组和结合 //底层使用的也是迭代器遍历过程中只能遍历不能增删for(Object o : coll){System.out.println(o);}}

4 泛型的概念

概念
泛型是一种未知的数据类型,当不知道使用什么数据类型的时候可以使用泛型
泛型也可以看成是一个变量用来接收数据类型
ArrayList<E>,E表示未知类型,在创建集合对象时,确定泛型的数据类型
不使用泛型的好处:使用泛型,默认类型时Object类型,可以存储任意类型的数据
不适用泛型的弊端:不安全,会引发异常

public static void main(String[] args) {Collection ArrayList = new ArrayList();//以Object类型存入任意类型的数据ArrayList.add("a");ArrayList.add(1);Iterator it = ArrayList.iterator();while(it.hasNext()){//取出也是Object类型System.out.println(it.next());//引发异常举例://想要使用String类特有的方法不能使用//多态:Object obj = "a"不能使用子类特有的方法//除非向下转型(String)"a"Object o = it.next();//当o=1时,java.lang.ClassCastException:String s = (String) o;System.out.println(s.length());}}

使用泛型的好处:避免了类型转换的麻烦,把运行期异常,提升到了编译期(IDE会报错)
使用泛型的弊端:只能存储泛型定义的类型

5 泛型的定义和使用

5.1 定义和使用泛型类

泛型类

package Collection;public class GenericClass<E> {private E name;public E getName() {return name;}public void setName(E name) {this.name = name;}
}

泛型测试类

package Collection;public class GenericClassTest {public static void main(String[] args) {GenericClass<String> gcs = new GenericClass<>();gcs.setName("张三");System.out.println(gcs.getName());GenericClass<Integer> gci = new GenericClass<>();gci.setName(1);System.out.println(gci.getName());}
}

5.2 定义和使用泛型的方法

泛型定义在方法修饰符和返回值类型之间
在调用方法时确定泛型的数据类型,传递什么类型的参数,泛型就是什么类型

修饰符 <泛型> 返回值类型 方法名(参数表(使用泛型))

定义类和方法

public class GenericMethod {//成员方法public <M> void method(M m){System.out.println(m);}//静态方法public static <M> void methodStatic(M m){System.out.println(m);}
}

测试类调用

public class GenericMethodTest {public static void main(String[] args) {//创建对象GenericMethod gm = new GenericMethod();gm.method(10);gm.method("abc");gm.method(9.99);GenericMethod.methodStatic(5);GenericMethod.methodStatic("zxc");}
}

5.3 定义和使用泛型接口

方法1:使用实现类,指定接口的泛型

  1. 定义接口:
public interface GenericInterface<I> {public abstract void method(I i);
}
  1. 定义实现类:【指定泛型类型】
public class GenericInterfaceImpl implements GenericInterface<String> {@Overridepublic void method(String s) {System.out.println(s);}
}
  1. 定义测试类:
public class GenericInterfaceTest {public static void main(String[] args) {GenericInterfaceImpl gi = new GenericInterfaceImpl();gi.method("abc");}   
}

方法2:接口使用什么泛型实现类就用什么泛型

  1. 定义接口
public interface GenericInterface<I> {public abstract void method(I i);
}
  1. 定义实现类【不指定泛型类型】
public class GenericInplementImpl2<I> implements GenericInterface<I>{@Overridepublic void method(I i) {System.out.println(i);}
}
  1. 定义测试类【创建对象时,指定泛型类型】
public class GenericInterfaceTest {public static void main(String[] args) {GenericInplementImpl2<Integer> gi2 = new GenericInplementImpl2<>();gi2.method(123);}
}

5.3 泛型通配符

不知道使用什么类型来接收数据的时候,可以使用<?>表示未知通配符
此时只能接收数据,不能往集合中存储数据
定义的时候不能用 只有参数传递的时候可以用

import java.util.ArrayList;
import java.util.Iterator;public class Generic {//定义一个方法,可以遍历有所ArrayList集合//不知道集合的数据类型,可以使用泛型来接受数据类型//注意!!泛型没有继承概念,所以不能用Object
//    错误写法:
//    public static void printArray(ArrayList<Object> list){
//
//    }
//    正确写法:public static void printArray(ArrayList<?> list){Iterator<?> it = list.iterator();while(it.hasNext()){//it.next()取出的时Object类型Object obj = it.next();System.out.print(obj + " ");}System.out.println();}public static void main(String[] args) {ArrayList<Integer> list1 = new ArrayList<>();list1.add(1);list1.add(2);ArrayList<String> list2 = new ArrayList<>();list2.add("a");list2.add("b");//?= IntegerprintArray(list1);//? = StringprintArray(list2);}
}

泛型通配符的高级使用——受限泛型【看源码的时候可能会用】
泛型的上限限定:? extends E 表示使用的泛型只能是E的子类/本身
泛型的下限限定:? super E 表示使用的泛型只能时E的父类/本身

import java.util.ArrayList;
import java.util.Collection;public class GenericUpDown {//上限限定,?只能是子类/本身public static void getElementUp(Collection<? extends Number> coll){}//下限限定,?只能是父类/本身public static void getElementDown(Collection<? super Number> coll){}public static void main(String[] args) {// 继承关系// int extends num extends obj// str extends objCollection<Integer> intList = new ArrayList<>();Collection<String> strList = new ArrayList<>();Collection<Number> numList = new ArrayList<>();Collection<Object> objList = new ArrayList<>();getElementUp(intList);
//      getElementDown(intList); // 报错 int是num的子类//      getElementUp(strList); // 报错 str和num没关系
//      getElementDown(strList); // 报错 str和num没关系getElementUp(numList);getElementDown(numList);
//      getElementUp(objList); // 报错 obj是num的父类getElementDown(objList);}
}

案例:斗地主-1

package DouDiZhu;import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;public class DouDiZhu {public static void main(String[] args) {//1. 准备牌面ArrayList<String> all = new ArrayList<>();all.add("BK");all.add("SK");String[] colors = {"♥","♠","♦","♣"};String[] nums = {"A","K","Q","J","10","9","8","7","6","5","4","3","2"};for(String num: nums){for(String color: colors){all.add(color+num);}}//2. 洗牌Collections.shuffle(all);//打乱顺序ArrayList<String> left = new ArrayList<>();ArrayList<String> p1 = new ArrayList<>();ArrayList<String> p2 = new ArrayList<>();ArrayList<String> p3 = new ArrayList<>();for (int i = 0; i < all.size(); i++) {String p = all.get(i);if(i>=51){left.add(p);}else{if(i%3 == 0){p1.add(p);}else if(i%3 == 1){p2.add(p);}else{p3.add(p);}}}//3. 看牌System.out.println(p1);System.out.println(p2);System.out.println(p3);System.out.println(left);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

]搜索引擎的文档相关性计算和检索模型(BM25/TF-IDF)

搜索引擎的检索模型-查询与文档的相关度计算1. 检索模型概述搜索结果排序时搜索引擎最核心的部分&#xff0c;很大程度度上决定了搜索引擎的质量好坏及用户满意度。实际搜索结果排序的因子有很多&#xff0c;但最主要的两个因素是用户查询和网页内容的相关度&#xff0c;以及网…

对话系统(任务型、检索式、生成式对话论文与工具串讲)

Motivation 对话是一个很大的概念&#xff0c;有非常非常多的子问题&#xff0c;刚入坑的小伙伴很可能迷失在对话的一小块区域里无法自拔&#xff0c;本文就是为解决这一类问题的。希望读者在看完本文后&#xff0c;可以理清楚对话的每个概念为什么而存在&#xff0c;以及它在整…

综述 | 知识图谱向量化表示

本文作者&#xff1a;窦洪健&#xff0c;2016级研究生&#xff0c;目前研究方向为推荐系统、文本生成&#xff0c;来自中国人民大学大数据管理与分析方法研究北京市重点实验室。 本文收录于RUC AI Box专栏&#xff0c;为该专栏特供稿件&#xff08;https://zhuanlan.zhihu.com/…

【LeetCode】4月2日打卡-Day18-矩阵操作

题1 生命游戏 描述 根据 百度百科 &#xff0c;生命游戏&#xff0c;简称为生命&#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a;1 即…

强化学习扫盲贴:从Q-learning到DQN

本文转载自知乎专栏「机器学习笔记」&#xff0c;原文作者「余帅」&#xff0c;链接https://zhuanlan.zhihu.com/p/358829371 本文学习目标1. 复习Q-Learning&#xff1b;2. 理解什么是值函数近似&#xff08;Function Approximation&#xff09;&#xff1b;3. 理解什么是DQN&…

【LeetCode】4月1日打卡-Day17-括号匹配/嵌套深度

题1 有效括号的嵌套深度 题解 要求划分出使得最大嵌套深度最小的分组&#xff0c;我们首先得知道如何计算嵌套深度。我们可以通过栈实现括号匹配来计算&#xff1a; 维护一个栈 s&#xff0c;从左至右遍历括号字符串中的每一个字符&#xff1a; 如果当前字符是 (&#xff0c;…

肖仰华 | 基于知识图谱的可解释人工智能:机遇与挑战

本文转载自公众号知识工场&#xff0c;整理自 2017 年 10 月 13 日肖仰华教授在 CIIS2017 中国智能产业高峰论坛上所做的报告。 肖仰华&#xff1a;很高兴有机会跟大家一起分享《基于知识图谱的可解释人工智能&#xff1a;机遇与挑战》。 刚才刘总的报告中提到了机器和人类将来…

对话系统的设计艺术(完结)

Motivation对话是一个很大的概念&#xff0c;有非常非常多的子问题&#xff0c;刚入坑的小伙伴很可能迷失在对话的一小块区域里无法自拔&#xff0c;本文就是为解决这一类问题的。希望读者在看完本文后&#xff0c;可以理清楚对话的每个概念为什么而存在&#xff0c;以及它在整…

2018届校招面经精选

https://www.zhihu.com/question/23259302 牛客网​已认证的官方帐号819 人赞同了该回答最好的办法就是看看别人是怎么准备的&#xff0c;通过别人的面经来反思自己如何准备。针对应届生校招面试 “机器学习” 相关岗位的情况&#xff0c;牛妹为大家整理了一批面经&#xff0c…

【Java】列表、集合、哈希表和可变参数

1 List 1.1 List的特点 List接口继承自Collection接口List是有序集合&#xff0c;存取顺序一致允许存储重复元素 1.2 List的特有方法【带索引】 public void add(int index, E element);public E get(int index)public E remove(int index)&#xff1a;返回移除元素public …

白硕 | 知识图谱,就是场景的骨架和灵魂

本文转载自公众号恒生技术之眼 知识图谱&#xff0c;目前已在全世界得到了重视和应用&#xff0c;成为当下人工智能热的一个重要组成部分。它究竟是怎样的一种技术&#xff1f;它的应用场景在哪里&#xff1f;未来国内企业该如何发展&#xff1f;让我们一起来聊聊。 从知识图谱…

您的DST大礼包请查收

本文转载自刘冲大佬&#xff08;知乎id&#xff1a;呜呜哈&#xff09;的知乎文章&#xff0c;链接&#xff1a;https://zhuanlan.zhihu.com/p/40988001除本文外&#xff0c;作者还写了很多对话相关的良心好文&#xff01;做对话的小伙伴千万不要错过这位良心答主噢(&#xffe…

LSTM长短记,长序依赖可追忆(深度学习入门系列之十四)

摘要&#xff1a;如果你是一名单身狗&#xff0c;不要伤心&#xff0c;或许是因为你的记忆太好了。有时&#xff0c;遗忘是件好事&#xff0c;它让你对琐碎之事不再斤斤计较。然而每当自己记不住单词而“问候亲人”时&#xff0c;也确实气死个人。于是你懂得了如何控制好什么信…

【Java】如何理解Java中的双列集合Map?

1 Map<K,V>接口 1.1 特点 双列集合一个元素包含俩值Key不可以重复&#xff0c;Value可以重复Key和Value一一对应Key和Value可以时任意类型 1.2 常用方法 public V put(K key, V value): 不重复返回null&#xff0c;重复返回value public static void main(String[] a…

技术动态 | 清华大学开源OpenKE:知识表示学习平台

本文转载自公众号机器之心&#xff0c;选自 THUNLP。 清华大学自然语言处理实验室近日发布了 OpenKE 平台&#xff0c;整合了 TransE、TransH、TransR、TransD、RESCAL、DistMult、HolE、ComplEx 等算法的统一接口高效实…

多任务学习时转角遇到Bandit老虎机

注&#xff1a;本文的正文干货转载并少量修改自大佬覃含章&#xff08;知乎id同名&#xff0c;知乎必关的数值优化大佬啊啊&#xff09;的一篇知乎回答&#xff0c;链接https://www.zhihu.com/question/53381093/answer/562235053一个转角事情是这样的&#xff0c;最近小夕在做…

NLP13-LDA引发的一系活动

摘要&#xff1a; 目标是想了解也学习LDA&#xff0c;寻找学习LDA相关资料&#xff0c;学习LDA相关的概率基础&#xff0c;对于LSI&#xff0c;pLsa,LDA作为主题模型的对比&#xff1b;然后到LDA本身&#xff0c;对LDA相关的概率基础进行学习。把相关资料疏理与集合起来。

王昊奋 | 从聊天机器人到虚拟生命:AI技术的新机遇

本文转载自公众号中国人工智能学会。 10月12-13日&#xff0c;第七届中国智能产业高峰论坛在佛山开幕&#xff0c;在NLP与服务机器人专题论坛上&#xff0c;深圳狗尾草CTO王昊奋发表了主题为《从聊天机器人到虚拟生命&#xff1a;AI技术的新机遇》的精彩演讲。 以下是王昊奋老师…

【Java】如何理解Java中的异常机制?

1 异常的概念 程序在执行过程中出现非正常线性&#xff0c;导致JVM非正常停止异常不是语法错误 2 异常的分类 Throwable是所有错误或异常的超类Exception是编译期间异常&#xff08;写代码时IDE会报错&#xff09;RuntimeException时运行期异常&#xff0c;程序运行时出现的…