------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
集合
为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行储存,集合就是存储对象最常用的一种方式。
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
为什么会出现这么多的容器?
因为每一个容器对数据的存储方式都有不同。这种存储方式称为:数据结构。
Collection集合超级接口
|--List:元素是有序的,元素可以重复,因为该集合体系有索引。|--Set:元素师无序的,元素不可以重复,该集合当中没有索引。
Collection定义了集合框架的共性功能。
①添加:add(e); addAll(collection);
②删除:remove(e); removeAll(collection); clear();
③判断:contains(e); isEmpty();
④获取:iterator(); size();
⑤获取交集:retainAll();
⑥集合变数组:toArray();
①添加:add(e); addAll(collection);
②删除:remove(e); removeAll(collection); clear();
③判断:contains(e); isEmpty();
④获取:iterator(); size();
⑤获取交集:retainAll();
⑥集合变数组:toArray();
注意:1.add()方法的参数类型是Object。以便于接收任意类型对象。
2.集合中存储的都是对象的引用或者地址。
2.集合中存储的都是对象的引用或者地址。
迭代器
什么是迭代器呢?
其实就是集合的取出元素的方式。
那么这些内部类都符合一个规则,该规则是Iterator
如何获取集合的取出对象呢?
通过一个对外提供的方法:iterator()
for(Iterator it = al.iterator(); it.hasNext() ; ) //迭代器
{
sop(it.next());
}
其实就是集合的取出元素的方式。
那么这些内部类都符合一个规则,该规则是Iterator
如何获取集合的取出对象呢?
通过一个对外提供的方法:iterator()
for(Iterator it = al.iterator(); it.hasNext() ; ) //迭代器
{
sop(it.next());
}
一个迭代器的实例:
public class Test3 {
public static void al(){
ArrayList a = new ArrayList();
a.add("a1");
a.add("a2");
a.add("a3");
a.add("a4");
a.add("a5");
Iterator it = a.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
}
public static void main(String[] args) {
Test3.al();
}
}
List:
|--List:元素是有序的,元素可以重复,因为该集合体系有索引。|--ArrayList:底层的数据结构使用的是数组结构,
特点:查询速度很快。但是增删稍慢。线程不同步
|--LinkedList:底层使用的是链表数据结构。
特点:增删速度很快,查询稍慢。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代。
List:特有的方法:凡是可以操纵角标的方法都是该体系特有的方法。
增:add(index,element); addAll(index,Collection)
删:remove(index);
改:set(index,element);
查:get(index); subList(from,to); ListIterator();
List集合特有的迭代器:ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生:ConcurrentModificationException:并发修改异常。
所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法时有限的,只能对元素进行判断、取出、删除的操作。
如果想要其他的操作如添加、修改等,就需要使用其子接口ListIterator。
该接口只能通过List集合的ListIterator方法获取。
增:add(index,element); addAll(index,Collection)
删:remove(index);
改:set(index,element);
查:get(index); subList(from,to); ListIterator();
List集合特有的迭代器:ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生:ConcurrentModificationException:并发修改异常。
所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法时有限的,只能对元素进行判断、取出、删除的操作。
如果想要其他的操作如添加、修改等,就需要使用其子接口ListIterator。
该接口只能通过List集合的ListIterator方法获取。
LinkedList特有的方法:
addFirst();放前面 addLast();放后面
getFirst(); getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst(); removeLast();
获取元素,但删除元素。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法:
offerFirst(); offerLast();
peekFirst(); peekFirst();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst(); pollLast();
获取元素,但删除元素。如果集合中没有元素,会返回null。
addFirst();放前面 addLast();放后面
getFirst(); getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst(); removeLast();
获取元素,但删除元素。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法:
offerFirst(); offerLast();
peekFirst(); peekFirst();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst(); pollLast();
获取元素,但删除元素。如果集合中没有元素,会返回null。
使用LinkedList模拟一个堆栈或者队列数据结构。
堆栈:先进后出。如同一个杯子
队列:先进先出。First in First out FIFO。如同一个水管。
堆栈:先进后出。如同一个杯子
队列:先进先出。First in First out FIFO。如同一个水管。
class DuiLie
{
private LinkedList link;
DuiLie()
{
link=new LinkedList();
}
public void myAdd(Object obj)
{
link.addFirst(obj);
}
public Object myGet()
{
//return link.removeFirst();先进后出
return link.removeLast(); //先进先出
}
public boolean isNull()
{
return link.isEmpty();
}
}
class LinkedListTest
{
public static void main(String[] args)
{
DuiLie d=new DuiLie();
d.myAdd("java01");
d.myAdd("java02");
d.myAdd("java03");
d.myAdd("java04");
while (!d.isNull())
{
System.out.println(d.myGet());
}
}
}
Set:
Set集合的功能和Collection是一致的。|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
|--TreeSet:可以对Set集合中的元素自然进行排序。
底层数据结构是二叉树,保证元素唯一性的依据:compareTo方法return 0.
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
泛型:
JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
好处
1.将运行时期出现问题ClassCastException,转移到了编译时期。,
方便于程序员解决问题。让运行时问题减少,安全。,
2,避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,
早期定义Object来完成扩展。
现在定义泛型来完成扩展。
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
好处
1.将运行时期出现问题ClassCastException,转移到了编译时期。,
方便于程序员解决问题。让运行时问题减少,安全。,
2,避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,
早期定义Object来完成扩展。
现在定义泛型来完成扩展。
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
Collection 和 Collections的区别:
Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、
线程安全化(将非同步的集合转换成同步的)等操作。
Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的
一些操作,如插入、删除、判断一个元素是否其成员、遍历等。
Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、
线程安全化(将非同步的集合转换成同步的)等操作。
Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的
一些操作,如插入、删除、判断一个元素是否其成员、遍历等。
Map集合:
该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
①添加:put(K key, V value)
①添加:put(K key, V value)
putAll(Map<? extends K,? extends V> m)
②删除:clear()
②删除:clear()
remove(Object key)
③判断:containsValue(Object value)
③判断:containsValue(Object value)
containsKey(Object key)---isEmpty()
④获取:get(Object key)
④获取:get(Object key)
size()
values()
entrySet()
entrySet()
keySet()
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null作为键作为值的情况。
该集合时线程同步的。JDK1.0 效率低
|--HashMap:底层是哈希表数据结构,并允许存入null键null值。
该集合时不同步的。JDK1.2 效率高
|--TreeMap:底层是二叉树数据结构,线程不同步。可以用于给Map中的键进行排序。
和Set很像!其实Set底层就是使用了Map集合。
什么时候使用map集合呢?
当数据之间存在着映射关系时,就要先想到Map集合。
|--Hashtable:底层是哈希表数据结构,不可以存入null作为键作为值的情况。
该集合时线程同步的。JDK1.0 效率低
|--HashMap:底层是哈希表数据结构,并允许存入null键null值。
该集合时不同步的。JDK1.2 效率高
|--TreeMap:底层是二叉树数据结构,线程不同步。可以用于给Map中的键进行排序。
和Set很像!其实Set底层就是使用了Map集合。
什么时候使用map集合呢?
当数据之间存在着映射关系时,就要先想到Map集合。
map集合有两种取出方式。
1.Set<k> keySet:将map中所有的键存入到Set集合。因为Set具备迭代器。
所以可以使用迭代方式取出所以的键,在根据get方法,获取每一个键所对应的值。
Map集合的取出原理:将map集合转成Set集合。在通过迭代器取出。
2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
而这个关系的数据类型就是:Map.Entry
Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口。
1.Set<k> keySet:将map中所有的键存入到Set集合。因为Set具备迭代器。
所以可以使用迭代方式取出所以的键,在根据get方法,获取每一个键所对应的值。
Map集合的取出原理:将map集合转成Set集合。在通过迭代器取出。
2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
而这个关系的数据类型就是:Map.Entry
Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口。
Arrays:用于操作数组的工具类。
里面都是静态方法。
asList:将数组变成list集合
把数组变成list集合有什么好处?
可以使用集合的思想和方法来操作数组中的元素。
注意:将数组变成集合,不可以使用集合的增删方法。
因为数组的长度是固定。
里面都是静态方法。
asList:将数组变成list集合
把数组变成list集合有什么好处?
可以使用集合的思想和方法来操作数组中的元素。
注意:将数组变成集合,不可以使用集合的增删方法。
因为数组的长度是固定。