1、集合框架体系
|--由来:数据多了可以用对象类存储,对象多了用集合来存。
|--理解::咱班就是一个集合,每个人都是单独封装了功能的对象,而且长度是不固定的,因为每天都有人请假,77人或者76人,所以这个集合的长度是可变的。
|--概述:集合是一个容器、存储对象、长度可变化。
|--什么时候使用容器:一旦数据多了就得先把数据存储起来再操作,这样效率更好
|--和数组的区别:
1、数组定义时长度是固定的(必须明确元素类型和长度) 集合定义时,可以不用明确长度,长度是可变的。
2、数组存储是同一类型的数据,集合存储的是对象,而对象可以是任意类型
3、数组可以存储基本数据值,而集合只能对象。
|--集合框架构成与分类:
|--数据结构?什么是数据结构?有哪些体现方式?
|--每一个容器因为自身的数据机构不同,进行了单独的描述和对象的封装,以为这些对象有共性就进行向上抽取,形成了集合框架,
|--学习体系结构的技巧:查阅顶层内容、建立低层对象(继承体系中学)
2、Collection接口的常见方法:
|--增
Add();添加一个元素
AddAll();添加一个集合,把小集合添加到大集合中
|--删
Remove();删除一个,删除会返回Boolean类型,用到equals方法判断是否相同。如果删除成功,会改变集合的长度,下面同理。
removeAll();删除一部分,按照指定的集合的元素来删
Clear();清空
|--判断:
Contains();包含,先遍历对象的元素,用到了对象判断的equals方法
isEmpty();是否为空
Size();集合的元素的大小或者说长度
|--取
retainAll();取交集
Iterator();取出元素
|--转变
toArray();
理解总结:把我们现在的班级想成容器即可,班上来一个新同学add()添加一个,来了一堆同学addAll();添加一部分,班上出去一个remove()删除一个,出去一部分removeAll()删除一部分。班上是不是有人isEmpty();班上有多少人Size();班上人全部都出去clear()班上是否包含张三contains();和隔壁班有没有相同的学生retainAll();
|--实现代码:
public static void main(String[] args)
{
Collection coll=new ArrayList();
methodDemo(coll);
}
public static void methodDemo(Collection coll)
{
//添加:
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
sop(coll);//输出集合中的元素,[abc1,abc2,abc3,abc4]其实在使用集合对象的toString()
集合容器变成字符串:将集合中的对象元素变成字符串,用逗号隔开,用中括号括起。
此种方式仅仅是为了演示集合和方法操作后的集合中的变化情况而已。
//删除一个
coll.remove("abc2");删除会返回boolean类型。
用到equals方法判断是否相同。
sop(coll.size());true size 3
总结:删除如果成功,会改变集合的长度。
//清空
coll.clear();
//判断元素是否存在
boolean b=coll.contains("abc3");先遍历对象元素,用到了对象判断的equals方法。
sop(b);true
coll.isEmpty();判断是否为空。
演示带All的方法 addAll\removeAll\containsAll\retainAll
public static void methodAllDemo(Collection c1,Collection c2)
{
c1.add("abc1");
c1.add("abc2");
c1.add("abc3");
c1.add("abc4");
sop(c1);
c2.add("abc1");
c2.add("abc5");
c2.add("abc6");
sop(c2);
c1.addAll(c2);会出现重复元素,把两个集合中所有的元素都添加到当中。
boolean b=c1.containsAll(c2);c1中是否包含c集合中的元素、
全部都有才算是包含,有一个没有都不行。
boolean b=c1.removeAll(c2);将c1和c2中相同的元素在c1中删除。
当没有相同的元素时,返回false.
boolean b=c1.retianAll(c2);true 取出相同的部分。将c2和c1相同的元素
保存在c1中,不同的元素删除。
注意:只要集合发生了变化就会返回真,不发生变化时返回false
当c1是c2的一个子集的时候就会返回false(),因为c1没有发生变化。
}
}
取出;
interator();
public static void getElements(Collection coll)
{
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
Iterator it=coll.iterator();
while(it.hasNext())
{
sop(it.next());
//sop(it.next());不能这样取。
}
迭代器取出对象元素的方式。next方法只能出现一次,避免问题的发生,没有这个元素异常。
因为它只判断一次,但是取出两个元素的话。
sop(it.hasNext());//为假,上面迭代器去完了之后就没用了。
为了优化内存的另外一种写法:因为it对象使用之后并没有指向其他任何引用,任然保存在内存中。
for(Iterator it=coll.iterator();it.hasNext();)
{
sop(it.next());
}
开发中常用!
/*
sop(it.next());
sop(it.next());
sop(it.next());
sop(it.next());
sop(it.next());//NoSuchElementException:没有这个元素异常。
*/这种做法不行,体现不出专业性,以及代码的复用性可言。
}
3、迭代器的设计原理以及思想:
其实就Collection这种集合的公共取出方式,因为每一个具体的容器的数据结构不同,它们的取出方式也是不一样的,要根据每一个容器的特点来定义特定的取出方式,而取出方式直接在访问容器中的元素,所以将取出方式定义在容器内部,是一个内部类,而对外提供Iterator接口,这样可以通过该接口访问任意collection容器中的元素,所以它的出现降低了耦合性,我们只要面对Iterator接口,使用iterator接口即可。
4、集合使用的细节:
1、直接存储基本数据类型值也是可以的,因为JDK1.5后有自动装箱,会将基本数据类型转成对象,JDK1.4绝对不行。Eg:coll.add(3)
2、集合对象中存储的其实是对象的元素的引用。
3、Add的参数是Object类型,可以接收所有的类型的对象,会出现向上转型,取出元素时类型还是Object不能使用具体对象的特有内容,想要使用特有内容向下转型。Eg:Object obj="obj";想要取出访问子类的特有方法,向下转型,String s=(String)it.next();sop(s.length());
5、collection框架体系:
Collection
|--list(列表):有序(存入的顺序和取出的顺序一致)因为该字体系中的元素有索引或者角标,所以是可以存储重复元素的。
|--list子体系中的特有方法:
1、增加:void add(index,element)
2、删除:Object remove(index)
3、查找
4、修改:set(int index,element)返回值是当前被修改的对象
5、实现代码:
Public static void main(String[] args)
{
List list=new ArrayList();
methodDemo();
}
Public static void methodDemo(List list)
{
List.add("abc1");
List.add("abc2");
List.add("abc3");
List.add("abc4");
Sop(list);
//添加:
List.add(1,"abc7");//[abc1,abc7,abc2,abc3]在角标1位置往后顺延。
//删除
Object obj=list.remove(2);//删除指定索引上的元素,根据角标删除会返回来被删对象
Sop(obj);//obj:abc2 [abc1,abc7,abc3]
//获取:获取指定角标上的元素并返回,这也是和remove的区别。
Object obj=list.get(1);
Sop(obj);//obj:abc1 [abc1,abc7,abc3]
//获取元素的索引,如果元素存在返回索引,不存在返回-1,依次还可以判断元素是否存在。
Int index=list.indexOf("abc1");
Sop(index);//index=1
//获取指定的子列表sublist(fromIndex,toindex)包含头不包含尾
List=list.sublist(1,2);//[abc1]
//修改:
Object obj=list.set(1,"haha");
Sop(obj);//[abc1,haha,abc3]
记住:只有list集合支持增删改查。
}
}
6、listIterator:
列表迭代器:想要在迭代的过程中进行元素的增加等动作,iterator就不行了,可以使用其子接口listaIterator,而且该接口的对象只有通过list集合的listIterator方法获取,是List集合特有的取出元素方式,它包含了增删改查的方法,而iterator只有hasNext()、next()、remove()方法
实现代码:
Public static void main(String[] args)
{
List list=new ArrayList();
List.add("abc1");
List.add("abc2");
List.add("abc3");
List.add("abc4");
ListIterator it=list.listIterator();
While(it.hasNext())
{
Object obj=it.next();
If("abc2".equals(obj))
{
It.add("abc01");//添加元素
It.set("hehe");//修改元素
}
Else
{
Sop(obj);
}
}
}
Sop(it.hasNext());//false;
与iterator的区别:
实现代码:
Iterator it=list.iterator();//迭代器是集合的功能,知道集合中有多少元素。
While(it.hasNext())
{
Object obj=it.next();
//ConcurrentModificationException
多线程导致的,不能再同时遍历的时候进行删除,原因是迭代过程中,又使用集合对象对元素进行了操作导致了并发修改异常的发生,怎么去解决?迭代器的删除方式
If("abc2".equals(obj))
{
List.remove(obj);
It.remove();用迭代器的自身的方法。
}
Else
{
Sop(obj);
}
}
|--set:还没有学到!