Java中的集合有哪几种?
admin
2023-02-13 14:20:09
0

集合数据结构体系框架

Java中的集合有哪几种?

Collection接口是List/Set/Queue接口的父接口,其中定义的常用的操作方法有(注意此处笔记不完整,演示代码没有导包):

  • 添加功能
     i. boolean add(object obj)添加一个元素
     ii. boolean addAll(Collection c)将集合c的全部元素添加到原集合元素后返回true
     iii. 添加功能永远返回true
  • 删除功能
     i. void clear();移除所有元素
     ii. boolean remove(Object o)移除一个元素
     iii. boolean removeAll(Collection c)移除一个集合的元素,只要有一个被移除就返回true,改变原集合,删除原集合中和c中相同的元素
     iv. 删除功能只有删除成功后才返回true
  • 判断功能
     i. boolean contain(object o)判断集合中是否包含指定的元素。
     ii. boolean containsAll(Collection c)判断原集合中是否包含指定集合c的所有元素,有则true,
     iii. boolean isEmpty()判断集合是否为空
  • 获取功能
     i. Iterator iterator()迭代器,集合的专用方式,实现遍历的功能
     ii. Object next()获取当前元素,并移动到下一个位置
     iii. boolean hasNext()判断此位置是否有元素
     iv. 迭代器遍历实例在下面
    f) 长度功能
     i. int size()元素的个数
     ii. 数组和字符串中都是length()方法获取元素个数,集合中是size()方法
      因为object包括集合、字符串、数组,所以其不能直接用length方法。
  • 交集功能boolean retainAll(Collection c)
     两个集合交集的元素给原集合,并判断原集合是否改变,改变则true,不变则false
  • 把集合转换为数组
     i. Object [] toArray()

1、Set代表元素无序、不可重复的集合

(1)HashSet是Set接口的典型实现,线程执行是非安全的,集合元素可以为null
(2)HashSet通过过两个方法hashCode()和equals()保证元素的唯一性,方法自动生成。当存储对象时则无法确保唯一性,可能需要重写hashCode。
(3)TreeSet是Set接口实现
   + 1. 底层数据是红黑二叉树
   + 2. 排序方式:自然排序、比较器排序
   + 3. 通过比较返回值是否为0来保证元素的唯一性。
例子:

//使用HashSet类随机产生10个不重复的1到20的不重复随机数
public class HashSetDemo {
public static void main(String[] args) {
Random r=new Random();

  HashSet <Integer> hs=new HashSet<Integer>();

  while(hs.size()<10) {
      hs.add((r.nextInt(20)+1));
  }
  for(Integer i:hs) {
      System.out.println(i);
  }

}

}

2、List代表元素有序、可以重复的集合

案例:main()方法中代码

Collection lists = new ArrayList<>();
lists.add("集合lists测试1");
lists.add("集合lists测试2");
lists.add("集合lists测试3");

    CollectionAll listall = new CollectionAll();
    listall.print(lists);

CollectionAll类如下:

package com.paint.test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class CollectionAll {

public void print(Collection<T> lists){
    for(T o:lists){
        System.out.println(o);
    }
}

}

利用集合的迭代器遍历(优势是不会轻易改变集合实参值)

public class InteratoeDemo {
public static void main(String[] args) {

  //Collection集合的遍历
  Collection c=new ArrayList();
  c.add("java01");
  c.add("java02");
  c.add("java03");

  Iterator i=c.iterator();

  while(i.hasNext()) {
      //向下转型
      String s=(String) i.next();
      System.out.println(s);
  }
  System.out.println("-----------------");
  //List集合的遍历
  List l=new ArrayList();

  l.add(0,"测试01");
  l.add(1,"测试02");
  l.add(1,"java集合测试");

  ListIterator li=l.listIterator();

  //后向遍历
  while(li.hasNext()) {
      String s=(String)li.next();
      System.out.println(s);
  }
  System.out.println("-----------------");

  //前向遍历
  while(li.hasPrevious()) {
      String s=(String)li.previous();
      System.out.println(s);
  }
  System.out.println("-----------------");

  //get方法遍历
  for(int x=0;x<l.size();x++) {
      String s=(String)l.get(x);
      System.out.println(s);

  }

}
}

