黑马学习笔记5

---------------------- android培训java培训、期待与您交流! ----------------------

 

集合的特点:集合只用于存储对象,集合的长度是可变的,集合可以存储不同类型的对象。

因每个容器对数据的存储方式不同,所以分类出很多的容器。这个存储方式称为:数据结构。

import java.util.*; //使用前把包导入。

举例:

//使用Collection接口的子类ArrayList类创建一个集合容器。

ArrayList a1 new ArrayList();

 

//添加元素

a1.add("A");//字符串也是对象

a1.add("B");

a1.add("C");

a1.add("D");

 

//获取个数(集合长度)

Syntem.out.println(a1.size());

//打印集合

Syntem.out.println(a1); //[A,B,C,D]

//

Collection接口的方法:

add();添加元素

1.add方法的参数类型是Object。以便于接收任意类型对象。

2.集合中存储的都是对象的引用(内存地址)。

addAll( )  将指定 collection 中的所有元素都添加到此 collection 

remove( );删除指定元素

removeAll() 移除此 collection 中那些也包含在指定 collection 中的所有元素

clear( )    清空集合

contains( ) 判断集合中是否包含指定的元素

ContainsALL( )  如果此 collection 包含指定 collection 中的所有元素,则返回 true

isEmpty( ) 判断集合是否为空

