java中的集合框架(Set、List、Map)及其实现类

简介: java中的集合框架(Set、List、Map)及其实现类

Java中集合框架包括Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

集合框架:


Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为集合框架。


程序员在具体应用的时候,不必考虑数据结构和算法实现细节,只需要用这些类创建一些对象,然后直接应用就可以了,这样就大大提高了编程效率。


集合框架常用的内容有:

集合框架接口:

Collection:集合的根结点,元素是Object,没有实现类。存储的对象可以重复,但是没有顺序!

常用方法:

   add(E e) :向集合中添加一个元素,返回值类型为:boolean
   contains(Object o):判断集合中是否包含某个元素,返回值类型为:boolean
   remove(Object o): 移除某一个元素 ,返回值类型为:boolean
   size() :返回集合中的有效元素个数,返回值类型为:int

List接口:

元素有顺序有下标,内容可以重复。

常用方法:

  void add(int index, E element):向指定位置处添加元素,无返回值类型
  get(int index):根据下标获取对应的元素,返回值类型为:Object
  indexOf(Object o)  :返回指定元素对应的第一次出现下标,若没有返回-1,返回值类型为:int
  E remove(int index) :移除指定下标处对应的元素
  E set(int index, E element):向指定位置处添加元素并且覆盖原来的元素,更改

List接口的三个常用实现类:

    ArrayList      数组实现,查询快,增删慢 
                 jdk 1.2   线程不安全的,轻量级实现,运行效率高            
    LinkedList     链表实现,查询慢,增删快 
    Vector         数组实现,查询快,增删慢
             jdk1.0  线程安全的,重量级实现,运行效率低

下面看一下ArrayList的增删改查操作:

package test;
import java.util.ArrayList;
public class testArrayList {
  /**
   * 集合框架
   * 集合:一个对象,用来储存其他多个对象
   *  ArrayList 能更好的代替数组
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    ArrayList<String> list = new ArrayList<String>();
    //新增
    list.add("今天周日");
    list.add("明天周一");
    list.add(0, "昨天周六");
    //修改
    list.set(1, "今天周日不上晚自习");
    System.out.println(list);
    //查找
    System.out.println(list.get(1));
    //删除
    System.out.println(list.remove(2));
    //遍历
    for (String string : list) {
      System.out.println(string);
    }
  }
}

linkedList和Vector的增删改查都是一样的

Set接口:

无序无下标,元素不可以重复

set接口的方法都是从Collection接口中继承而来,

     add(E e) :向集合中添加一个元素,返回值类型为:boolean
     contains(Object o):判断集合中是否包含某个元素,返回值类型为:boolean
     remove(Object o): 移除某一个元素 ,返回值类型为:boolean
     size() :返回集合中的有效元素个数,返回值类型为:int

HashSet实现类的简单增删改查以及常用方法:

package test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
public class test {
  /**
   * Set 元素无顺序 内容不可重复
   * 方法全部继承自Collection接口
   * 遍历:迭代遍历或者for-each遍历  
   */
  public static void main(String[] args) {
    //set中判断元素不重复值的是元素内容不重复
    //Set<String> set = new HashSet<>();
    Set<String> set = new LinkedHashSet<>();
    String s1 = new String("aaa");
    String s2 = new String("bbb");
    String s3 = new String("ccc");
    String s4 = new String("aaa");
    set.add(s1);
    set.add(s2);
    set.add(s3);
    set.add(s4);  
    //forEach遍历
    for (String string : set) {
      System.out.print(string+"\t");
    }
    System.out.println();
    //删除操作
    set.remove(s3);
    //看set中是否包含一个对象
    System.out.println(set.contains(s4));
    //再次添加
    System.out.println(set.add("aaa"));
    //迭代遍历
    Iterator<String> it = set.iterator();
    while(it.hasNext()){
      System.out.print(it.next()+"\t");
      /*Object o = it.next();
      System.out.println(o);*/  
    } 
  }
}

TreeSet:

对Set集合进行按照一定顺序进行从小到大排列:

比如说下面的程序,Set中放一个Worker对象,要想使他进行排列必须得先指定他按照什么顺序排列,先先给他一个排序规则这样JVM才知道要怎么做。也就是Worker类要实现 Comparable接口