3、Queue队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList类实现了Queue接口。

public class Main {
public static void main(String[] args) {
//add()和remove()方法在失败的时候会抛出异常(不推荐)
Queue queue = new LinkedList();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("element="+queue.element()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("peek="+queue.peek()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
}
}

4、Map用于保存映射关系的数据

  • Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。
  • TreeMap是有序的,HashMap和HashTable是无序的。
  • Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。

HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

注意:Map接口中的集合都有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量的数据类型可以相同,也可以不同。

例子:
按照键值遍历

public class MapDemo {
public static void main(String[] args) {
//创建Map对象
Map map = new HashMap();
//给map中添加元素
map.put("a", "孙俪");
map.put("b", "范冰冰");
map.put("c", "柳岩");
//获取Map中的所有key
Set keySet = map.keySet();
//遍历存放所有key的Set集合
Iterator it =keySet.iterator();    
while(it.hasNext()){                         //利用了Iterator迭代器

//得到每一个key
String key = it.next();
//通过key获取对应的value
String value = map.get(key);
System.out.println(key+"="+value);
}
}
}

按照键值对遍历

public class MapDemo {
public static void main(String[] args) {
//创建Map对象
Map map = new HashMap();
//给map中添加元素
map.put("a", "孙俪");
map.put("b", "范冰冰");
map.put("c", "柳岩");
//获取Map中的所有key与value的对应关系
Set> entrySet = map.entrySet();
//遍历Set集合
Iterator> it =entrySet.iterator();
while(it.hasNext()){
//得到每一对对应关系
Map.Entry entry = it.next();
//通过每一对对应关系获取对应的key
String key = entry.getKey();
//通过每一对对应关系获取对应的value
String value = entry.getValue();
System.out.println(key+"="+value);
}

相关内容

热门资讯

山西发布山洪蓝色预警,涉8市4... 2026年7月24日下午,山西省水利厅和山西省气象局联合发布山洪灾害气象风险预警,预计未来12小时,...
中央决定:华润集团董事长调整 2026年7月23日,华润(集团)有限公司召开中层以上管理人员大会。中央组织部有关负责同志宣布了党中...
学习笔记丨“努力让每个孩子都能... 制作:王宇峰 岳小乔 贾雪
活力中国调研行丨一束“光”的故... 它被称为“最快的刀”“最准的尺”“最亮的光”。从一束“光”到一颗“芯”,再到规模千亿的产业集群,今天...
携手前沿技术 共创智能未来 携手前沿技术 共创智能未来 ——来自2026年世界互联网大会数字丝路发展论坛的声音 夏日长安,秦岭叠...
上海浩劢取得桌面式轻型悬臂吊专... 国家知识产权局信息显示,上海浩劢工业科技有限公司取得一项名为“桌面式轻型悬臂吊”的专利,授权公告号C...
毒油风暴未歇民进党却急着上架,... 海峡导报综合报道 岛内毒油食安风暴持续延烧,台北市长蒋万安持续号召民众7·25上凯道,但“食药署”2...
WAIC挤满“卖铲人”,但算力... 2026年的WAIC,机器人依然抢占了绝大多数镜头。但展馆里数量增长最快的,是自称“AI Infra...
对话芯展速许玮:“内存墙”下,... Token经济时代,衡量AI价值的标准,正从模型能力转向Token生产效率。AI因此从工具演变为新的...
菲尔兹奖得主邓煜写过这些诗词 邓煜 李少君 徐俪成 | 澎湃新闻记者 徐萧 整理北京时间7月23日晚,中国数学家王虹、邓煜获颁菲尔...