1.Collection集合

集合和数组的区别?

  • 数组的长度是固定的, 集合的长度是可变的
  • 数组中存储的数据都是同一类型的数据。集合存储的是对象,而且对象的类型可以不一致

集合框架

单列集合

java.util.Collection

Collection:单列集合的跟接口,用于存储一系列的规则的元素

两个子接口:

  • java.util.List: List中元素是有序,元素可重复

    • 实现类:java.util.ArrayList, java.util.LinkedList
  • Java.util.Set: Set中元素无序,不重复
    • 实现类:java.util.HashSet, java.util.TreeSet

Collection集合的常用功能

Collection是所有单列集合的父接口,因此定义了一些通过方法

  • public boolean add(E, e):添加元素到集合中

  • public void clear():清空集合中所有的元素

  • public boolean remove(E, e):删除指定的元素

  • public boolean contains(E, e):判断当前集合是否存在给定的元素

  • public boolean isEmpty():判断当前集合是否为空

  • public int size():返回集合中元素的个数

  • public Object[] toArray():把集合的元素存储到数组中

    1. import java.util.ArrayList;
    2. import java.util.Colleaction;
    3. public class Demo{
    4. public static void main(String[] args){
    5. // 创建集合对象,使用多态
    6. Collection<String> coll new ArrayList<String>();
    7. //使用方法
    8. // 添加
    9. coll.add("杨幂").add("刘亦菲").add("唐嫣").add("胡珺");
    10. System.out.println(coll);
    11. // 判断是否在集合中
    12. System.out.println("判断胡珺是否在集合中"+coll.contains("胡珺"));
    13. // 判断集合是否为空
    14. System.out.println(coll.isEmpty());
    15. // 集合中有多少个元素
    16. System.out.println(coll.sixe());
    17. // 删除指定的元素
    18. coll.remove("胡珺");
    19. // 集合存储到数组中
    20. Object[] object = coll.toArray();
    21. //遍历数组
    22. for(int i=0;i<object.length;i++){
    23. System.out.println(i);
    24. }
    25. // 清空集合
    26. coll.clean();
    27. }
    28. }

2.Iterator迭代器

迭代

  • 在集合中获取元素之前进行判断集合中有没有元素,如果有取出来,继续进行判断,继续取出来,知道集合元素全部取出

Iterator的常用方法

  • public E next():返回迭代的下一个元素
  • public boolean hasNext():如果有元素可以迭代,则返回True
  1. public class Demo{
  2. public static void main(String[] args){
  3. //使用多肽创建集合
  4. Collection<String> coll = new ArrayList<String>();
  5. // 添加元素
  6. coll.add("杨幂").add("胡珺").add("程锐");
  7. //使用迭代器进行遍历
  8. Iterator<String> it = coll.iterator();
  9. // 泛型值得是: 迭代出来的数据类型
  10. while(it.hasNext()){//判断是否有迭代元素
  11. String s = it.next(); //获取迭代的元素
  12. System.out.println(s);
  13. }
  14. }
  15. }

增强for

格式:

  1. for(元素的数据类型 变量:Collection集合或者数组){
  2. //操作代码
  3. }

它用于变量Collection和数组, 不要在遍历的时候对集合元素进行曾删操作

  1. public class Demo{
  2. public static void main(String[] args){
  3. int[] arr = {1,2,3,4,5};
  4. for(int i:arr){
  5. System.out.println(i);
  6. }
  7. }
  8. }
  1. public class Demo{
  2. public static void main(String[] args){
  3. Collection<String> coll = new ArrayList<String>();
  4. coll.add("112");
  5. coll.add("113");
  6. coll.add("114");
  7. for(String s:coll){
  8. System.out.println(s);
  9. }
  10. }
  11. }

只针对Collection和数组, 用于遍历

3.泛型

在从集合中存取数据,数据将被提升为Object类型,当我们取出一个的对象,进行操作,这个时候需要类型转换

  • 泛型:可以再类或者是方法中预支的使用未知的数据类型

    一般在创建对象是,当没有指定类型的时候,默认是Object类型

