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 ...
随机推荐
- springBoot框架的搭建
1新建一个项目: 2.注意选择JDK1.8,和选择spring initializr加载springBoot相关jar包: 3.下一步next: 4.下一步next,选择Web和MyBatis然后ne ...
- 详解vue组件的is特性:限制元素&动态组件
在vue.js组件教程的一开始提及到了is特性 意思就是有些元素,比如 ul 里面只能直接包含 li元素,像这样: <ul> <li></li> </ul&g ...
- vsCode关闭代码检查工具
在script标签里,第一行输入下面的内容即可:
- ceph结构详解
引言 那么问题来了,把一份数据存到一群Server中分几步? Ceph的答案是:两步. 计算PG 计算OSD 计算PG 首先,要明确Ceph的一个规定:在Ceph中,一切皆对象. 不论是视频,文本,照 ...
- 安装好ubuntu双系统启动时卡死解决办法
问题描述:在安装完ubuntu双系统后,第一次启动ubuntu系统时,卡死在启动界面(或者黑屏),这大概都是由于显卡驱动的原因,具体不在这里阐述,通过以下方法能成功解决,据我个人经验,这可能是诸多方法 ...
- pyton 模块之 pysmb 文件上传和下载(linux)
首先安装pysmb模块 下载文件 from smb.SMBConnection import SMBConnection conn = SMBConnection('anonymous', '', ' ...
- 导出word文档 通过DocX组件
根据DocX官方描述如下: In the application development process, it uses COM libraries and requires MS Word or ...
- 42 【docker】run命令
最常用的两个option是,网络端口映射,和文件共享 最基本的启动命令(从image创建一个container并启动):docker run -d <image-name> -d:表示守护 ...
- @RequestBody配合@JsonFormat注解实现字符串自动转换成Date
2018年08月28日 16:41:15 混合动力火锅 阅读数:440 在controller中使用@RequestBody可以自动将字符串转换成int或者将int转换成字符串,但是Date类型则 ...
- [leetcode]25. Reverse Nodes in k-Group每k个节点反转一下
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k ...