黑马程序员——Java学习笔记 集合框架(一)
来源:互联网 发布:linux c 执行shell 编辑:程序博客网 时间:2024/06/05 19:39
一、集合类的概述
一个集合对象或一个容器表示了一组对象,集合中的对象称为元素。在这个对象中,存放指向其他其他对象的引用。
1、为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
2、数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
3、集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
4、集合中为什么会出现这么多容器?
因为每个容器对数据的存储方式都不同。存储方式成为数据结构。
二、Collecton中的共性方法
Collection定义了集合框架的共性功能。
添加
add(e); //添加元素。
addAll(collection);
删除
remove(e); //删除元素。
removeAll(collection);
clear(); //清空集合。
判断
contains(e); //判断某集合是否包含某元素。
isEmpty(); //判断集合是否为空。
获取
size(); //获取元素的个数(集合的长度)。
获取交集。
retainAll();
格式:al1.retainAll(al2);//取交集,al1中只会保留和al2中相同的元素。
集合变数组。
toArray();
注意:
(1)add方法的参数类型是Object。以便于接收任意类型对象。
(2)集合中存储的都是对象的引用(地址)
三、迭代器
Java Collection API为集合对象提供了Iterator(迭代器),用来遍历集合中的元素。Iterator接口中的方法使我们可以向前遍历所有类型的集合。在对一个Set对象的遍历中,元素的遍历顺序是不确定的。List对象的遍历次序是从前向后,并且List对象还支持Iterator的子接口ListIterator,该接口支持List的从后向前的反向遍历。
迭代器其实就是集合的取出元素的方式。迭代器是取出方式,会直接访问集合中的元素。所以将迭代器通过内部类的形式来进行描述。通过容器的iterator()方法获取该内部类的对象。
1、iterator()方法摘要:
(1)boolean hasNext() //如果仍有元素可以迭代,则返回 true。
(2)E next() //返回迭代的下一个元素。
(3)void remove() //从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
2、迭代器的两种写法:
(1)Iterator it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
(2)for(Iterator it = al.iterator(); it.hasNext() ; )
{
System.out.println(it.next());
}
四、List集合
JDK中提供了实现List接口的三个实用类:ArrayList类、LinkdeList和Vector类。
List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
1、List特有方法:
凡是可以操作角标的方法都是该体系特有的方法。按位置存取存取元素,即按照元素在List中的序号对其进行操纵。
增:
add(index,element); //在指定位置添加元素。
addAll(index,Collection);
删:
remove(index); //删除指定位置的元素。
改:
set(index,element); //修改指定位置的元素
查:
get(index): //通过角标获取元素。
subList(from,to); //返回子列表中的元素,含头不含尾。
listIterator(); //列表迭代器。
int indexOf(obj): //获取指定元素的位置。
2、列表迭代器
List集合特有的迭代器。ListIterator是Iterator的子接口。在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的listIterator方法获取。
列表迭代器方法摘要:
void add(E e) //将指定的元素插入列表(可选操作)。
boolean hasNext() //以正向遍历列表时,如果列表迭代器有多个元素,则返回 true
boolean hasPrevious()//如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
E next() //返回列表中的下一个元素。
int nextIndex() //返回对 next 的后续调用所返回元素的索引。
E previous() //返回列表中的前一个元素。
int previousIndex() //返回对 previous 的后续调用所返回元素的索引。
void remove() //从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
void set(E e) //用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。
注意:
remove() 和 set(Object) 方法不是根据光标位置定义的;它们是根据对调用 next() 或 previous() 所返回的最后一个元素的操作定义的。
3、Vector
枚举是Vector特有的取出方式,枚举和迭代器功能类似,由于名称过长被迭代器取代。
<span style="font-family:SimSun;font-size:14px;">class VectorDemo {public static void main(String[] args) {Vector v = new Vector(); //<span style="font-family:SimSun;">建立对象v</span>v.add("java01"); //添加元素v.add("java02");v.add("java03");v.add("java04");Enumeration en = v.elements(); //创建枚举while(en.hasMoreElements()) //测试此枚举是否包含更多的元素。{<span style="font-family:SimSun;"> </span>System.out.println(en.nextElement()); //返回此枚举的下一个元素}}}</span>4、LinkedList
LinkedList的特有方法:
addFirst(); //添加元素到头部。
addLast(); //添加元素到头部。
getFirst(); //返回此列表的第一个元素。如果此列表为空抛出异常
getLast();
removeFirst(); //移除并返回此列表的第一个元素。如果此列表为空抛出异常
removeLast();
在JDK1.6出现了替代方法。
offerFirst(); //在此列表的开头插入指定的元素。
offerLast();
peekFirst(); //获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
peekLast();
pollFirst(); //获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
pollLast();
LinkedList中的特有方法代替迭代器的方法:
正序:
while(!link.isEmpty())
{
sop(link.removeFirst());
}
逆序:
while(!link.isEmpty())
{
sop(link.removeLast());
}
LinkedList练习:
使用LinkedList模拟一个堆栈或者队列数据结构。
堆栈:先进后出 如同一个杯子。
队列:先进先出 如同一个水管。
<span style="font-family:SimSun;font-size:14px;">import java.util.*;class DuiLie{ private LinkedList link; //私有化成员变量 DuiLie() //构造函数,初始化类。 { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); //将元素添加到首位。 //link.addlast(obj); //将元素添加到末位。 } public Object myGet() { //return link.removeFirst(); //获取并删除首元素。 return link.removeLast(); //获取并删除尾元素。 } public boolean isNull() //判断集合是否为空 { return link.isEmpty(); }}</span>
5、ArrayList练习
(1)去除ArrayList集合中的重复元素:
public static ArrayList singleElement(ArrayList al) { ArrayList newAl = new ArrayList(); //定义一个新集合。 Iterator it = al.iterator(); //遍历传入的集合。 while(it.hasNext()) //循环调用hasNext { Object obj = it.next(); //定义临时变量 if(!newAl.contains(obj)) //如果新集合不包含该元素 newAl.add(obj); //将该元素添加到新集合 } return newAl; //返回不包含重复元素的新集合 }
(2)将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
例如:存人对象。同姓名同年龄,视为同一个人。为重复元素。
思路:
1,对人描述,将数据封装进人对象。
2,定义容器,将人存入。
3,取出。
List集合判断元素是否相同,依据是元素的equals方法。(contains方法和removed方法调用equals方法进行比较)
class Person //创建Preson对象{ private String name; private int age; Person(String name,int age) //创建构造函数 { this.name = name; this.age = age; } public boolean equals(Object obj) //重写equals方法,自定义比较方式 { if(!(obj instanceof Person)) //判断传入的对象是否为Person类的对象 return false; Person p = (Person)obj; //将传入的对象强制转换为Person类的对象 //System.out.println(this.name+"....."+p.name); return this.name.equals(p.name) && this.age == p.age; //自定义比较条件并返回比较结果 } public String getName() { return name; } public int getAge() { return age; }}class ArrayListTest2 { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) //主函数 { ArrayList al = new ArrayList(); al.add(new Demo()); al.add(new Person("lisi01",30));//al.add(Object obj);相当于Object obj = new Person("lisi01",30); //add方法传入的是Object类型的对象,相当于多态,所以使用Person类的方法前需要强制类型转换。 al.add(new Person("lisi02",32)); al.add(new Person("lisi02",32)); al.add(new Person("lisi04",35)); al.add(new Person("lisi03",33)); al = singleElement(al); //sop("remove 03 :"+al.remove(new Person("lisi03",33)));//remove方法底层也是依赖于元素的equals方法。 Iterator it = al.iterator(); while(it.hasNext()) { Person p = (Person)it.next();//add方法传入的是Object类型的对象,相当于多态,所以使用Person类的方法前需要强制类型转换。 sop(p.getName()+"::"+p.getAge()); } } public static ArrayList singleElement(ArrayList al) { //定义一个临时容器。 ArrayList newAl = new ArrayList(); Iterator it = al.iterator(); while(it.hasNext()) { Object obj = it.next(); if(!newAl.contains(obj)) newAl.add(obj); } return newAl; }}
- 黑马程序员—Java学习笔记之集合框架(一)
- 黑马程序员——Java学习笔记 集合框架(一)
- 黑马程序员 JAVA学习笔记 ——集合框架
- 黑马程序员 java学习笔记——集合框架1
- 黑马程序员 java学习笔记——集合框架2
- 黑马程序员java学习笔记——集合框架
- 黑马程序员——java学习笔记--集合框架
- 黑马程序员—Java学习笔记之集合框架(二)
- 黑马程序员 java集合框架笔记(一)
- 黑马程序员——JAVA集合框架(一)
- 黑马程序员——Java之集合框架(一)
- 黑马程序员——Java集合框架(一)
- 黑马程序员——JAVA集合框架(一)
- 黑马程序员——JAVA基础----集合框架(一)
- 黑马程序员-java学习笔记-集合框架
- 黑马程序员--集合框架笔记(一)
- 黑马程序员——集合学习笔记(一)
- 黑马程序员——Java学习笔记 集合框架(二)
- hadoop2.6学习笔记-hadoop体系结构理解
- ScollerView阻尼效果
- Eclipse中正常启动Tomcat,但是访问网页返回404
- 软件开发者的软技能
- 对于新手而言 写个在某个区间寻找素数
- 黑马程序员——Java学习笔记 集合框架(一)
- 五笔编码
- IOS Block在ARC和非ARC下的使用总结
- 2015阿里实习生面试经验--数据挖掘岗
- WebService 调用超时处理
- 看了一段时间的Go了,对这个语言很感兴趣,现在接触一下Gui,从基础学起!
- C#、Unity网络通信中基于字节码的自定义协议解码,C#版ByteBuffer
- 中文验证码类
- Android:Java代码实现APP普通安装卸载和静默安装卸载