泛型好处

  • 将运行售后的ClassCastException,转移到了编译时期变成编译失败
  • 避免了类型强转的麻烦
  1. public class Demo{
  2. public static void main(String[] args){
  3. collection<String> coll = new ArrayList<String>();
  4. coll.add("abd");
  5. coll.add("aaa");
  6. //coll.add(5); 当集合明确类型后, 存放类型不一致就会编译错误
  7. // 集合已经明确的具体存放的元素类型,那么在使用迭代器的时候,迭代器也同样知道具体遍历元素类型
  8. Iterator<String> it = coll.iterator();
  9. while(it.hasNext()){
  10. //当使用Iterator控制的元素类型之后,就不要强转了,获取的元素就是String类型
  11. String str = it.next();
  12. System.out.println(str);
  13. }
  14. }
  15. }

泛型是数据泛型的一部分,我们将类名和泛型合并起来一起看做数据类型

泛型的定义与使用

我们在集合中通常使用到了泛型

泛型,用来灵活的将数据类型应用到不同的类,方法,接口当中。将数据类型作为参数进行传递

定义和使用含有泛型的类

定义格式:

  1. 修饰符 class 类名<代表泛型的变量>{}

demo

  1. ArrayList集合;
  2. public class ArrayList<E>{
  3. public boolean add(E e){}
  4. public E get(int index){}
  5. ....
  6. }

使用泛型:即什么时候确定泛型

在创建对象的时候使用泛型

例如:ArrayList list = new ArrayList();

此时就可以理解变量E的值就是String类型,那么理解为

  1. public class ArrayList<String>{
  2. public boolean add(String e){}
  3. public String get(int index){}
  4. }

再例如,ArrayList list = new ArrayList();

此时理解为E的值就是Integer

  1. public class ArrayList<Integer>{
  2. public boolean add(Integer e){}
  3. public Integer get(int index){}
  4. }

demo

  1. public class MyGenericClass<MVP>{
  2. //没有MVP类型,在这里带变得是一种未知类型, 传递什么类型就是什么类型
  3. private MVP mvp;
  4. public void setMVP(MVP mvp){
  5. this.mvp = mvp;
  6. }
  7. public MVP getMVP(){
  8. return mvp;
  9. }
  10. }

使用

  1. public class GenericClassDemo{
  2. public static main(String[] args){
  3. // 创建一个泛型为Integer的类
  4. MyGenericClass<Integer> myNum = new MyGenericClass<Integer>();
  5. myNum.setMVP(124);
  6. Integer mvpNum = myNum.getMVP();
  7. System.out.println(mvpNum);
  8. //创建一个泛型为String的类
  9. MyGenericClass<String> myStr = new MyGenericClass<String>();
  10. myNum.setMVP("哈哈");
  11. String mvpStr = myStr.getMVP();
  12. System.out.println(mvpStr);
  13. }
  14. }
含有泛型的方法

定义格式:

  1. 修饰符 <代表泛型的变量> 返回值类型 方法名(参数){}

例如

  1. public class MyGenericMethod{
  2. public <MVP> void show(MVP mvp){
  3. System.out.println(mvp.getClass());
  4. }
  5. public <MVP> MVP show2(MVP mvp){
  6. return mvp;
  7. }
  8. }

使用格式: 调用方法时,确定泛型的类型

  1. public class GenericMethodDemo{
  2. public static void main(String[] args){
  3. //创建对象
  4. MyGenericMethod mm = new MyGenericMethod();
  5. //演示看方法提示
  6. mm.show("aaa");
  7. mm.show(12);
  8. }
  9. }
含有泛型的接口

定义格式:

  1. 修饰符 Interface接口名 <代表泛型的变量>{}

例如

  1. public interface MyGenericInterFace<E>{
  2. public abstract void add(E e);
  3. public abstract E getE();
  4. }

使用格式:

1.定义类是确定泛型的类型

例如

  1. public class MyImpl implements MyGenericInterFace<String>{
  2. @Override
  3. public void add(String e){
  4. //...
  5. }
  6. @Override
  7. public void getE(){
  8. return null;
  9. }
  10. }
  11. //此时泛型E的值就是String类型
2.始终不确定泛型的类型,直接创建对象时,确定泛型的类型

例如

  1. public class MyImpl<E> implements MyGenericInterFace<E>{
  2. @Override
  3. public void add(E e){
  4. //...
  5. }
  6. @Override
  7. public void getE(){
  8. return null;
  9. }
  10. }

确定泛型:

  1. public class GenericInterFace{
  2. public static void main(String[] args){
  3. MyImpl<String> my = new MyImpl<String>();
  4. my.add("aaa");
  5. }
  6. }

泛型通配符

