Collection 集合框架
1. Collection 集合框架:在实际开发中,传统的容器(数组)在进行增、删等操作算法和具体业务耦合在一起,会增加程序的开发难度;这时JDK提供了这样的容器---Collection 集合框架,集合框架中 ,将使用的对象储存于特定数据结构的容器中 ,包含了一系列数据不同数据结构(线性表、查找表)的实现类。
import java.util.ArrayList;
import java.util.Collection; public class Test1 {
public static void main(String[] args) {
/**
* 增:add/addAll;
* 删:clear/removeAll/retainAll;
* 改
* 查:contains/containsAll/isEmpty/size;
*/ Collection c1 = new ArrayList();
//追加
c1.add("apple");//多态,父类引用子类:Object object = new String("apple");
c1.add("banana");//多态,父类引用子类:Object object = new String("banana");
System.out.println(c1);//输出[apple, banana]
} }
1)Collection 部分方法
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class Test1 {
public static <E> void main(String[] args) { Collection<E> c1 = new ArrayList<E>();
c1.add((E) "apple");
c1.add((E) "apple2");
c1.add((E) "apple3");
c1.add((E) "apple4");
System.out.println(c1.toString()); //快速遍历
for (Object item : c1) {
System.out.println(item.toString());
} //另一写法
Iterator<E> it = c1.iterator();
while (it.hasNext()) {
Object item = it.next();
System.out.println(item.toString());
} //优化写法,for循环结束后,少占用JVM内存
for (Iterator<E> it2 = c1.iterator(); it2.hasNext();) {
Object item = it2.next();
System.out.println(item.toString());
} Collection<E> c2 = new ArrayList<E>();
c2.add((E) "java");
c2.add((E) "C++");
c1.addAll(c2); //clear
//c1.clear();//移除此 collection 中的C1所有元素
//c1.remove("apple");//移除此 collection 中的C1的"apple"元素
//System.out.println(c1.toString()); System.out.println(c1.contains("apple"));//返回true , c1中含有指定元素"apple"。
System.out.println(c1.contains(c2));//返回false,c1中含有c2的多个元素,不是指定的一个元素。
System.out.println(c1.containsAll(c2));//返回true,c1中包含指定 collection 中的C2所有元素
//c1.clear();//移除此 collection 中的C1所有元素,一下语句就返回true;
System.out.println(c1.isEmpty());//返回false,如果此collection中c1不含元素就返回true; System.out.println(c1.size());//返回7; //返回集合collection 中的元素的数量 System.out.println(c1.equals(c2));//返回false; //判断指定对象是否相等 } }
1.2 List接口是Collection的子接口,用于定义线性表数据结构,元素可重复、有序的;可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator; public class Test2 {
public static <E> void main(String[] args) {
List<E> list1 = new ArrayList<E>();
list1.add((E) "apple");// 添加元素
list1.add((E) "banana");// 添加元素
list1.add((E) "orange");// 添加元素
list1.add((E) "lemon");// 添加元素 for (E item : list1) {
System.out.print(item.toString() + "\t\t");
}// 快速遍历 System.out.println();// 换行 list1.add(0, (E) "fruit");// 在指定位置添加元素 System.out.println();// 换行 // 快速遍历(优化写法)
for (Iterator<E> it = list1.iterator(); it.hasNext();) {
E item = it.next();
System.out.print(item + "\t\t");
} System.out.println();// 换行 List<E> list2 = new ArrayList<E>();
list2.add((E) "cabbage");
list2.add((E) "spinach"); System.out.println(list2.toString());// 输出[cabbage, spinach]
System.out.println();// 换行 list1.addAll(list2);
System.out.println(list1.toString());// 输出[fruit, apple, banana, orange,
// lemon, cabbage, spinach]
System.out.println();// 换行 list1.remove(0);// 删除指定位置元素
System.out.println(list1);// 输出[apple, banana, orange, lemon, cabbage,
// spinach]
list1.remove("spinach");// 删除指定元素
System.out.println(list1);// 输出[apple, banana, orange, lemon, cabbage] list1.set(0, (E) "python");// 修改:把集合的第0位上的apple修改为python;
System.out.println(list1);// 输出[python, banana, orange, lemon, cabbage] System.out.println(list1.get(0));// 输出python; 查询集合里第0位上的元素
list1.add((E) "c++");
list1.add((E) "c++");
list1.add((E) "c++");
System.out.println(list1);
System.out.println(list1.indexOf("c++"));// 返回此列表中第一次出现的指定元素的索引
System.out.println(list1.lastIndexOf("c++"));// 返回此列表中最后出现的指定元素的索引 // 正向遍历 hasNext / next
ListIterator<E> it2 = list1.listIterator();
while (it2.hasNext()) {
System.out.print(it2.next() + "\t"); } // 逆向遍历 hasPrecious / previous
System.out.println();
while (it2.hasPrevious()) {
System.out.print(it2.previous() + "\t");
} // 正向遍历优化写法
System.out.println();
for (ListIterator<E> it3 = list1.listIterator(); it3.hasNext();) {
E item = it3.next();
System.out.print(item + "\t");
} } }
1.3ArrayList/Vector
1)ArryList是List接口的实现类,底层数据结构是数组,并且实现可变的数组。 线程不安全的
2)Vector 是List接口的实现类,底层数据结构是数组,也是实现可变的数组。 线程安全的
① ArryList
import java.util.ArrayList;
import java.util.Iterator; public class Test3 {
public static <E> void main(String[] args) {
// ArryList是List接口的实现类,底层数据结构是数组,并且实现可变的数组。 线程不安全的
// Vector 是List接口的实现类,底层数据结构是数组,也是实现可变的数组。 线程安全的 ArrayList<E> list = new ArrayList<E>();
list.add((E) "cabbage");
list.add((E) "spinage");
list.add((E) "turnip");
list.add((E) "pumpkin"); System.out.println(list.toString());
//System.out.println(list.size()); 输出集合元素的个数 System.out.println(); // 快速遍历
for (Object item : list) {
System.err.print(item.toString() + "\t");
} System.out.println(); // 迭代器遍历
for (Iterator<E> it = list.iterator(); it.hasNext();) {
E item = it.next();
System.out.print(item.toString() + "\t");
} } }
② Vector
import java.util.Iterator;
import java.util.Vector; public class Test4 {
public static <E> void main(String[] args) {
Vector<E> list = new Vector<E>();
list.add((E) "lemon");
list.add((E) "orange");
list.add((E) "pomegranate"); System.out.println(list.toString()); //快速遍历
for (Object item : list) {
System.out.print(item.toString() + "\t");
} System.out.println();
//迭代器遍历
for (Iterator<E> it = list.iterator(); it.hasNext();) {
E item = it.next();
System.out.print(item.toString() + "\t");
} } }
1.3 LinkedList
1) LinkedList是List接口的实现类,底层数据结构是链表。
2) LinkedList常用方法和遍历方法参照List接口。(线程不安全)
堆栈操作
import java.util.LinkedList; public class Test1 {
public static <E> void main(String[] args) {
// 堆栈操作LinkedList LinkedList<E> list = new LinkedList<E>();
list.push((E) "lemon");
list.push((E) "orange");
list.push((E) "pomegranate"); System.out.print(list.pop() + "\t");
System.out.print(list.pop() + "\t");
System.out.print(list.pop() + "\t"); //System.out.print(list.pop() + "\t");//出错 java.util.NoSuchElementException
} }
队列形式操作
import java.util.LinkedList; public class Test2 {
public static <E> void main(String[] args) {
//LinkedList 队列形式操作
LinkedList<E> queue = new LinkedList<E>();
//入队
queue.add((E) "lemon");
queue.add((E) "orange");
queue.add((E) "pomegranate");
System.out.println(queue);
//System.out.println(queue.element());//获取头元素 //出对
//System.out.println(queue.remove(2));//指定位置出队
//System.out.println(queue.remove(1));
//System.out.println(queue.remove(0)); System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove()); //System.out.println(queue.remove());//出错java.util.NoSuchElementException queue.add((E) "lemon4"); System.out.println(); //System.out.println(queue.remove(0)); System.out.println(queue.element());//获取头元素 , 输出lemon4 此时lemon4为 表头元素
} }
1.4 Iterator和ListIterator
1)Iterator集合迭代器遍历集合过程中,不能再向集合汇总添加元素,否则出现 ConcurrentModificationException 并发修改异常。
import java.awt.event.ItemEvent;
import java.util.ArrayList;
import java.util.Iterator; public class Test3 {
//Iterator和Listlterator
//Iterator在迭代过程中不予许向集合中添加元素
public static <E> void main(String[] args) {
ArrayList<E> list = new ArrayList<E>();
list.add((E) "lemon");
list.add((E) "orange");
list.add((E) "peach"); for (Iterator<E> it = list.iterator(); it.hasNext(); ) {
String item = (String)it.next();
if(item.equals("lemon")){
list.add((E) "test");//遍历过程中添加元素,会出现ConcurrentModificationException 并发修改异常。
}
System.out.println(list.toString()); } }
}
2)ListIterator允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。
import java.util.ArrayList;
import java.util.ListIterator; public class Test4 {
public static <E> void main(String[] args) {
//ListIterator允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的位置。
ArrayList<E> list = new ArrayList<E>();
list.add((E) "lemon");
list.add((E) "orang");
list.add((E) "peach"); //迭代遍历
for (ListIterator<E> it = list.listIterator(); it.hasNext();) {
String item = (String)it.next();
if (item.equals("lemon")) {
it.add((E) "test");
}
} System.out.println(list.toString());
//输出[lemon, test, orang, peach],ListIterator迭代期间可以修改列表 } }
重点:Iterator实现类的源码hasNext/next
1.5 泛型
1)泛型是JDK1.5引入的新特性,泛型的本质是参数化类型。在类、接口、方法的定义过程中,所操作的数据类型为传入的指定参数类型。所有的集合类型都带有泛型参数,这样在创建集合时可以指定放入集合中的对象类型。同时,编译器会以此类型进行检查。
2)ArrayList支持泛型,泛型尖括号里的符号可随便些,但通常大写E。
3)迭代器也支持泛型,但是迭代器使用的泛型应该和它所迭代的集合的泛型类型一致!
4)泛型只支持引用类型,不支持基本类型,但可以使用对应的包装类。
5)如果泛型不指定类型的话,默认为Object类型。
import java.awt.Point;
import java.util.ArrayList;
import java.util.Iterator; public class Test5 {
public static void main(String[] args) {
ArrayList<Point> list = new ArrayList<Point>();
list.add(new Point(1, 2));
list.add(new Point(3, 4)); System.out.println(list); for (int i = 0; i < list.size(); i++) {
Point p = list.get(i); //只运行Point类型,否则造型异常
System.out.println(p.getX());//输出两个点X的坐标
} //遍历
for (Iterator<Point> it = list.iterator(); it.hasNext();) {
Point p = it.next();
System.out.println(p);
}
} }
6)泛型方法可以定义多个泛型类型
// 可以定义多个泛型的类型
public <A,B> void showInfo(A a,B b) {
System.out.println(a);
System.out.println(b);
}
Collection 集合框架的更多相关文章
- JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue
前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...
- JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...
- Java SE 核心 II【Collection 集合框架】
Collection集合框架 在实际开发中,需要将使用的对象存储于特定数据结构的容器中.而 JDK 提供了这样的容器——集合框架,集合框架中包含了一系列不同数据结构(线性表.查找表)的实现类.集合的引 ...
- Collection集合框架与Iterator迭代器
集合框架 集合Collection概述 集合是Java中提供的一种容器,可以用来存储多个数据 集合与数组的区别: 数组的长度固定,集合的长度可变 数组中存储的是同一类型的元素,可以存储基本数据类型值, ...
- Collection集合框架详解
[Java的集合框架] 接口: collection map list set 实现类: ArryList HashSet HashMap LinkList LinkHash ...
- [集合]Collection集合框架源码分析
Collection接口 在java的集合类库中,基本接口是Collection,该接口的在集合中的源码定义如下(将源码中的注释删掉了): public interface Collection< ...
- collection集合框架
Java类集框架的优势: 1) 这种框架是高性能的.对基本类集(动态数组,链接表,树和散列表)的实现是高效率的.一般很少需要人工去对这些“数据引擎”编写代码. 2) 框架允许 ...
- JavaSE中Collection集合框架学习笔记(1)——具有索引的List
前言:因为最近要重新找工作,Collection(集合)是面试中出现频率非常高的基础考察点,所以好好恶补了一番. 复习过程中深感之前的学习不系统,而且不能再像刚毕业那样死背面试题,例如:String是 ...
- JAVA_集合框架虐我千百遍,虐也是一种进步
1.Collection和Collections区别: Collection是java的一个集合接口,集合类的顶级接口 Collections是一个包装类(工具类),不能被实例化(由于其构造函数设为私 ...
随机推荐
- 解决编译错误 implicit declaration of function 'strptime'
根据man手册,在文件中加上以下定义,应该可以去处该warning #define _XOPEN_SOURCE /* glibc2 needs this */ #inclu ...
- Maven面试宝典啊
一.Maven有哪些优点和缺点 优点如下: 简化了项目构建.依赖管理: 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作 便于与持续集成工具( ...
- Netty之Reactor模式
无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件. 1. 单线程模型 Reactor单线程模型,指的 ...
- loadrunner load generator设置init人数
Load Generator中还有一个很重要的设置.就是用来设置init人数的,我们在运行脚本的时候会发现,在场景监控中,init默认不会超过50个人,也就是最大并发是50个人,我们想使用超过50个人 ...
- [Token] 从index.jsp中获取Token
import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def holde ...
- windows cmd命令相关知识和经验的碎片化记录
1.循环遍历当前文件夹下的所有*.dll文件,并打印其绝对路径和相对路径 ``` for /f "tokens=*" %%a in ('dir /s/b/a-d "*.d ...
- JavaScript 与JQuery 常用方法比较
http://drupalchina.cn/content/javascript-yu-jquery-chang-yong-fang-fa-bi-jiao 1.加载DOM区别 JavaScript: ...
- vs2015发布网站至azure web应用服务
进入www.azure.cn管理门户 1,左下角新建web应用,实例如下,url设置为demo(有防止重名判断) 2,进入demo配置页(左侧web应用下点击demo) 3,demo首页,下载配置文件 ...
- javascript总结25:Array的5中迭代方法: every(), filter() , forEach() map() some()
1 Array常用的操作方法: 1 操作方法 - concat() //把参数拼接到当前数组 -slice() //从当前数组中截取一个新的数组,不影响原来的数组,参数start从0开始,end从1开 ...
- Ubuntu 将应用程序 固定到快快速启动栏(以Sublime为例)
因为Sublime Text并不是需要安装,所以缺少Ubuntu桌面运行的一些基本配置,比如不能将它加入桌面侧边的启动器. 而Ubuntu上也没有快捷方式的说法,而通过软件中心安装的软件就有图标,并能 ...