一、集合的出现

1.1、集合简述

面向对象语言对事物的体现都是以对象形式,为了方便对多个对象的操作,就对象对象进行存储,集合就是存仪储对象最常用的一种试

1.2、数组和集合都是容器

数组也存对象,存储同一种类型,但数组是固定长度的,集合长度是可变。

数组中可以存储基本数据类型,集合只能存储对象

1.3、集合特点

集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

1.4、结构

二、集合共性方法

2.1、Collection接口顶级

Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 SetList)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

2.2、共性方法

方法摘要
boolean add(E e)
确保此 collection 包含指定的元素(可选操作)。
boolean addAll(Collection<? extends E> c)
将指定
collection 中的所有元素都添加到此 collection 中(可选操作)。
void clear()

移除此 collection 中的所有元素(可选操作)。
boolean contains(Object o)

如果此 collection 包含指定的元素,则返回 true
boolean containsAll(Collection<?> c)

如果此 collection 包含指定 collection 中的所有元素,则返回 true
boolean equals(Object o)

比较此 collection 与指定对象是否相等。
int hashCode()

返回此 collection 的哈希码值。
boolean isEmpty()

如果此 collection 不包含元素,则返回 true
Iterator<E> iterator()

返回在此 collection 的元素上进行迭代的迭代器。
boolean remove(Object o)

从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
boolean removeAll(Collection<?> c)

移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
boolean retainAll(Collection<?> c)

仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
int size()

返回此 collection 中的元素数。
Object[] toArray()

返回包含此 collection 中所有元素的数组。
<T>
T[]
toArray(T[] a)

返回包含此 collection
中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

 2.3、ArrayList示例

import java.util.*;

class CollectionDemo {
public static void main(String[] args) {
// 声明2个集合容器,并添加元素
List<String> ar1 = new ArrayList<String>();
ar1.add("a");
ar1.add("b");
ar1.add("c");
ar1.add("d");
ar1.add("e");
// 遍历
sop("ar1遍历:");
getIterator(ar1); List<String> ar2 = new ArrayList<String>();
ar2.add("a");
ar2.add("b");
ar2.add("f");
ar2.add("q");
ar2.add("w");
// 增强for循环遍历
sop("ar2遍历:");
getFor(ar2); // 求集合的长度
sop("ar1的长度:" + ar1.size());
sop("ar2的长度:" + ar2.size());
// 比较判断
sop("ar1中有字符a吗 : " + ar1.contains("a"));
// 整个集合比较
sop("ar1中有字符ar2吗 : " + ar1.containsAll(ar2));
// 求交集
ar1.retainAll(ar2);
sop("求交集");
getFor(ar1);
// addALL
ar1.addAll(ar2);
// 增强for循环遍历
sop("添加ar2后的ar1:");
getFor(ar1); // 删除
ar1.remove("c");
sop("ar1删除指定c后");
getFor(ar1);
sop("ar1删除指定集合");
ar1.removeAll(ar2);
getFor(ar1);
sop("ar1是空吗?" + ar1.isEmpty());
// 清空
ar1.clear();
sop(ar1.size());
} // iterator遍历集合
public static void getIterator(List<String> list) {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
sop(str);
}
} // forEach遍历
public static void getFor(List<String> list) {
for (String str : list) {
sop(str);
}
} // 打印
public static void sop(Object obj) {
System.out.println(obj);
}
}

结果:

ar1遍历:
a
b
c
d
e
ar2遍历:
a
b
f
q
w
ar1的长度:5
ar2的长度:5
ar1中有字符a吗 : true
ar1中有字符ar2吗 : false
求交集
a
b
添加ar2后的ar1:
a
b
a
b
f
q
w
ar1删除指定c后
a
b
a
b
f
q
w
ar1删除指定集合
ar1是空吗?true
0

2.4、Iterator

方法摘要
boolean hasNext()
如果仍有元素可以迭代,则返回 true
E next()

返回迭代的下一个元素。
void remove()