当我们使用泛型或者是接口的时候,传递的数据中,泛型类型不确定,可以通过通配符<?>表示,但是一旦使用泛型的通配符之后,只能使用Object类中的共性方法,集合中元素自身的方法无法使用。

通配符的基本使用

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用??表示未知通配符

此时只接受数据,不能再集合中存储数据

例子:

  1. public class Demo{
  2. public static void main(String[] args){
  3. Collection<Integer> list1 = new ArrayList<Integer>();
  4. getElement(list1);
  5. Collection<String> list2 = new ArrayList<String>();
  6. getElement(list2);
  7. }
  8. public static void getElement(Collection<?> coll){
  9. // ? 代表可以接受任意类型
  10. }
  11. }

泛型不存在继承关系,Collection list = new ArrayList(); 错误

通配符高级使用—受限泛型

之前在设置泛型的时候,实际上是可以任意设置的,只要是类就可以,但是Java中泛型可以指定一个上限和下限。

泛型的上限

  • 格式:类型名称 <? extends 类> 对象名称
  • 意义:只能接受该类型及其子类

泛型的下限

  • 格式:类型名称 <? super 类> 对象名称
  • 意义:只能接受该类型及其父类型

比如:Object类,String类,Number类,Integer类,其中Number是Integer的父类

  1. public class Demo{
  2. public static void main(String[] args){
  3. Collection<Integer> list1 = new ArrayList<Integer>();
  4. Collection<String> list2 = new ArrayList<String>();
  5. Collection<Number> list3 = new ArrayList<Number>();
  6. Collection<Object> list1 = new ArrayList<Object>();
  7. }
  8. getElement(list1);
  9. getElement(list2); //报错
  10. getElement(list3);
  11. getElement(list4); //报错
  12. getElement2(list1);//报错
  13. getElement2(list2);//报错
  14. getElement2(list3);
  15. getElement2(list4);
  16. // 泛型的上限: 此时的泛型必须是Number类型或者是Number类型的子类
  17. public static void getElement(Collection<? extends Number> coll){};
  18. // 泛型的下限: 此时的泛型必须是Number类型或者是Number类型的父类
  19. public static void getElement2(Collection<? super Number> coll){};
  20. }

4.Map集合

  • Collection中的集合,元素是孤立存在的(单身),向集合中存储元素采用一个个元素的方式存储。
  • Map中的集合,元素是成对存在的(Python中的字典),每个元素有键和值组成,通过键进行找到值。
  • Map是双列集合

注意:Map中的集合不能有重复的键,值可以重复,但键唯一

Map常用子类

  • HashMap存储数据采用的是哈希表结构,元素的存储顺序不能保证一直,保证了键唯一,不重复,需要重写键的hashCode()方法,equals()方法。
  • LinkedHashMap存储数据采用哈希表+链表结构,通过链表结构可以保障元素存储顺序一直;用过哈希可以保障键的唯一,需要重写hashCode()方法,equals()方法。

Map中的集合有两个泛型变量,在使用的时候,需要为两个变量赋予数据类型。两个变量数据类型可以相同,可以不同。

Map中常用方法

  • public V put(K key, V value):将指定的键与指定的值添加到集合中
  • public V remove(Object key):把指定的键对应的键值对元素在集合中删除,返回删除元素的值。
  • public V get(Object key):根据指定的键,在Map集合中获取对应的值
  • public Set<K> keySet():获取Map集合中所有的键,存储到Set集合中
  • public Set<Map.Entry<K,V>>entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)

demo

  1. import java.util.Map;
  2. public class MapDemo{
  3. public static void main(String[] args){
  4. // 创建map对象
  5. HashMap<String, String> map = new HashMap<String, String>();
  6. // 添加元素到集合
  7. map.put("黄晓明","baby");
  8. map.put("刘德猛","胡珺");
  9. map.put("邓超","孙俪");
  10. //remove
  11. System.out.println(map.remove("邓超"));
  12. //查看刘德猛的老婆是谁
  13. System.out.println(map.get("刘德猛"));
  14. }
  15. }

注意:使用put方法,若指定的键在集合中没有,则返回值为null,并将指定的键添加到集合中

若指定的键存在,则返回值为集合中对应的值(该值为替换前的值),并将指定键对应的值换成指定的新值

Map集合中遍历键找值方法

键找值方法:通过元素中的键,获取键对应的值