package test;
import java.util.Set;
import java.util.TreeSet;
public class TestTreeMap2 {
  public static void main(String[] args) {
    Set<Worker> set = new TreeSet<Worker>();  //对元素进行升序排列
    set.add(new Worker("hansf",38,10.0));
    set.add(new Worker("awang",48,20.0));
    set.add(new Worker("kangkang",36,30.0));
    set.add(new Worker("make",58,40.0));
    set.add(new Worker("songtf",58,50.0));
    //遍历
    for(Worker worker:set){
      System.out.println(worker);
    }
  }
}
//要实现Comparable接口才可以进行按照规则排序!!!!!
public class Worker implements Comparable<Worker>{
  private String name;
  private int age;
  private double salary;
  public Worker(String name, int age, double salary) {
    super();
    this.name = name;
    this.age = age;
    this.salary = salary;
  }
  public Worker() {
    super();
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public double getSalary() {
    return salary;
  }
  public void setSalary(double salary) {
    this.salary = salary;
  }
  public void work(){
    System.out.println(name+"work");
  }
  @Override
  public String toString() {
    return "Worker [name=" + name + ", age=" + age + ", salary=" + salary
        + "]";
  }
    return false;
    } else if (!name.equals(other.name))
      return false;
    if (Double.doubleToLongBits(salary) != Double
        .doubleToLongBits(other.salary))
      return false;
    return true;
  }
  @Override
  public int compareTo(Worker o) {
//    比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
    //以年龄为例
    if(this.age<o.getAge()){
      return -1;
    }else if(this.age==o.getAge()){
      if(this.salary<o.getSalary()){
        return -1;
      }else if(this.salary==o.getSalary()){
        return 0;
      }else{
        return 1;
      }
    }else{
      return 1;
    }
  }
}

Map集合

Map集合的一个元素是由一个键(key)和一个值(value)组成的

key不允许重复,value允许重复

Map集合常用方法:

    V put(K key, V value) :向集合中添加一个元素,
    若集合中包含这个key,使用v覆盖掉,并且返回原来key所对应的value
    V remove(Object key):根据key删除集合中元素,并且返回删除的value
    size():获取集合中有效的键值对个数    
    boolean containsKey(Object key) :如果此集合包含指定键所对应的键值对,则返回 true。 
    boolean containsValue(Object value) : 如果集合中包含对应的value 则返回true

遍历方式

①键遍历 能够获取到键和值

1.键遍历

获取所有的key对应的set集合 Set keySet()

Set<Integer> set = map.keySet();

循环遍历set集合 获取key 还可以根据key获取对应的value

    for(Integer key:set){
          String value = map.get(key);  //根据键获取值
          System.out.println(key+"----"+value);  //获取所有的key
        }

2值遍历 只能够获取到值(value)

获取所有的value 存放在集合中

Collection<String> values = map.values();

遍历集合

for(String value:values){
      System.out.println(value);
    }

键值对遍历 能够获取到键和值

将key和value 封装成一个对象Map.Entry<Integer,String>,把封装的对象存放在集合里面

entrySet() :能够获取 键值对对象 存放的集合

Set<Map.Entry<Integer, String>> set = map.entrySet();

遍历集合 获取对应键和值

    for(Map.Entry<Integer, String> entry:set){
          Integer key = entry.getKey();
          String value = entry.getValue();
          System.out.println(key+"---"+value);
        }

Map的常用方法示例:

package test;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class testMap {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Map<String, Integer> map = new HashMap<String, Integer>();
    //增
    map.put("a", 1);
    map.put("b", 2);
    map.put("c", 3);
    map.put("d", 4);
    map.put("e", 5);
    //查
    System.out.println(map.get("c"));
    //改
    map.put("c", 33);
    System.out.println(map.get("c"));
    //删
    map.remove("d");
    //遍历
    System.out.println(map);
    //查找map中是否包含指定的key
    System.out.println(map.containsKey("e"));
    //查找map中是否包含指定的value
    map.containsValue("5");
    //长度
    System.out.println(map.size());
    System.out.println();
    //遍历key
    System.out.println("遍历key");
    Set<String> set = map.keySet();
    for (String string : set) {
      Integer val = map.get(string);
      System.out.print(string+"\t"+val+"\n");
    }
    System.out.println();
    //遍历value
    System.out.println("遍历value:");
    Collection<Integer> values = map.values();
    for (Integer integer : values) {
      System.out.print(integer+"\t");
    }
    System.out.println();
    System.out.println("遍历键值对:");
    Set<Entry<String,Integer>> set2 = map.entrySet();
    for (Entry<String, Integer> entry : set2) {   
      System.out.println(entry);
    } 
  }
}

Map实现类 之间的区别、


HashMap JDk1.2 线程不安全 轻量级实现 运行效率高 允许key和value为null值

自定义的类型作为key时,必须重写hashCode和equals方法


LinkedHashMap JDK1.2

自定义的类型作为key时,必须重写hashCode和equals方法

保证遍历的顺序跟添加的顺序一致


TreeMap JDK1.2

保证遍历的顺序为key升序排列后的结果

自定义的类型作为key时,需要实现Comparable接口,以及实现compareTo方法


Propertis jdK 1.0

键和值都必须是String类型,通过用来读取配置文件时


HashTable jdK 1.0 线程安全 重量级实现 运行效率低 不允许key和value为null


目录
相关文章
|
3月前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
64 3
|
3天前
|
Java
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
使用 entrySet 遍历 Map 类集合 KV
使用 entrySet 遍历 Map 类集合 KV
|
3月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
91 18
你对Collection中Set、List、Map理解?
|
3月前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
84 20
|
3月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
78 5
|
4月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
89 4
|
4月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
72 2
|
4月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
5天前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
28 2

热门文章

最新文章