9:集合collection
第一 集合框架的概述
集合和数组的区别:
- 数组虽然可以存储对象,但是长度是固定的;集合长度是可变的
- 数组中能存储基本数据类型,集合只能存储对象,可以存储不同类型的对象。


- List、Set集合的共性方法:
从上图可以看出List和Set的父类是Collection,所以Collection所具备的方法就是他们所共有的共性方法
boolean |
hasNext()如果仍有元素可以迭代,则返回 true。 |
E |
next()返回迭代的下一个元素。 |
void |
remove()从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。 |
public class CollectionDemo {public static void main(String[] args) {Collection coll = new ArrayList();//子类可随便写,为了使用接口的使用方法Collection c1 = new ArrayList();Collection c2 = new ArrayList();show(c1,c2);}public static void show(Collection c1,Collection c2){//给c1添加元素c1.add("abc1");c1.add("abc2");c1.add("abc3");c1.add("abc4");//给c2添加元素c2.add("abc1");c2.add("abc2");c2.add("abc3");c2.add("abc4");c2.add("abc5");System.out.println("c1:"+c1);System.out.println("c2:"+c2);//演示addAll// c1.addAll(c2);//将c2中的元素添加到c1中//演示removeAll// boolean b = c1.removeAll(c2);//将两个集合中的相同元素从调用removeAll的集合中删除// System.out.println("removeAll:"+b);//演示containsAll// boolean b = c1.containsAll(c2);// System.out.println("containsAll:"+b);//演示retainAllboolean b = c1.retainAll(c2);//取交集,保留和指定的集合相同的元素,而删除不同的元素//和removeAll功能相反System.out.println("retainAll:"+b);System.out.println("c1:"+c1);}public static void show(Collection coll){//1,添加元素coll.add("abc1");coll.add("abc2");coll.add("abc3");System.out.println(coll);//2,删除元素// coll.remove("abc2");//会改变集合的长度,当清除的内容不存在时,返回原集合//清空集合// coll.clear();System.out.println(coll.contains("abc3"));System.out.println(coll);}public class IteratorDemo {public static void main(String[] args) {Collection coll = new ArrayList();coll.add("abc1");coll.add("abc2");coll.add("abc3");coll.add("abc4");// System.out.println(coll);//使用了Collection中的iterator()方法,调用集合中的迭代器方法,是为了获取集合中的迭代器对象// Iterator it = coll.iterator();// while(it.hasNext()){// System.out.println(it.next());// }for(Iterator it = coll.iterator(); it.hasNext(); ){System.out.println(it.next());//for循环的方式在内存中稍优于while,因为for循环中的局部变量随着for循环的消亡而消亡}// System.out.println(it.next());// System.out.println(it.next());// System.out.println(it.next());// System.out.println(it.next());// System.out.println(it.next());//java.util.NoSuchElementException 如果这样写没有下一个了就异常了}}
2、集合中存储的都是对象的引用(地址)
第二:list集合
1、常见的list集合有,"java09");
//删除指定位置的元素。 //al.remove(2); //修改元素。 //al.set(2,"java007"); //通过角标获取元素。 sop("get(1):"+al.get(1)); sop(al); //获取所有元素:有序的就可以用这样的取值方式,list特有的取出元素的方式之一 for(int x=0; x<al.size(); x++) { System.out.println("al("+x+")="+al.get(x)); } Iterator it = al.iterator(); while(it.hasNext()) { sop("next:"+it.next()); } //通过indexOf获取对象的位置。 sop("index="+al.indexOf("java02")); List sub = al.subList(1,3); sop("sub="+sub); } public static void main(String[] args) { //演示列表迭代器。 ArrayList al = new ArrayList(); //添加元素 al.add("java01"); al.add("java02"); al.add("java03"); //在迭代过程中,准备添加或者删除元素。 Iterator it = al.iterator(); //传入三个,有三个元素,加入一个元素,迭代器不知道加不加 while(it.hasNext()) { Object obj = it.next(); //接受一个元素 //用迭代器取出元素的同时,用集合的方式在操作元素,这样的并发访问有安全隐患,容易抛出异常 if(obj.equals("java02")) //可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作 //al.add("java008"); it.remove();//将java02的引用从集合中删除了,对象还在内存中,只是集合中没了 sop("obj="+obj); } ListIterator li = al.listIterator(); ,对人描述,将数据封装进人对象 2,定义容器,将人存入 3,取出
class GetSingleObject {public static void main(String[] args) {ArrayList<Per> list = new ArrayList<Per>();list.add(new Per("zhangsan01", 21));////obj接收,自动提升为obj,person成了上帝,这里报错了??list.add(new Per("zhangsan02", 22));list.add(new Per("zhangsan03", 23));list.add(new Per("zhangsan03", 23));list.add(new Per("zhangsan04", 24));System.out.println("remove:" + list.remove(new Per("zhangsan03", 23)));// remove底层也调用了equals进行比较// hashset中删除或包含一个元素都要判断该元素是否有和该元素中的元素相同,判断依据hashcode和equals// sop(list);// al= getsingleElement(al);// sop(al);// al.add(5);//1.4这样做al.add(new Integer(5));// 1.5以后集合可以装数据,自动装箱拆箱(当基本数据类型给引用数据类型装箱,当基本数据类型和引用数据类型做运算拆箱)}public static ArrayList getsingleElement(ArrayList al) {// 定义一个临时容器ArrayList temp = new ArrayList();// 迭代al集合Iterator it = al.iterator();while (it.hasNext()) {Object obj = it.next();if (!temp.contains(obj)) {// contains底层调用equals方法进行比较,看不懂了temp.add(obj);}}return temp;}class Per {private String name;// 定义姓名private int age;// 定义年龄Per(String name, int age) {this.name = name;this.age = age;}// 重写equals方法,建立Per类自己的比较方式public boolean equals(Object obj) {if (!(obj instanceof Per)) {throw new RuntimeException("类型错误");}Per p = (Per) obj;return p.getName().equals(this.name) && p.getAge() == this.age;}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;}}}
addFirst(); addLast();
getFirst(); getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst(); removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。
/*使用LinkedList模拟一个堆栈或者队列数据结构堆栈:先进后出 如同一个杯子队列:先进先出 First in First out FIFO 如同一个水管*/public class LinkedTest {public static void main(String[] args) {Duilie dl = new Duilie();dl.myAdd("java001");dl.myAdd("java002");dl.myAdd("java003");dl.myAdd("java004");while(!dl.isNull()){System.out.println(dl.myGet());}}}class Duilie{private LinkedList<String> link = new LinkedList<String>();public void myAdd(String str){link.addFirst(str);}public String myGet(){return link.removeLast();//removefirst}public boolean isNull(){return link.isEmpty();}
五、Vector:
枚举就是Vector特有的取出方式。发现枚举和迭代器很像。其实枚举和迭代是一样的。
因为枚举的名称以及方法的名称都过长。所以被迭代器取代了。枚举郁郁而终了。
带Element都是它特有的属性
public class VectorDemo {public static void main(String[] args) {- //枚举
Vector v = new Vector();v.addElement("abc1"); //比较长v.addElement("abc2");v.addElement("abc3");v.addElement("abc4");Enumeration en = v.elements();while(en.hasMoreElements()){System.out.println("nextelment:"+en.nextElement());}- // 迭代器
Iterator it = v.iterator();while(it.hasNext()){System.out.println("next:"+it.next());}}- }
第三 Set集合
一、概述:
Set集合元素是无序(存入和取出的顺序不一定一致,在哈希表中其实是按照hash值来存放的),元素不可以重复。Set接口中的方法和Collection一致。
二、Set集合常用子类之一HashSet:
1、概述:HashSet底层数据结构是哈希表,线程不同步。
2、HashSet保证元素唯一性:
是通过元素的两个方法,hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashcode值不同,不会调用equals。(先比较哈希值,哈希值一样比较是否是同一个对象,如不是同一个对象就存放在同一位置,两个串起来,放在同一个位置上)
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。(ArrayList只依赖equals)
一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法,建立对象判断是否相同的依据。
public class HashSetDemo {public static void main(String[] args) {HashSe hs = new HashSet();hs.add(new Course_1("java01", 26));hs.add(new Course_1("java02", 24));hs.add(new Course_1("java03", 28));hs.add(new Course_1("java04", 20));hs.add(new Course_1("java04", 20));//obj中的equals方法是比较内容,所以可以存入相同的元素,保证不了唯一,所以在Course_1中复写hscode和equals方法for (Iterator it = hs.iterator(); it.hasNext();) {Course_1 c = (Course_1) it.next();System.out.println(c.getName() + "::::" + c.getPrice());}}}/** 课程类*/class Course_1 {private String name;private int price;Course_1(String name, int price) {this.name = name;this.price = price;}public int hashCode() {return this.name.hashCode()(stringname有hashcode方法) + price * 20;// *20为了尽量保证哈希值不同,减少比较equals方法 ,姓名和年龄一起保证哈希值,减少第二次判断}public boolean equals(Object obj) { //人对象中的equalsif(this==obj){return ture}if (!(obj instanceof Course_1)) {throw new RuntimeException();}Course_1 c = (Course_1) obj;System.out.println(this.name + "....equals..." + c.getName());return c.getName().equals(this.name) && c.getPrice() == this.price;//字符串的equals,name就是字符串。当前对象和子对象进行比较}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}}

public class HashSetDemo {public static void main(String[] args) {LinkedHashSet<Object> set = new LinkedHashSet<>();set.add("abc");set.add("bdc");set.add("cdb");set.add("efc");Iterator<Object> iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());// abc、bdc、cdb、efc}}}
9:集合collection的更多相关文章
- Guava库介绍之集合(Collection)相关的API
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...
- 【再探backbone 02】集合-Collection
前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...
- 5、数组和集合--Collection、Map
一.数组:同一个类型数据的集合,其实他也是一个容器 1.数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些数据 2.数组的定义: 在Java中常见: 格式1: 类型 [] 数组名 = ne ...
- WCF分布式开发步步为赢(8):使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据
数据集(DataSet).数据表(DataTable).集合(Collection)概念是.NET FrameWork里提供数据类型,在应用程序编程过程中会经常使用其来作为数据的载体,属于ADO.NE ...
- 在含有null值的复杂类的集合(Collection)中取最大值
在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较.取最大值或最小值. 举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素: public class Clas ...
- 集合Collection总览
前言 声明,本文使用的是JDK1.8 从今天开始正式去学习Java基础中最重要的东西--->集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的 ...
- java中集合Collection转list对象
参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...
- java基础27 单例集合Collection及其常用方法
1.集合 集合是存储对象数据的集合容器 1.1.集合比数组的优势 1.集合可以存储任意类型的数据,数组只能存储同一种数据类型的数据 2.集合的长度是变化的,数组的长度是固定的 1.2.数组:存储 ...
- 18_java之集合Collection
01集合使用的回顾 *A:集合使用的回顾 *a.ArrayList集合存储5个int类型元素 public static void main(String[] args) { ArrayList< ...
- 集合--Collection接口详解&&迭代器
/* * 集合的顶层接口--Collection接口 * 添加 * add() * addAll() * * 遍历集合 * iterator() 迭代器 * * 删除 * remove() * rem ...
随机推荐
- Http协议和Https协议的安全性问题
https://www.cnblogs.com/intsmaze/p/6009648.html https://blog.csdn.net/jeffleo/article/details/768630 ...
- 【Java】获取二维数组行列长度
二维数组int array[][] = new int[3][3]; 行长度:array.length 列长度:array[i].length
- spark 算子之RDD
map map(func) Return a new distributed dataset formed by passing each element of the source through ...
- 通过msyql proxy链接mysql中文乱码及session问题
1.session问题 问题前提:一台机数据库为两个实例,通过不同的socket监听不同端口对外提供服务.不同的站点都访问同一个VIP不同的端口进行访问数据库. 故障现象:一旦有一个站点先用了这个vi ...
- 最小生成树求最大比率 UVALive - 5713
题目链接:https://vjudge.net/problem/UVALive-5713 题意:给出t组数据,每组数据第一行给出一个n,表示点的数量,接下来n行,每行有三个数字,分别是点的坐标x,y和 ...
- IntelliJ IDEA常用快捷键(Mac)
Mac 键盘符号和修饰键说明 ⌘ ——> Command ⇧ ——> Shift ⌥ ——> Option ⌃ ——> Control ↩︎ ——> Return/Ent ...
- Python集合(set)类型的操作 (转)
python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...
- python基础之Day7part1集合
一.集合 1.定义 s=set() 2.特点 每个元素必须是不可变类型,但集合本身是可变类型的,有add和remove等功能 3.用途 去重(原理:for循环if判断元素是否已存在,不存在则追加) 关 ...
- rabbit初学之连接测试2
com.rabbitmq.client.ShutdownSignalException: connection error 发现,port是5672,不是15672(15672是后台管理平台的端口)
- rabbitmq初学之连接测试
Login was refused using authentication mechanism PLAIN. 用户名或密码没有设置,或者错误