您的位置:首页 > 其它

集合框架体系结构,list、set操作数据,泛型(一)

2017-07-31 16:59 176 查看
集合的概念

现实生活中:很多的事物凑在一起。

数学中的集合:具有共同属性的事物的总体。

Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象。

集合的作用

1.在类的内部,对数据进行组织。

2.简单而快速的搜索大数量的条目。

3.有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入/删除有关元素。

4.有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型。

集合与数组的区别

数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。

数组的长度固定,集合长度可变。

数组只能通过下标访问元素,下标的类型固定是整型,当不知道元素的位置时,需要遍历,而有的集合可以通过任意类型查找所映射的具体对象。

数组是一种可读/可写数据结构没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方 只读方式来使用集合。该方法将返回一个集合的只读版本。

java集合框架的体系结构

由两大家族组成:

collection接口:是List、set、Queue接口的父接口,定义了可用于操作List、set、Queue的方法–增删改查。和Map接口

collection包括:

List:序列。常用的,存储的元素是排列有序的,并且可以重复,可以精确的控制每个元素的插入位置,或者删除某个位置元素。Arraylist:数组序列list的实现类,底层是由数组实现的。

Queue:队列。存储的元素是排列有序的,并且可以重复。LinkedList:链表,Queue的实现类,同时也是list的实现类

Set。集:常用的,存储的元素是排列无序的,并且不可以重复。如何区分是否重复:Set里的元素是不能重复的,那么用iterator()方法。equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

HashSet:哈希集,Set的实现类

Map:重要的是HashMap实现类。

它们内部如何来存储对象,collection中存储的是一个一个的对象,Map:中运用
<key,Value>
键值对key和value可以是任意类型的对象,用两个对象,一个映射来存储对象。

list操作数据

添加

boolean add(E e)
:向列表的尾部添加指定的元素,e表示要添加的元素。

//创建list,以及要添加的元素
List coursesToSelect=new ArrayList();
Course cr1 = new Course("1" , "数据结构");
coursesToSelect.add(cr1);


void add(int index,E e)
:向列表的指定位置添加元素,index表示添加的位置,list的位置是从0开始的,e表示要添加的数据。将当前处于该位置的元素和所有后续元素向右移动。

coursesToSelect.add(0, cr1);


boolean addAll(Collection<? extends E> c)
:添加指定 collection 中的所有元素到此列表的结尾,新元素将按照它们通过指定 collection 的迭代器所返回的顺序出现在此列表中。

//要添加的内容,此处是一个数组
Course[] course = {new Course("3", "离散数学"), new Course("4", "汇编语言")};
//将数组转换为list之后再添加
coursesToSelect.addAll(Arrays.asList(course));


boolean addAll(int index, Collection<? extends E> c)
:将指定 collection 中的所有元素都插入到列表中的指定位置。将当前处于该位置的元素和所有后续元素向右移动。新元素将按照它们通过指定 collection 的迭代器所返回的顺序出现在此列表中。

注意:在添加到指定位置的方法要注意数组下标越界异常。

coursesToSelect.addAll(2, Arrays.asList(course));


获得list中的元素

E get(int index):返回列表中指定位置的元素,index是位置,对象存入集合都变成Object类型,取出时需要类型转换。

Course cr = (Course) coursesToSelect.get(i);


遍历list

1.通过迭代器iterator,只是用来遍历集合中的元素,本身不具备任何存储元素的功能,它是依赖于某个集合存在的,不能独立存在是一个接口。

//通过集合的iterator方法,取得迭代器的实例
Iterator<Course> it = coursesToSelect.iterator();
System.out.println("有如下课程待选(通过迭代器访问):");
while(it.hasNext()) {
Course cr = it.next();
System.out.println("课程:" + cr.id + ":" + cr.name);
}


2.foreach:它是迭代器的简单写法

for (Object obj : coursesToSelect) {
Course cr = (Course) obj;
System.out.println("课程:" + cr.id + ":" + cr.name);
}


修改

E set(int index, E element):用指定元素替换列表中指定位置的元素。index方法索引位置,element要修改为的值。

coursesToSelect.set(4, new Course("7", "毛概"));


删除

E remove(int index):移除列表中指定位置的元素。将所有的后续元素向左移动(将其索引减 1)。返回从列表中移除的元素。

coursesToSelect.remove(4);


boolean remove(Object o):从此列表中移除第一次出现的指定元素。

Course cr = (Course) coursesToSelect.get(4);
coursesToSelect.remove(cr);


boolean   removeAll(Collection<?> c)
:列表中移除指定 collection 中包含的其所有元素。

Course[] courses = {(Course) coursesToSelect.get(4), (Course)coursesToSelect.get(5)};
coursesToSelect.removeAll(Arrays.asList(courses));


泛型

提出一个问题,给list中添加一个与之前添加的类型(课程)不同的类型,如String,在遍历时就会报错,原因是不能将String类型强转为课程类型。这时要考虑有没有什么方法可以控制往集合或list添加数据的类型,泛型就可以做到这一点。

集合中的元素,可以是任意类型的对象,其实就是对象的引用,如果把某个对象放入集合,则会忽略其类型,把它当作Object处理,泛型规定了某个集合只可以存放特定类型的对象,它会在编译期间进行类型检查,可以直接按指定类型获取集合元素,而不需要转型。

下面代码中<>中的内容就是泛型:

List<Course> courses = new ArrayList<Course>();


1.泛型集合中,不能添加泛型规定的类型及其子类型以外的对象,否则会报错!

courses.add("能否添加一些奇怪的东西呢??");


如上面代码中泛型是Course,但添加的是String类型就会报如下错误:



2.泛型集合可以添加泛型的子类型的对象实例。

3.泛型集合中的限定类型不能使用基本类型,可以通过使用其对应的包装类存入基本数据类型。

4.在list的遍历中,带有泛型的与之前有所不同,每次循环的变量类型不在是Object。

for (Course cr : courses) {
System.out.println(cr.id + ":" + cr.name);
}


与list操作数据的区别与联系

1.得到set里面的值,因为它是无序的,不能查询指定位置上的值,只能通过遍历的方式一个一个的显示出来,每次迭代出来的结果都是不一样的。

2.Set中,添加某个对象,无论添加多少次, 最终只会保留一个该对象(的引用), 并且,保留的是第一次添加的那一个。

3.添加,删除的方式都是一样的,都支持泛型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