从迭代器指向的 collection
中移除迭代器返回的最后一个元素(可选操作)。

 2.5、ArrayList

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; /**
* List:元素是有序的,元素可以重复,该集合体系有索引
* Set:元素是无序,元素不可以重复
* List:
* 特有方法:可以操作索引的方法都 是特有
* add(index ,element)
* addAll(index,Collection);
* remove (index)
* set(index,element)
* get(index);
* subList(from,to)
* listIterator()
*
*
*/
public class ListDemo { public static void main(String[] args) {
//add();
//remove();
//set();
//getIndex();
indexSub();
} //indexOf和subList
public static void indexSub(){
List<String> list=new ArrayList<String>();
//添加元素
list.add("java01");
list.add("java02");
list.add("java03");
list.add("java04");
list.set(2,"hello");
sop(list.indexOf("java04"));//
sop(list.indexOf("java09"));//-1
sop(list.lastIndexOf("hello"));//
List<String> subList=list.subList(1, 3);
sop(subList);//hello,java03
} //遍历
public static void getIndex(){
List<String> list=new ArrayList<String>();
//添加元素
list.add("java01");
list.add("java02");
list.add("java03");
list.add("java04");
list.set(2,"hello");
//循环遍历,通过索引的方式遍历和数组一样
for(int x=0;x<list.size();x++){
sop("list["+x+"]="+list.get(x));
} } //修改
public static void set(){
List<String> list=new ArrayList<String>();
//添加元素
list.add("java01");
list.add("java02");
list.add("java03");
list.add("java04");
list.set(2,"hello");
//遍历
get(list);
}
//删除元素
public static void remove(){
List<String> list=new ArrayList<String>();
//添加元素
list.add("java01");
list.add("java02");
list.add("java03");
list.add("java04");
list.remove(2);
//遍历
get(list);
} //添加元素
public static void add(){
List<String> list=new ArrayList<String>();
//添加元素
list.add("java01");
list.add("java02");
list.add("java03");
//遍历
get(list);
//在指定位置添加
list.add(1,"java09");
//遍历
System.out.println("========在指定位置添加后==========");
get(list);
}
//遍历
public static void get(List<String> list){
for(Iterator<String> it=list.iterator();it.hasNext();){
sop(it.next());
}
}
public static void sop(Object obj){
System.out.println(obj);
} }

2.6、列表迭代器 listIterator

iterator,只能做判断、删除、取出,不能做其它操作

listIterator

public ListIterator<E> listIterator(int index)

返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。指定的索引表示 next 的初始调用所返回的第一个元素。previous 方法的初始调用将返回索引比指定索引少 1 的元素。

此实现返回 ListIterator 接口的直接实现,扩展了由 iterator() 方法返回的 Iterator 接口的实现。ListIterator 实现依赖于底层实现列表的 get(int)set(int, E)add(int, E)remove(int) 方法。

注意,除非重写列表的 remove(int)set(int, E)add(int, E) 方法,否则此实现返回的列表迭代器将抛出 UnsupportedOperationException 来响应其 removesetadd 方法。

根据 (protected) modCount 字段规范中的描述,在面临并发修改时,可以使此实现抛出运行时异常。

方法摘要
void add(E e)
将指定的元素插入列表(可选操作)。
boolean hasNext()

以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next
返回一个元素而不是抛出异常,则返回 true)。
boolean hasPrevious()

如果以逆向遍历列表,列表迭代器有多个元素,则返回 true
E next()

返回列表中的下一个元素。
int nextIndex()

返回对 next 的后续调用所返回元素的索引。
E previous()

返回列表中的前一个元素。
int previousIndex()

返回对 previous 的后续调用所返回元素的索引。
void remove()

从列表中移除由 nextprevious
返回的最后一个元素(可选操作)。
void set(E e)
用指定元素替换
nextprevious 返回的最后一个元素(可选操作)。
package com.pb.list.demo1;