分析步骤:

  1. 获取Map中的所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键,方法:keyset()

  2. 遍历Set集合,得到每一个键

  3. 依据键取值方法:get(K key)

    1. public class Demo{
    2. public static void main(String[] args){
    3. //创建Map集合对象
    4. HashMap<String,String> map = new HashMap<String,String>();
    5. //添加元素到集合中
    6. map.put("胡歌","霍建华");
    7. map.put("黄晓明","baby");
    8. map.put("刘德猛","胡珺");
    9. map.put("邓超","孙俪");
    10. // 获取所有的键
    11. Set<String> keys = map.keySet();
    12. // 遍历键列表
    13. for(String key:keys){
    14. // 获取对应的value值
    15. String value = map.get(key);
    16. System.out.println(key+":"+value);
    17. }
    18. }
    19. }

Entry键值对对象

Map是两种对象,一种是Key键,一种是Value值,Entry是将键值对进行了封装,即键值对对象,这样遍历Map集合中,就可以从一个键值对获取对应的值和键。

  • public K getKey():获取Entry中对象的键
  • public V getValue(): 获取Entry中对象的值
  • public Set<Map.Entry<K, V>> entrySet(): 获取Map集合中所有的键值对对象的集合(Set集合)

Map集合遍历键值对方式

键值对方式:通过集合中每个键值对(Entry)对象,获取键值对(Entry)中的键和值

操作步骤:

  1. 获取Map集合中,所有的键值对对象,以set集合形式返回,entrySet()方法
  2. 遍历包含键值对象Set集合,得到每一个键值对对象
  3. 通过键值对对象,过去Entry中的键和值,方法:getKey(), getValue()方法
  1. public class Demo{
  2. public static void main(String[] args){
  3. // 创建Map集合对象
  4. HashMap<String, String> map = new HashMap<String, String>();
  5. // Map添加元素
  6. map.put("胡歌", "霍建华");
  7. map.put("郭德纲", "于谦");
  8. map.put("薛之谦","大张伟");
  9. // 获取所有的Entry对象
  10. Set<Entry<String, String>> entrySet = map.entrySet();
  11. // 遍历得到每一个entry对象
  12. for(Entry<String,String> entry:entrySet){
  13. //解析
  14. String Key = entry.getKey();
  15. String Value = entry.getValue();
  16. System.out.println(Key+"的值是"+Value);
  17. }
  18. }
  19. }

HashMap存储自定义类型键值对

练习,每位学生(姓名和年龄)都有自己的家庭住址,那么既然有对应关系,则将学生对象和家庭住址存储到map集合中,学生作为键,家庭住址作为值。

注意:学生姓名相同并且年龄相同则视为同一个学生

编写学生类:

  1. public class Student{
  2. private String name;
  3. private int age;
  4. // 构造方法
  5. public Student(){}
  6. public Student(String name,int age){
  7. this.name = name;
  8. this.age = age;
  9. }
  10. // get方法
  11. public String getName(){
  12. return name;
  13. }
  14. public int getAge(){
  15. return age;
  16. }
  17. // set方法
  18. public void setName(String name){
  19. this.name = name;
  20. }
  21. public void setAge(int age){
  22. this.age = age;
  23. }
  24. // 重写equal方法
  25. @Override
  26. public boolean equals(Object o){
  27. if(this == o) return true;
  28. if(o==null||getClass()!=o.getClass()) return false;
  29. Student student = (Student) o;
  30. return age == student.age && Object.equals(name, student.name);
  31. }
  32. @Override
  33. public int HashCode(){
  34. return Objects.hash(name, age);
  35. }
  36. }

测试类

  1. public class HashMapTest{
  2. public static void main(String[] args){
  3. Map<Student, String> map = new HashMap<Student, String>();
  4. //添加元素
  5. map.put(new Student("lisi", 15), "北京");
  6. map.put(new Student("wangwu", 16), "上海");
  7. map.put(new Student("zhaoliu", 17), "深圳");
  8. // 取出元素
  9. Set<Student> keySet = map.keySet();
  10. for(Student key: keySet){
  11. String value = map.get(key);
  12. System.out.println(key.toString()+"..."+value);
  13. }
  14. }
  15. }

LinkedHashMap

LinkedHashMap下面一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构

  1. public class LinkedHashMap{
  2. public static void main(String[] args){
  3. LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
  4. map.put("邓超", "孙俪");
  5. map.put("李晨", "范冰冰");
  6. map.put("刘德华", "朱丽倩");
  7. Set<Entry<String, String>> entrySet = map.entrySet();
  8. for(Entry<String, String> entry:entrySet){
  9. System.out.println(entry.getKey()+"..."+entry.getValue());
  10. }
  11. }
  12. }

