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);
//演示retainAll
boolean 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) { //人对象中的equals
if(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 ...
随机推荐
- phpstudy+dvwa配置
1.Apache端口被系统进程占用(Pid一般为4) -- 修改apache端口,然后通过localhost:端口号访问 2.DVWA System error - config file not f ...
- 早期自学jQuery-一入门
本节目录: ----------①安装使用 ----------②语法 ----------③文档就绪函数 ----------④选择器 一.安装使用(特别注意jQuery应当位于<head&g ...
- 判断文件的唯一性--MD5
JAVA中获取文件MD5值的四种方法 JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获 ...
- e1000
http://blog.csdn.net/sdulibh/article/details/41826221 http://blog.csdn.net/evenness/article/details/ ...
- MFC笔记10
1. CDC MemDC1; MemDC1.SetBkMode(OPAQUE); 背景模式,VC6下面有三种:/* Background Modes */#define TRANSPARENT 1// ...
- js 一些兼容检测
1. IE5.0之前不支持 document.getElementById(),但存在 document.all[] function getElementById(id) { if(document ...
- linux查询公网ip
查询公网ip[出口IP] 1.curl icanhazip.com 2.curl ipecho.net/plain 3.curl www.trackip.net/i
- 天天向上的力量 III
描述 一年365天,以第1天的能力值为基数,记为1.0. 当好好学习时,能力值相比前一天提高N‰:当没有学习时,能力值相比前一天下降N‰. 每天努力或放任,一年下来的能力值相差多少呢?其中,N的取值范 ...
- java 导mysql数据为表格给浏览器接收
jar 包准备 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</a ...
- [leetcode]364. Nested List Weight Sum II嵌套列表加权和II
Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...