import java.util.ArrayList;
import java.util.List;
import java.util.*; public class ListIteratorDemo { public static void main(String[] args) {
List<String> list=new ArrayList<String>();
//添加元素
list.add("java01");
list.add("java02");
list.add("java03");
list.add("java04");
list.add("java05");
//获取listIterator迭代器
ListIterator<String> listIterator=list.listIterator();
while(listIterator.hasNext()){
if(listIterator.next().equals("java02")){//判断
//修改
listIterator.set("java007");
//添加
listIterator.add("hello");
} }
sop(list);
//倒序输出遍历
while(listIterator.hasPrevious()){
sop(listIterator.previous());
} }
public static void sop(Object obj){
System.out.println(obj); } }

2.7、Vector

package com.pb.list.demo1;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector; public class VectorDemo { public static void main(String[] args) {
Vector<String> vector=new Vector<String>();
//添加元素
vector.add("java01");
vector.add("java02");
vector.add("java03");
vector.add("java04");
vector.add("java05"); //获取枚举
Enumeration<String> en=vector.elements();
while(en.hasMoreElements()){
System.out.println(en.nextElement());
} } }

2.8、LinkedList

package com.pb.list.demo1;

import java.util.LinkedList;

/**
* LinkedList特有方法:
* 添加元素到第一个索引位置 addFirst();
* 添加元素到最后一个索引位置 addLast();
* 获取索引为0的元素 getFirst();
* 获取索引最后的元素 getLast();
* 删除索引为0的元素 removeFirst();
* 删除索引为size()-1的元素 * removeLast();
*/ public class LinkedListDemo { public static void main(String[] args) {
// 声明一个链表集合
LinkedList<String> list = new LinkedList<String>();
// 添加到第一个元素
list.addFirst("1");
list.add("2");
list.add("3");
sop(list);// 3,2,1
// 将元素添加到最后
list.addLast("6");
list.addLast("5");
list.addLast("4");// 3,2,1,6,5,4
sop(list);// 获取第一个元素
sop(list.getFirst());//3
// 获取最后一个元素
sop(list.getLast());// 4
// 删除第一个元素
sop(list.removeFirst());
// 删除最后一个
sop(list.removeLast());
sop(list);// 2,1,6,5 /*
* 获取集合全部元素,不使用迭代器
*/
while (!list.isEmpty()) {
list.removeFirst();// list.removeLast();
} } public static void sop(Object obj) {
System.out.println(obj);
}
}

removeFirst或者removeLast

public E removeFirst()

移除并返回此列表的第一个元素。

指定者:
接口 Deque<E> 中的 removeFirst

返回:

此列表的第一个元素

抛出:

NoSuchElementException - 如果此列表为空

JDK 1.6之后提供了新的方法

pollFirst或者pollLast

public E pollFirst()
获取并移除此列表的第一个元素;如果此列表为空,则返回 null

指定者:
接口 Deque<E> 中的 pollFirst
返回:
此列表的第一个元素;如果此列表为空,则返回 null
从以下版本开始:
1.6 

示例

package com.pb.list.demo1;

import java.util.LinkedList;
/**
* JDK 1.6提供了新的方法
* offerFirst(),添加元素到第个
* offerLast(),添加元素到最后一位
*
* peekFirst()获取第一个元素
* peekLast()获取最后一个元素
*
* pollFirst()删除第一个元素
* pollLast()删除最后一个元素
*
*/
public class LinkedListDemo1 { public static void main(String[] args) { // 声明一个链表集合
LinkedList<String> list = new LinkedList<String>();
// 添加到第一个元素
list.offerFirst("1");
list.offerFirst("2");
list.offerFirst("3");
sop(list);// 3,21
// 将元素添加到最后
list.offerLast("6");
list.offerLast("5");
list.offerLast("4");// 3,2,1,6,5,4
sop(list);
// 获取第一个元素
sop(list.peekFirst());// 3
// 获取最后一个元素
sop(list.peekLast());// 4
// 删除第一个元素
sop(list.pollFirst());
// 删除最后一个
sop(list.pollLast());
sop(list);// 2,1,6,5 /*
* 获取集合全部元素,不使用迭代器
*/
while (!list.isEmpty()) {
list.pollFirst();// list.pollLast()
} } public static void sop(Object obj) {
System.out.println(obj);
} }

