黑马程序员——java之集合框架(Day14)
2013-12-15 14:38
330 查看
------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ------
1、为什么要使用集合类?
面向对象的语言对事物都是以对象体现的,为了方便对多个对象的操作,隆重推出了集合类,也是一个容器,可以对对象进行操作。2、数组和集合类同是容器有何不同?
数据虽然也可以存储对象,但是长度不可改变;集合是可改变的;另外数组能存基本数据类型,集合就不行。3、集合类的特点
集合只用于存储对象。长度可变
可以存储不储不同对象
4、集合框架
5、为什么会有这么多容器?
因为每个容器的存储方式都有不同,这种存储方式称为数据结构。6、Collection定义了集合框架的共性功能。
7、查阅API文档后发现:
iterator是abstractlist的内部封装类,可以不用建立对象,直接迭 代出list内对象。加强for循环省内存,但是不能操作对象。8、
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
枚举就是Vector特有的取出方式。
发现枚举和迭代器很像。其实枚举和迭代是一样的。
Enumeration en = v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
|--Set:元素是无序,元素不可以重复。、
List:
特有方法。凡是可以操作角标的方法都是该体系特有的方法。
增
add(index,element);//在相应位置插入后,后面元素依次顺延
addAll(index,Collection);
删
remove(index);
改
set(index,element);
查
get(index):
subList(from,to);
Iterator();//当对象的引用存在集合时,用迭代方法的时候把对象的引用又传到迭代,这是对象有两个引用指向他,这时不能操作对象只能用其一个方法,否则会抛出:ConcurrentModificationException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();
List集合特有的迭代器(因为有角标)。ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。
所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。
if(obj.equals("java02"))
//al.add("java008");
it.remove();//将java02的引用从集合中删除了。
sop("obj="+obj);//还能打印是因为迭代器指向这个元素。
class ListDemo { public static void sop(Object obj){ System.out.println(obj); } public static void method(){ ArrayList al = new ArrayList(); //添加元素 al.add("java01"); al.add("java02"); al.add("java03"); sop("原集合是:"+al); //在指定位置添加元素。 al.add(1,"java09"); //删除指定位置的元素。 //al.remove(2); //修改元素。 //al.set(2,"java007"); //通过角标获取元素。 sop("get(1):"+al.get(1)); sop(al); //获取所有元素。 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"); sop(al); ListIterator li = al.listIterator(); //sop("hasPrevious():"+li.hasPrevious()); while(li.hasNext()) { Object obj = li.next(); if(obj.equals("java02")) //li.add("java009"); li.set("java006"); } while(li.hasPrevious()) { sop("pre::"+li.previous()); } //sop("hasNext():"+li.hasNext()); //sop("hasPrevious():"+li.hasPrevious()); sop(al); /* //在迭代过程中,准备添加或者删除元素。 Iterator it = al.iterator(); while(it.hasNext()) { Object obj = it.next(); if(obj.equals("java02")) //al.add("java008"); it.remove();//将java02的引用从集合中删除了。remove 本身就是iterator的方法 sop("obj="+obj); } sop(al); */ } }
9、LinkedList:特有方法:
addFirst();addLast();
getFirst();
getLast();获取元素,但不删除元素。如果集合中没有元素,会出 NoSuchElementException
removeFirst();
removeLast();获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();//peek看一眼的意思
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();//poll剪短,修剪
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。
10. 练习:
使用LinkedList模拟一个堆栈或者队列数据结构。堆栈:先进后出 如同一个杯子。
队列:先进先出 First in First out FIFO 如同一个水管
package until.cn.itcast; import static java.lang.System.*; import java.util.*; /*思路:定义一个静态方法,给方法singleElement传递一个集合,在方法中再创造一个集合, * 在迭代时用contains方法判断元素是否存在,不存在则添加到新的集合中,并返回新的集合*/ public class SingleElement { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<String> al = new ArrayList<String>(); al.add("asd"); al.add("asdd"); al.add("dff"); al.add("asdsd"); al.add("asadd"); al.add("asd"); out.println(al); al =singleElement(al);//调用去除重复元素方法。 out.println(al); } public static ArrayList<String> singleElement(ArrayList<String> l){ ArrayList<String> newal = new ArrayList<String>(); Iterator<String> it = l.iterator(); while(it.hasNext()){ String obj = it.next(); if(!newal.contains(obj)) newal.add(obj); } return newal; } }
12、练习:
将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。
思路:
1,对人描述,将数据封装进人对象。
2,定义容器,将人存入。
3,取出。
细节:Person p = (Person)it.next();
if(!(obj instanceof Person)) return false;
List集合判断元素是否相同,依据是元素的equals方法。Remove和contains都是依赖于元素的equals方法
ArrayList al = new ArrayList(); al.add("java01"); al.add("java02"); al.add("java01"); al.add("java02"); al.add("java01"); //al.add("java03"); /* 在迭代时循环中next调用一次,就要hasNext判断一次。 Iterator it = al.iterator(); while(it.hasNext()) { sop(it.next()+"...."+it.next());//这种方式最好不要出现,当集合是奇数时容易发生空指针异常。 }
13、|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
Set集合的功能和Collection是一致的。
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
练习体现: 体现set集合的不重复性(通过hashcode()和equals方法确定,对于hashCode建议类似name.hashCode()+age*37;)
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
|--TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:
compareTo方法return 0.
TreeSet排序的第一种方式:
让元素自身具备比较性。
元素需要实现lang包中的Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。Until包中的comparator接口覆盖 compare();方法
在集合初始化时,就有了比较方式。
------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ------
相关文章推荐
- 黑马程序员_Java基础Day14_集合框架
- 黑马程序员--Java学习日记8_集合框架
- 黑马程序员——Java基础—集合框架(三)
- 黑马程序员 java 集合框架 高级for循环
- 黑马程序员--java基础复习集合框架工具类及其他对象
- 黑马程序员---java集合与框架
- 黑马程序员_Java语言_集合框架
- 黑马程序员_Java语言_集合框架(一些使用案例及泛型)
- 黑马程序员——java基础拾遗之集合框架(一) List 和 Set
- 黑马程序员:JAVA集合框架知识点二
- 黑马程序员_Java第17天知识总结_集合框架的工具类_Collections_Arrays_将数组变成list集合_集合变数组_高级for循环_可变参数
- 黑马程序员 java基础之集合框架List
- 黑马程序员_Java基础_集合框架(一)_14
- 黑马程序员_java基础_泛型、集合框架工具类
- 黑马程序员_Java基础_集合框架
- 黑马程序员 —— JavaAPI_集合框架 (第十四天)
- 【黑马程序员】集合框架(上)——Java复习笔记
- 黑马程序员——Java重点基础之集合框架(三)
- 黑马程序员 Java集合框架
- Java基础---泛型、集合框架工具类:collections和Arrays (黑马程序员)