retainAll(  取交集,仅保留调用此方法的collection 中与指定 collection 的相同元素

 

iterator( ) 迭代器

1.返回iterator接口子类对象,,返回在此 collection 的元素上进行迭代的迭代器

2.子类对象的相关方法

hasNext(  如果仍有元素可以迭代,则返回 true

next()  返回迭代的下一个元素

remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素

举例:

Iterator it a1.iterator(); //获取迭代器,用于取出集合中的元素

while(it.hasNext())

{

             Syntem.out.println(it.next());

}

 把各自的取出方式定义在各自的集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类,而每一个容器的数据结构不同,所以取出的方式细节也不一样,但是都有共性内容:判断和取出,所以将共性抽取形成规则Iterator对外提供。集合内定义的这些内部类都符合这个规则,所以通过iterator()方法来取出集合内的元素(对象)。

 

Collection下的一些常见子接口

1. List接口特点:元素是有序的,元素可以重复。因为此集合体系有索引。

特有方法。凡是可以操作角标的方法都是该体系的方法。

注意:List、子类等中的contains()/remove()等方法是在底层调用的equals()方法,所以如果自己定义的类对象存入集合中后进行集合操作用到这些方法时需要在自定义类中对equals方法重写形成自己的比较方法。

增加:

add(index,element);  在列表的指定位置插入指定元素。

addAll(index,Collection); 添加指定 collection 中的所有元素到此列表的结尾,

   顺序是指定 collection 的迭代器返回这些元素的顺序。

删除:

remove(index);  移除列表中指定位置的元素。

修改:

set(index,element); 用指定元素替换列表中指定位置的元素。

查找:

get(index);  返回列表中指定位置的元素。

subList(from,to);  返回fromIndex(包括)和toIndex(不包括)之间的部分。

列表迭代器(List特有):

listIterator();  返回此列表元素的列表迭代器。

listIterator(index);  返回从指定位置开始列表中元素的列表迭代器。

注:在操作时集合对象方法与迭代器不能同时操作元素,因为会发生异常,所以,在使用迭代器时只能使用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断、取出、删除的操作;如果想在迭代器时进行添加、修改等操作时就需要使用其子接口:ListIterator。该接口只能通过List集合的listIterator方法获取。

如:

ArrayList a1 new ArrayList();

ListIterator li a1.listIterator();

li.add() ......

 

listIterator的一些方法

add(); 插入

hasNext(); 判断

next(); 返回列表中的下一个元素。

nextIndex()  返回对 next 的后续调用所返回元素的索引

previous() 返回列表中的前一个元素

previousIndex() 返回对 previous 的后续调用所返回元素的索引

remove() 删除:从列表中移除由 next 或 previous 返回的最后一个元素

set() 修改:用指定元素替换 next 或 previous 返回的最后一个元素

List下常见的子类:

ArrayList底层的数据结构使用的是数组结构。

  特点:查找比较快,增删稍慢。线程不同步。

LinkedList底层的数据结构使用的是链表数据结构。

 特点:增删比较快,查找稍慢。线程不同步。

   LinkedList特有方法:

addFirst() 将指定元素插入此列表的开头。 

addLast() 将指定元素添加到此列表的结尾。 

getFirst() 返回此列表的第一个元素。 

getLast() 返回此列表的最后一个元素。 

removeFirst() 移除并返回此列表的第一个元素。

removeLast() 移除并返回此列表的最后一个元素。

注意:以上方法如果集合中没有元素时会出现NoSuchElementException异常。所以在JDK1.6版本以后出现了以后新的方法。

offerFirst() 在此列表的开头插入指定的元素。返回类型boolean 

offerLast() 在此列表末尾插入指定的元素。返回类型boolean 

peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。 

peekLast()  获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。 

pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。 

pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null

扩展:

堆栈数据结构:先进后出;

队列数据结构:先进先出;

 

Vector底层的数据结构使用的是数组结构。

特点:查找增删都慢。线程同步。被ArrayList替代。

 

2. Set接口特点:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。集合体系没有索引。

Set集合的功能方法和Collection是一致的。

Set接口常见的子类:

1. HashSet:底层数据结构是哈希表。

HashSet元素唯一性的原因,是通过元素的两个方法hashCodeequals来完成,如果元素的HashCode值相同,才会通过equals方法判断是否为true;如果元素的HashCode值不同则不会调用equals方法进行判断。

注意:对于元素的判断和删除等操作都是调用的hashCaodeequals方法,所以在自己定义对象类时通常需要重写hashCodeequals方法。

 

2. TreeSet:底层数据结构是二叉树,可以对集合中的元素进行排序。

TreeSet元素唯一性和排序(为主)的原因,是通过compareTo()方法对元素进行比较,是TreeSet集合对元素排序的依据,此方法的返回值是正数,负数,零,这个方法是Comparable接口中的。

注意:

第一种排序方式:自定义类,然后向TreeSet集合中存入自定义类的对象时,需要在自定义类中实现(implements)Comparable接口并在类中重写compareTo()方法形成自己的比较方法,另外需要注意的是在重写compareTo方法(排序)当主要条件相同时,一定要判断一下次条件(否则会视为重复元素,不会存入集合中)。

第二种排序方式:当元素(自定义类中的compareTo方法)自身不具备比较性时,或具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就具备比较方式,所以需定义比较器(定义类实现Comparator接口,在类中重写compare(Object o1,Object o2)方法描述比较代码)传递(比较器的对象)给TreeSet集合的构造函数。

注:两种比较方式同时出现时,以比较器为先。

Map集合,接口:

 

基本特点:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。

共性方法:

添加:

put(K key, value) 将指定的值与此映射中的指定键关联(可选操作)。注意:put方法添加时如果键相同那么后添加的值会覆盖原值,并返回原值。

putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。

删除:

clear() 从此映射中移除所有映射关系

remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。

判断:

containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。 

containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true

equals(Object o) 比较指定的对象与此映射是否相等。

isEmpty() 如果此映射未包含键-值映射关系,则返回 true。 

获取:

get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null

hashCode() 返回此映射的哈希码值。

size()  返回此映射中的键-值映射关系数。

values() 返回此映射中包含的值的 Collection 视图。 

Set<Map.Entry<k,v>>  entrySet() 返回此映射中包含的映射关系的 Set 视图。

entrySet方法是将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是Map.EntryMap.Entry也是一个对象,用它的一些方法就可以取出关系中的键和值。Map.Entry的相关方法如下:

getKey() 返回与此项对应的键。 

getValue() 返回与此项对应的值。 

hashCode() 返回此映射项的哈希码值。 

setValue(V value) 用指定的值替换与此项对应的值。

Set<k>  keySet() 返回此映射中包含的键的 Set 视图。

keySet方法将Map集合中所有的键存入到set集合,因为set集合具备迭代器,所以可以迭代方式取出所有的键,在根据get方法获取每个键对应的值。

Map下常见的类:

1.Hashtable

底层是哈希表数据结构,不可以存入nullnull值。该集合是线程同步的。

2.HashMap

底层是哈希表数据结构,可以存入nullnull值。该集合是线程不同步的。

3.TreeMap

底层是二叉树数据结构,线程不同步,可以给map集合中的键进行排序。

 

工具类:Utilities

1.Collections

集合框架静态工具类,里面都是静态方法。

2.Arrays

用于操作数组的工具类,里面都是静态方法。

注意:Arrays其中的asList()方法:将数组转成List集合。转成集合后不可以使用List集合的增加和删除方法,其它方法均可使用。另外:如果数组中的元素都是对象,用asList方法转成集合时数组中的元素就直接转成集合中的元素;如果数组中的元素都是基本数据类型,那么转换后会将数组作为集合中的元素存在。

集合转数组:

使用Collection接口中的toArray方法。

例:ArrayList<String> al ArrayList<Sring>();

al.add("abc1");

al.add("abc2");

al.add("abc3");

String[] arr al.toArray(new String[al.size( )]);

注意:

1.指定类型数组长度小于集合的size时此方法内部会自动创建一个新的数组,新数组长度为集合的size。当指定类型数组长度大于集合的size时不会创建。所以在指定类型数组长度时使用集合的size最好。

2.将集合转成数组一般是为了限定对元素的操作,不需要对元素进行增删时可以使用此方法。

 

增强for循环:JDK1.5版本以上出现的新特性。

格式:

for( 数据类型 变量名 :被遍历的集合(Collection)或者数组)

{

..........

}

例子:

ArrayList<Srting> al new ArrayLiest<String>();

al.add("abc1");

al.add("abc2");

al.add("abc3");

for(String al)

{

System.out.println(s);

}

注意:如对集合进行遍历时只能获取集合中的元素,不能对集合进行操作;

 跌代器除了遍历时可以进行remove集合中元素的动作;

 如果是用ListIterator的话还可以在遍历过程中对集合进行增删改查的动作。

 

可变参数:JDK1.5版本以上出现的新特性。

举例:public void show(int... arr) //相当于int[] arr

  {

       ......

   }

  show(2,3);

  Show(3,5,9,8);

其实就是一种数组的简写形式,不用调用方法时每次都创建数组对象了;

只要将要操作的元素作为参数传递即可。

使用时注意,可变参数定义在最后一项。如:public void show(Sring str,int... arr)

---------------------- android培训java培训、期待与您交流! ----------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值