示例:

package com.pb.list.demo1;

import java.util.LinkedList;

/**
* 使用LinkedList模拟一个堆栈或者队列数据结构
* 堆栈:先进后出
* 队列:先进先出
*
*
*/
public class LinkedListDemo2 { public static void main(String[] args) {
Que q=new Que();
q.myAdd("java01");
q.myAdd("java02");
q.myAdd("java03");
q.myAdd("java04");
q.myAdd("java05");
while(!q.isNUll()){
//输出
System.out.println(q.myGet());
}
} }
class Que{
private LinkedList list=null;
public Que(){
list=new LinkedList(); } //判断是不是NULL
public boolean isNUll(){
return list.isEmpty();
}
//添加
public void myAdd(Object obj){
list.offerFirst(obj);
}
//删除
public Object myGet(){
return list.pollLast(); //先出
// return list.pollFirst();
}
}

示例,去除list的重复元素

package com.pb.list.demo1;

import java.util.ArrayList;
import java.util.Iterator; /**
* 去除ArrayList中的重复元素
* @author Administrator
*
*/
public class ArrayListDemo1 { public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add("java01");
list.add("java01");
list.add("java02");
list.add("java02");
list.add("java03");
list.add("java03");
list.add("java019");
System.out.println(getSingle(list)); }
public static ArrayList getSingle(ArrayList list){
ArrayList tempList=new ArrayList();
for(Iterator it=list.iterator();it.hasNext();){
Object obj=it.next();
if(!tempList.contains(obj)){
tempList.add(obj);
}
} return tempList;
} }

示例,去除list的重复对象

package com.pb.list.demo1;

public class Person {
private String name;
private int age; //重写equals
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person)){
return false;
}
Person p=(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = 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;
} public void show(){
System.out.println(this.name+"........"+this.age);
}
}
package com.pb.list.demo1;

import java.util.ArrayList;
import java.util.Iterator; /**
* 去除ArrayList中的重复元素
* @author Administrator
*
*/
public class ArrayListDemo1 { public static void main(String[] args) {
Person p1=new Person("张三",19);
Person p2=new Person("张三",19);
Person p3=new Person("李四",23);
Person p4=new Person("李四",23);
Person p5=new Person("王五",33);
Person p6=new Person("王五",23);
Person p7=new Person("赵六",18); ArrayList<Person> list=new ArrayList<Person>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6); //遍历去掉重复后的
for(Person p:getSingle(list)){
p.show();
} }
public static ArrayList<Person> getSingle(ArrayList<Person> list){
ArrayList<Person> tempList=new ArrayList<Person>();
for(Iterator<Person> it=list.iterator();it.hasNext();){
Person p=it.next();
if(!tempList.contains(p)){ //contains也是调用对象equals方法
tempList.add(p);
} } return tempList;
} }

2.9、三种集合区别

ArrayList:底层的数据结构使用是数组结构,遍历快,增、删、改,慢,线程不同步

LinkedList:底层的数据结构使用链表数据结构,遍历慢,增、删、改,快,

Vector:底层的数据结构使用是数组结构,线程同步的,被ArrayList替代了。

三、Set

3.1、List和Set区别

List:元素是有序的,元素可以重复,该集合体系有索引
Set:元素是无序,元素不可以重复

一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1e2,并且最多包含一个 null 元素。

3.2、常见子类

HashSet--哈希表,TreeSet

3.3、功能方法

Set的方法和Collection一样,使用方式也一样

package com.pb.list.demo1;

public class Person {
private String name;
private int age; //重写hashCode
@Override
public int hashCode() {
System.out.println("========hashCode");
return name.hashCode()+age*39;
}
//重写equals
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person)){
return false;
}
Person p=(Person)obj;
System.out.println(p.name+"========equals"+p.age);
return this.name.equals(p.name)&&this.age==p.age;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = 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;
} public void show(){
System.out.println(this.name+"........"+this.age);
}
}
package com.pb.list.demo1;

