zoukankan      html  css  js  c++  java
  • [Js-Java SE]集合类

    主要集合概述:

    • List:是一个有序集合,可以放重复的数据
    • Set:是一个无序集合,不允许放重复的数据
    • Map:是一个无序集合,集合中包含一个键对象,一个值对象,键对象不允许重复 ,值对象可以重复(身份证号—姓名)

     Collection 详解:

    注意:

    Collection 是java.until下的接口,是各种集合结构的父接口,

    Collections 是java.until下的类,包含各种有关集合操作的镜头方法

    Collection 以及几个重要实现类和接口的继承关系图:

    注:

    Collection 只能存储引用数据类型,并且是单个存储

    ArrayList 底层所采用的是数组存储元素,所以 ArrayList 集合适合查询,不适合频繁地随机增删元素

    LinkedList 底层采用的是双层链表存储数据,链表适合频繁地增删元素,不适合查询操作

    Vector 的底层实现和ArrayList集合相同,但是 Vector 是线程安全的,效率较低,所以使用较少(所以图中显示为灰色)

    HashSet 的底层实现是一个哈希表/散列表

    关于 ArrayList 的练习:

     1 package com.neu.core;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Collection;
     5 import java.util.Iterator;
     6 
     7 public class ArrayListTest {
     8     public static void main(String[] args) {
     9         Collection<Integer> a = new ArrayList<>();
    10 
    11         // 添加对象
    12         a.add(1);// 自动装箱
    13         a.add(2);
    14         a.add(3);
    15 
    16         // 1.父类或者接口是否可以调用子类或实现类的独有方法?
    17         // 错误的写法,c为一个Collection对象,不存在set方法
    18         // c.set(0, 4);
    19         // 正确的写法s
    20         ArrayList<Integer> al = (ArrayList<Integer>) a;
    21         al.set(0, 4);
    22 
    23         // 2.插入类型不同的对象会发生什么?
    24         // 会在强制类型转换的时候发生ClassCastException
    25         // al.add("qwer");
    26 
    27         // 3.输出对象的方式?
    28         System.out.println("======foreach循环======");
    29         for (Integer integer : a) {
    30             System.out.println(integer);
    31         }
    32         System.out.println("======for循环======");
    33         for (int i = 0; i < al.size(); i++) {
    34             // 将 Object 强制转换为 Integer
    35             Integer e = (Integer) al.get(i);
    36             System.out.println(e);
    37         }
    38         System.out.println("======while+迭代器======");
    39         Iterator<Integer> it = al.iterator();
    40         while (it.hasNext()) {
    41             System.out.println(it.next());
    42         }
    43         System.out.println("======while+for循环======");
    44         for (it = al.iterator(); it.hasNext();) {
    45             System.out.println((Integer) it.next());
    46         }
    47         // Iterator使用完不能再使用,只能返回一个新的迭代器
    48 
    49         // 4.删除集合中的元素?
    50         // al.remove(2);
    51         // System.out.println("============");
    52         // for (Integer integer : al) {// al变成[4,2]
    53         // System.out.println(integer);
    54         // }
    55         al.remove(new Integer(2));
    56         System.out.println("============");
    57         for (Integer integer : al) {// al变成[4,3]
    58             System.out.println(integer);
    59         }
    60         // 以上两种方式不一样,第一种传入的是下标,第二种传入的是对象引用
    61 
    62         // 5.判断是否含某个对象
    63         System.out.println("============");
    64         System.out.println(al.contains(3));
    65 
    66         // 6.判断是否为空
    67         System.out.println("============");
    68         System.out.println(al.isEmpty());
    69 
    70         // 7.转换为对象数组
    71         System.out.println("============");
    72         Object[] oArray1 = al.toArray();
    73         for (int i = 0; i < oArray1.length; i++) {
    74             Integer v = (Integer) oArray1[i];
    75             System.out.println(v);
    76         }
    77         System.out.println("============");
    78         Integer[] iArray = new Integer[al.size()];
    79         al.toArray(iArray);
    80         for (int i = 0; i < iArray.length; i++) {
    81             int v = iArray[i];
    82             System.out.println(v);
    83         }
    84 
    85     }
    86 }

    LinkedList 的用法与 ArrayList 类似,就不再写例子了

    哈希表简单解释:哈希表是一种数据结构,哈希表能够提供快速存取操作。哈希表是基于数组的,所以也存在缺点,数组一旦创建将不能扩展。正常的数组,如果需要查询某个值,需要对数组进行遍历,只是一种线性查找,查找的速度比较慢。如果数组中的元素值和下标能够存在明确的对应关系,那么通过数组元素的值就可以换算出数据元素的下标,通过下标就可以快数定位数组元素,这样的数组就是哈希表 。

    一张哈希表:
    元素值 10 11 12 13 14 15 16 17 18
    元素下标 0 1 2 3 4 5 6 7 8
    以上我们的示例元素值和下标的关系为:
    元素下标=元素值-10,此时的示例 hashcode就是和数组下标一致了,取得 hashcode 方法如下:

    1 //取得 hashCode
    2 pubic int hashCode(int value) {
    3 return value – 10;
    4 }

    有了 hashCode 后,我们就可以快速的定位相应的元素,查找到相应的信息

    由此算法衍生出 HashSet ,HashSet 中的数据是无序的不可重复的。HashSet 按照哈希算法存取数据的,具有非常好性能,它的工作原理是这样的,当向 HashSet 中插入数据的时候,他会调用对象的 hashCode得到该对象的哈希码,然后根据哈希码计算出该对象插入到集合中的位置。

     关于 HashSet 的练习

     1 package com.neu.core;
     2 
     3 import java.util.HashSet;
     4 import java.util.Iterator;
     5 import java.util.Set;
     6 
     7 public class HashSetTest {
     8     public static void main(String[] args) {
     9         Set<String> set = new HashSet<>();
    10         // 无序且不重复
    11         set.add("a");
    12         set.add("b");
    13         set.add("c");
    14         // 输出无序
    15         for (Iterator<String> it = set.iterator(); it.hasNext();) {
    16             System.out.println(it.next());
    17         }
    18         // 加入重复数据
    19         set.add("a");
    20         for (Iterator<String> it = set.iterator(); it.hasNext();) {
    21             System.out.println(it.next());
    22         }
    23 
    24         String s1 = new String("abc");
    25         String s2 = new String("abc");
    26 
    27         System.out.println(s1.equals(s2));
    28         System.out.println(s1.hashCode());
    29         System.out.println(s2.hashCode());
    30 
    31         String s3 = new String("ghj");
    32         System.out.println(s1.equals(s3));
    33         System.out.println(s3.hashCode());
    34 
    35     }
    36 }
  • 相关阅读:
    类单元实验?(不成功)
    类的组合
    实验2
    C++ work 1 switch and while
    Python 学习笔记 0308 周二:tuple,list,dict的区别
    Python 学习笔记 0307 周一:lambda函数和整数判断
    mac搭建python环境
    我也想犯这些错误【2】初始化之前变量的默认值
    毕业三年。
    我也想犯这些错误【1】c#的值类型和引用类型
  • 原文地址:https://www.cnblogs.com/jiasq/p/8540187.html
Copyright © 2011-2022 走看看