黑马程序员——java基础——我对集合的理解

来源:互联网 发布:c高级编程第9版 中文 编辑:程序博客网 时间:2024/05/22 22:21
<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! 

首先先说一下,集合跟数组的区别,有了数组为什么还要集合?数组是固定长度的,而集合不是固定长度的,数组里面装的数据类型是相同的,还可以放基本数据类型,也就是说数组中只能装同种类型,集合就不一样了,集合中可以装很多不同的类型对象,但是集合不可以装基本数据类型,因为类的对象封装了特有数据,对象多了就需要存储,在对象个数不确定的情况下用数组的话就会浪费空间,或者产生近异常,这个时候集合就由此而来,说道集合,想必学习的人都有些疑问,为什么要集合,集合能干什么,到底集合他是怎么干的,下面我来说说我自己的理解。首先说一下集合的特点:用于存储对象的容器集合的长度是可变的,集合不可以存储今本数据类型,那么问题来了:集合是按照什么规则来装对象的呢?容器有很多种,每一种容器都有自己特定的结构,也即是说,这些结构决定了这些容器改怎么装对象,集合框架的,顶层接口是Collection,他是由很多底层不同的容器抽取出来的共性接口,它里面有很多方法,也是其他底层容器共有的方法。问题又来了,那都有那些方法?那下面就是集合中的共性方法代码演示:

<span style="font-size:18px;">import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;class Student{//定义一个学生类private String name;private int age;private String adrr;private String call;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAdrr() {return adrr;}public void setAdrr(String adrr) {this.adrr = adrr;}public String getCall() {return call;}public void setCall(String call) {this.call = call;}}public class CollectionDeom {public static void main(String[] args) {Student s=new Student();//得到学生类对象sStudent s1=new Student();//得到学生类对象s1s.setAdrr("高安");//初始化学生对象ss.setAge(60);s.setName("肖志江");s.setCall("1234566779");s1.setAdrr("fasfa");//初始化学生对象s1s1.setAge(78);s1.setCall("2342342421");s1.setName("lisi");Collection<Student> coll=new ArrayList<Student>();//得到容器对象collcoll.add(s);//向容器中添加学生对象Scoll.add(s1);//向容器中添加学生对象s1Iterator it=coll.iterator();//得到迭代器 Student student1=(Student) it.next();//通过迭代器得到容器中的学生对象sSystem.out.println(student1.getAdrr()+"/n"+student1.getAge()+"/n"+student1.getName()+"/n"+student1.getCall());Student student2=(Student) it.next();//通过迭代器得到容器中的学生对象s1System.out.println(student2.getAdrr()+"/n"+student2.getAge()+"/n"+student2.getName()+"/n"+student2.getCall());//删除容器中的元素System.out.println(coll);coll.remove(s);System.out.println(coll);//判断容器中是否包含该元素Boolean b;//定义一个布尔类型的数据b=coll.contains(s1); System.out.println(b); coll.toString();//将集合里面的数据变成字符串 coll.clear();//清空集合里面的对象         }}</span>

以上代码,演示了集合里面的一些共性方法,这个代码是我自己敲的,所以有很多的不足,希望高手,大神看到后指教一二,我定会努力改正,上面涉及到了泛型问题,在这里我就不做详细介绍,我只要想说的是集合的理解,泛型是1.5版本的新特性,以后有时间再讨论泛型问题,Collecttion这是最顶层的接口,他还有俩个小弟,也就是俩个态系,我想通过,Collection这个接口,来深刻理解一下他的俩个态系,接口的方法大同小异,首先说一下,List这个接口
它是一个有序的集合,它里面的元素可以通过角标精确的插入具体位置,或者删除角标下的元素,也就是可以索引,还有就是它里面的元素是可以重复,下面是list常见方法代码演示:
<span style="font-size:18px;">import java.util.List;import java.util.ListIterator;public class CollectionListDeom {public static void main(String[] args) {List list=new ArrayList();show(list);}public static void show(List list) {//添加元素list.add("qwer1");list.add("qwer2");list.add("qwer3");list.add("qwer4");//按照角标位置插入元素list.add(2, "qwer7");System.out.println(list);// 按照角标位置删除元素并且返回删除的对象String s=(String) list.remove(2);//根据角标修改元素list.set(1, "asfas");//取元素的方法for(ListIterator it=list.listIterator(0);it.hasNext();){Object objct=it.next();if(objct.equals("qwer3"))it.add("qwer8");}System.out.println(list);}}</span>
这里有一个问题,如果我们用Collection共性的迭代其去提取List集合中的数据时,如果需求是在迭代的时候往集合中添加数据的话,那么就会出现异常,这个异常就是说,同步操作异常,迭代器跟集合容器不能同时操作,解决这个问题的方法就是用我代码中的迭代器,这是List集合特有的的迭代器,他里面有添加,修改,删除方法,所以不需要同时操作迭代器的时候,去操作集合,这样异常问题就解决了。
List集合容器下面实现类有三个:
Vector:内部数组数据结构,是同步的。出现在1.0版本
ArrayList:内部是数组数据结构,是不同步的。代替了Vector,出现在1.2版本
LinkedList:内部是链表数据结构年,是不同步的。
链表的数据结构与数组的数据结构的优缺点:如果你要频繁的增加元素,或者删除元素的话,那么建议你用链表的数据结构,也就是选择LinkedList,如果你是要频繁的查询操作的话,那么用数组的数据结构将会比链表速度快,所以说,在对数据进行操作的时候我们要适当的选择容器。
set集合是无序的,它里面的元素是不可重复的,它也有两个实现类:
TreeSet:
HashSet:数据结构是哈希表,线程是非同步的,保证元素唯一性的原理是:判断元素的hashcode值是否相同,如果相同,还会判断元素的equals()方法是否为true。
TreeSet:因为Set集合是无序的,所以就有可TreeSet集合来拟补他的不足,TreeSet集合是有序的,可以对Set集合中的元素进行排序。
<span style="font-size:18px;">package blogday1;import java.util.Iterator;import java.util.TreeSet;class People implements Comparable{//定义一个People类实现Comparable接口,为了让这个对象具备可比性private int age;private String name;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int compareTo(Object o) {//重写compareTo这个函数if(!(o instanceof People))//判断接受的对象是否是Peoplethrow new RuntimeException("对象有误,请检查");People p=(People) o;//类型强转if(this.age>p.age)//当主要问题相等,按照次要问题排序return this.name.compareTo(p.name);if(this.age==p.age)return 0;// TODO Auto-generated method stubreturn -1;}}public class CollectionSetDome {public static void main(String[] args) {TreeSet ts=new TreeSet();//定义一个TreeSet对象People p=new People();//定义一个People对象p.setAge(23);//初始化对象p.setName("lisi");People p1=new People();p1.setAge(34);p1.setName("lisi2");People p2=new People();p2.setAge(234);p2.setName("lisi3");ts.add(p);//将元素加入到集合里面ts.add(p1);ts.add(p2);for(Iterator it=ts.iterator();it.hasNext();)//取出集合中的元素{People pe=(People) it.next();System.out.println("age="+pe.getAge()+"name="+pe.getName());}}}</span>
由上代码可知,TreeSet集合里面的数据是有序的,如果我们放入不具备排序的自定义类,往集合中放数据的时候会出现异常,所以我们要放一个自定义的对象到TerrSet集合中,我们必须先让该对象具备可比性,它的底层数据结构是二叉树结构。它的排序规则就是根据Compareto返回值进行排序的,他的默认排序从小到大排序的,同时它也确定了TreeSet集合中的元素唯一性。
0 0
原创粉丝点击