Java学习入门-05 -集合浅析

集合数据结构体系框架

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<String> 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<T> {

public void print(Collection&lt;T&gt; 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&lt;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<String> queue = new LinkedList<String>();
//添加元素
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<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

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

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

例子:
按照键值遍历

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

原文地址:https://blog.51cto.com/13238147/2474382

时间: 2025-01-14 14:53:16

Java学习入门-05 -集合浅析的相关文章

java学习----入门概念

1.关于java语言的基本概念 java,面向对象,跨平台,适合分布式计算,解释型语言,具有多线程处理能力和较高的安全性. JVM (java virtual machine) java虚拟机, 能够运行java bytecode的虚拟机,是java平台的一部分.JVM屏蔽来与具体os相关的信息,使得java 程序只需生成在java虚拟机上运行的bytecode 当我们运行一个程序时,JVM负责将字节码转换为特定机器代码 何为虚拟机?即抽象化的计算机 java平台: 用java语言编写的软件赖以

黑马程序员——JAVA学习笔记八(集合)

1,    JAVA最初版本只为最常用的数据结构提供了很少的一组类:Vector.Stack.Hashtable.BitSet与Enumeration接口,从JAVA1.2版本开始推出了一组功能完善的的数据结构. 集合类的由来:  对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定.  就使用集合容器进行存储. 集合特点: 1,用于存储对象的容器. 2,集合的长度是可变的. 3,集合中不可以存储基本数据类型值. 4,接口与实现相互分离. 集合框架是为表示和操作集合而规定的一种统一的标准

java学习——入门扫盲篇

概要 近期这几天開始进入java的学习,接触到了好多不是非常了解的概念,像JDK.JRE.JVM.GC等等这些,放到这里来进行下扫盲. java java是一种面向对象程序设计语言和java平台的总称,即java包含java语言和java平台. java语言 java语言跟我们曾经接触过的C#.C++语言一样都是面向对象的语言,拥有面向对象语言的基本特点,java语言也有它自身的特点.比如添加了垃圾回收的一些特点. 同一时候java语言的编程风格跟C#.C++也特别的相似,全部java语言是比較

【原】Java学习笔记026 - 集合

1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 // 需求:从三国演义中评选出四个最帅的武将,并存储下来 6 7 // 因为具备了面向对象的思想,所以创建四个对象来存储 8 Hero hero1 = new Hero("张飞", 18); 9 Hero hero2 = new Hero("赵云", 16); 10 Her

Java学习入门--(1)JDK、JRE、JVM三者间的关系

学习JAVA前必须了解Java跨平台特性,Java 为什么能跨平台,实现一次编写,多处运行?Java 能够跨平台运行的核心在于 JVM(Java虚拟机) .不是 Java 能够跨平台,而是它的 jvm 能够跨平台运行.我们知道,不同的操作系统向上的 API 肯定是不同的,那么如果我们想要写一段代码调用系统的声音设备,就需要针对不同系统的 API 写出不同的代码来完成动作. 而 Java 引入了字节码的概念,jvm 只能认识字节码,并将它们解释到系统的 API 调用.针对不同的系统有不同的 jvm

Java学习日记-11 集合(1)

Collection接口集合中存储的只是对象的引用,不是对象本身. 1.ArrayList<E>类1.1ArrayList和Collection的关系 public interface List<E>extends Collection<E> public class ArrayList<E> implements List<E> 1.2构造方法 ArrayList() 构造一个初始容量为 10 的空列表. ArrayList(Collectio

Java学习之利用集合发牌小练习

/* * 思路: * A:创建一个HashMap集合 * B:创建一个ArrayList集合 * C:创建花色数组和点数数组 * D:从0开始往HashMap里面存储编号,并存储对应的牌同时往ArrayList里面存储编号即可. * E:洗牌(洗的是编号) * F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收) * G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌) */ 1 package com.swust.集合; 2 3 import j

java基础入门-多线程同步浅析-以银行转账为样例

在说之前先普及一下线程是什么? 线程:说白了就是一个任务片段 进程:是一个具有独立功能的程序关于某个数据集合的一次执行活动.一个进程有一个或者多个线程 线程与进程的本质差别就是有么有数据共享空间.线程之间能够共享数据.进程不能够 以下进入主题:线程间的同步 因为如今业务流程添加.业务节点也添加.使用业务的人员也同一时候添加.这个时候就不可避免的出现并发问题,多个线程同一时候訪问操作某一个数据单元 我们以银行转账为例说明,以下先上代码: 建立一个银行的类,里面主要包含三个方法,一个是转账,一个是得

java基础入门-多线程同步浅析-以银行转账为例子

在说之前先普及一下线程是什么? 线程:说白了就是一个任务片段 进程:是一个具有独立功能的程序关于某个数据集合的一次运行活动,一个进程有一个或者多个线程 线程与进程的本质区别就是有么有数据共享空间,线程之间可以共享数据,进程不可以 下面进入主题:线程间的同步 由于现在业务流程增加,业务节点也增加,使用业务的人员也同时增加,这个时候就不可避免的出现并发问题,多个线程同时访问操作某一个数据单元 我们以银行转账为例说明,下面先上代码: 建立一个银行的类,里面主要包括三个方法,一个是转账,一个是得到现有银