import java.util.HashSet;
import java.util.Iterator; public class Demo1 { public static void main(String[] args) {
Person p1=new Person("张三",19);
Person p2=new Person("李四",20);
Person p3=new Person("张三",19);
Person p4=new Person("李四",20);
Person p5=new Person("五一",19);
Person p6=new Person("五一",19);
HashSet<Person> set=new HashSet<Person>();
set.add(p6);
set.add(p5);
set.add(p4);
set.add(p3);
set.add(p2);
set.add(p1);
Iterator<Person> iterator=set.iterator();
while(iterator.hasNext()){
Person p=iterator.next();
p.show();
} } }
========hashCode
========hashCode
五一========equals19
========hashCode
========hashCode
========hashCode
李四========equals20
========hashCode
张三========equals19
李四........20
张三........19
五一........19

ArrayList:判断元素是否存或者删除依赖的方法equals()方法

Set:判断元素是否存或者删除,依赖的方法hashCode()和equals()方法,先判断hashCode如果有再判断equals

JAVA基础学习day14--集合一的更多相关文章

  1. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  2. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  3. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  4. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  5. 转载-java基础学习汇总

    共2页: 1 2 下一页  Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3     Java基础学习总结——Java对象的序列化和 ...

  6. java基础学习总结——开篇

    java是我学习的第一门编程语言,当初学习java基础的时候下了不少功夫,趁着这段时间找工作之际,好好整理一下以前学习java基础时记录的笔记,当作是对java基础学习的一个总结吧,将每一个java的 ...

  7. Java基础学习笔记(一)

    Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...

  8. java基础学习总结——java环境变量配置(转)

    只为成功找方法,不为失败找借口! 永不放弃,一切皆有可能!!! java基础学习总结——java环境变量配置 前言 学习java的第一步就要搭建java的学习环境,首先是要安装 JDK,JDK安装好之 ...

  9. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  10. [转帖]java基础学习总结——多态(动态绑定)

    https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态

随机推荐

  1. Understanding apps: mobile, native or responsive

    Background Maybe you have decided to get an app built. You will not build it yourself (obviously!) s ...

  2. R Language

    向量定义:x1 = c(1,2,3); x2 = c(1:100) 类型显示:mode(x1) 向量长度:length(x2) 向量元素显示:x1[c(1,2,3)] 多维向量:multi-dimen ...

  3. Hadoop入门进阶课程12--Flume介绍、安装与应用案例

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  4. fpmmm(mpm)监控mysql模块安装

    zabbix mpm监控mysql是一个蛮不错的监控模块,不过最近官网已经不叫mpm了,而是叫fpmmm,理由为: fpmmm is the successor of mpm. mpm was ren ...

  5. Spring基础——小的知识点

    一.整合多个配置文件 在 Spring Config 文件中,可以使用 <import> 标签将别的配置文件引入到一个文件中,进行配置文件的集成.该标签和 <bean> 标签同 ...

  6. 使用SignalR构建一个最基本的web聊天室

    What is SignalR ASP.NET SignalR is a new library for ASP.NET developers that simplifies the process ...

  7. jQuery实现星星评分功能

    一.这是我做的调查问卷中的一个功能.(第三方MVC框架) 二.功能说明:1.用户点击星星,将值放到隐藏域中.2.用户可以重新点击星星修改回答. 前台JS代码: <script type=&quo ...

  8. 转帖一篇sixxpack破解的文章!

    星期天闲着没事玩游戏,玩游戏不能无外挂.于是百度了半天,找到了一个,看介绍貌似不错,就下载了下来.一看,竟然是用.net写的,下意识地Reflector了一下.发现竟是一个叫actmp的程序集.如图: ...

  9. C#基本概念列举说明

    1. 关键字      在C#代码中常常使用关键字,关键字也叫保留字,是对C#有特定意义的字符串.关键字在Visual Studio 环境的代码视图中默认以蓝色显示.例如,代码中的using.name ...

  10. 编程Bug集

    (基础)将“/”用于取余符号,导致非预想结果——1小时后才找到错误原因 9.16