Collection,泛型,Map的更多相关文章

  1. 【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

    原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,Hash ...

  2. 12. 集合类Collection和Map

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  3. Java特性-Collection和Map

    创建博客的目的主要帮助自己记忆和复习日常学到和用到的知识:或有纰漏请大家斧正,非常感谢! 之前面试,被问过一个问题:List和Set的区别. 主要区别很明显了,两者都是数组形式存在的,继承了Colle ...

  4. Java Collection或Map的同步

    新集合也提供了能防止多个进程同时修改一个容器内容的机制.若在一个容器里反复,同时另一些进程介入,并在那个容器中插入.删除或修改一个对象,便会面临发生冲突的危险.我们可能已传递了那个对象,可能它位于我们 ...

  5. Collection和Map

    (1)Collection和Map的继承体系. (2)ArrayList(数组).LinkedList(链表).Vector(线程同步).Stack(继承Vector先进后出的栈).PriorityQ ...

  6. Java集合类根接口:Collection 和 Map

    前言 在前文中我们了解了几种常见的数据结构,这些数据结构有着各自的应用场景,并且被广泛的应用于编程语言中,其中,Java中的集合类就是基于这些数据结构为基础. Java的集合类是一些非常实用的工具类, ...

  7. spark提示Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Lscala.collection.immutable.Map;

    spark提示Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot b ...

  8. 初识Java集合框架(Iterator、Collection、Map)

    1. Java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 注意: 既有接口也有类,图中画实线的是类,画虚线的是接口 使用之前须要到导入java.util包 List ...

  9. JAVA集合详解(Collection和Map接口)

    原文地址http://blog.csdn.net/lioncode/article/details/8673391 在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父 ...

随机推荐

  1. Web很脆弱,SQL注入要了解

    SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 通过一下的例子更形象的了解SQL注入: 有一个Login ...

  2. 用原生JS实现AJAX和JSONP

    前端开发在需要与后端进行数据交互时,为了方便快捷,都会选择JQuery中封装的AJAX方法,但是有些时候,我们只需要JQuery的AJAX请求方法,而其他的功能用到的很少,这显然是没必要的.其实,原生 ...

  3. 基于Spring Boot自建分布式基础应用

    目前刚入职了一家公司,要求替换当前系统(单体应用)以满足每日十万单量和一定系统用户负载以及保证开发质量和效率.由我来设计一套基础架构和建设基础开发测试运维环境,github地址. 出于本公司开发现状及 ...

  4. python模块之junos-eznc

    一.简介 本文将使用python模块中的junos-eznc来控制juniper的 Junos OS系统,此模块可以在windows平台和UNIX平台上使用 二.实验环境 1.操作系统:win10 2 ...

  5. 常用的python内置方法

    all  ( )                                 循环参数,参数全为真就返回Ture  any()                              只要有一个 ...

  6. 因为配置了Always-On导致的无法Drop Login...

    一个sysadmin离职了,但是因为之前是他配置的Always-on,所以试图Drop他的login就会失败,原因是这个login会赋予一个叫做“Hadr_endpoint”的endpoint权限,并 ...

  7. Spring Boot 与 Mybatis、Mysql整合使用的例子

    第一步: 创建一个SpringBoot的工程,在其中的Maven依赖配置中添加对JDBC.MyBatis.Mysql Driver的依赖具体如下: <!-- JDBC --> <de ...

  8. HBase 系列(五)——HBase 常用 Shell 命令

    一.基本命令 打开 Hbase Shell: # hbase shell 1.1 获取帮助 # 获取帮助 help # 获取命令的详细信息 help 'status' 1.2 查看服务器状态 stat ...

  9. 分享:个人APP(非企业资质)的微信登录方案

    目前微信开放平台个人主体类APP不支持开通微信登录,那么个人开发者如何解决微信登录的问题呢?目前有一种替代方案是用微信小程序作为媒介来达到微信登录的目的. 微信小程序的登录无需企业资质,同时登录后返回 ...

  10. PySpark SQL 相关知识介绍

    title: PySpark SQL 相关知识介绍 summary: 关键词:大数据 Hadoop Hive Pig Kafka Spark PySpark SQL 集群管理器 PostgreSQL ...