黑马程序员------集合框架(Collection)
2015-06-03 16:51
295 查看
------- android培训、java培训、期待与您交流!
----------
集合框架(Collection)
为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合类同是容器,那么有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象
集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
![](http://img.blog.csdn.net/20150603165347242?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5zaXN0T3du/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
集合框架为什么会出现这么多的容器呢?
因为每一个容器对数据的存储方式都有不同,这个存储方式称为:数据结构
集合的作用:
1.我们之前存储大量数据,可以使用数组:
数组的弊端:
1).要先期指定长度;
2).一旦指定长度,其长度不能改变;
2.Java为我们提供了大量的"集合类",供我们程序员使用;
3.这些"集合类"内部使用了不同的"数据结构"来存储对象;
它们有些:查询快;增删慢;
有些:查询慢;增删快;
有些:查询快;增删快;但是无序的;
所以要根据我们的需要选择不同的集合类;
集合框架的层次结构:
Collection(顶层接口):
|--List(接口):元素是有序的,元素可以重复,因为该集合体系有索引
|---ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快
|---LinkedList:底层使用的链表数据结构
|---Vector:底层是数组数据结构。线程同步,被ArrayList替代了
|--Set(接口):元素是无序的,元素不可以重复
|--HashSet(类):底层数据结构是哈希表;无序的,线程不安全的效率高;
|--TreeSet(类): 底层数据结构二叉树;排序的;线程不安全的,效率高;
创建一个集合容器,使用Collection接口的子类,ArrayList
ArrayList a1=new ArrayList();
ArrayList中的共性方法:
add()
向集合中添加元素
remove()
删除集合中的元素
clear()
清空集合中的元素
contains()
判断元素是否存在
isEmpty()
判断集合是否为空
size()
获取集合的长度
retailAll() 取交集
例如:al1. retailAll(al2):取交集,集合al1中只会保留和集合al2中相同的元素
add方法的参数类型是object。以便于接收任意类型对象
集合中存储的都是对象的引用(地址)
遍历取出集合中的所有元素: 就需要使用迭代器
什么是迭代器呢? 其实就是集合的取出元素的方式
Iterator it = a1.iterator(); 获取迭代器,用于取出集合中的元素
例子:
ArrayList a1=new ArrayList();
a1.add(“abcd1”);
a2.add(“abcd2”);
Iterator it = a1.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
List的特有的方法:凡是可以操作角标的方法都是该体系特有的方法
List:元素是有序的,元素可以重复,因为该集合体系有索引
增加元素:
add(index,element);
addAll(ndex,Collection);
删除元素:
remove(index);
修改元素:
set(index,element);
获取元素:
get(index);
subList(from,to);
listIterator();
list集合中判断元素是否相同,依据的是元素的equals方法
LinledList的特有方法:
添加元素:
addFirst();
addLast();
获取元素:
获取元素,但不删除元素,如果集合中没有元素
getFirst();
getLast();
获取元素,但是元素被删除
removeFirst();
removeLast();
Vector:枚举
枚举就是Vector特有的取出方式 并且枚举和迭代器很像
其实枚举和迭代是一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了
HashSet:底层数据结构是哈希表;无序的,线程不安全的效率高;
HashSet是如何保证元素的唯一性呢?
是通过元素的两个方法,hashCode和equals来完成
如果元素的HashSet值相同,才会判断equals是否为true
如果元素的hashCode值不同,不会调用equals
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法
TreeSet:底层数据结构是二叉树,可以对set集合中的元素进行排序
TreeSet保证元素唯一性的依据:
两种比较的方式:
1)让元素自身具备比较性。 元素需要实现comparable接口,
覆盖compareTo(Object obj)方法,这种方式也称为元素的自然顺序,
或者叫做默认顺序
2)当元素自身不具备比较性,或者具备的比较性不是所需要的这
需要让容器自身具备比较性,在初始化时,就有了比较的方式,
需要实现Comparator接口,重写compare()方法;
当两种排序都存在时,以比较器为主接口,覆盖compare()方法定义一个类,实现Comparator
Set集合的功能和collection是一致的
练习:往TreeSet集合中存储自定义对象学生,想按照学生的年龄进行排序
记住:排序时,当主要条件相同时,一定要判断一下次要条件
Import java.util.*;
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int compareTo(Student s)
{
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
{
return this.name.compareTo(s.name);
}
return num;
}
}
class TreeDemo
{
public static void main(String[] args) throws Exception
{
TreeSet<Student> t=new TreeSet<Student>();
t.add(new Student("zhangsan",34));
t.add(new Student("zhangsan2",11));
t.add(new Student("zhangsan3",50));
t.add(new Student("zhangsan4",24));
Iterator<Student> it=t.iterator();
while(it.hasNext())
{
Student s=(Student)it.next();
System.out.println(s.getName()+"...."+s.getAge());
}
}
}
-------
android培训、java培训、期待与您交流!
----------
----------
集合框架(Collection)
为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合类同是容器,那么有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象
集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
集合框架为什么会出现这么多的容器呢?
因为每一个容器对数据的存储方式都有不同,这个存储方式称为:数据结构
集合的作用:
1.我们之前存储大量数据,可以使用数组:
数组的弊端:
1).要先期指定长度;
2).一旦指定长度,其长度不能改变;
2.Java为我们提供了大量的"集合类",供我们程序员使用;
3.这些"集合类"内部使用了不同的"数据结构"来存储对象;
它们有些:查询快;增删慢;
有些:查询慢;增删快;
有些:查询快;增删快;但是无序的;
所以要根据我们的需要选择不同的集合类;
集合框架的层次结构:
Collection(顶层接口):
|--List(接口):元素是有序的,元素可以重复,因为该集合体系有索引
|---ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快
|---LinkedList:底层使用的链表数据结构
|---Vector:底层是数组数据结构。线程同步,被ArrayList替代了
|--Set(接口):元素是无序的,元素不可以重复
|--HashSet(类):底层数据结构是哈希表;无序的,线程不安全的效率高;
|--TreeSet(类): 底层数据结构二叉树;排序的;线程不安全的,效率高;
创建一个集合容器,使用Collection接口的子类,ArrayList
ArrayList a1=new ArrayList();
ArrayList中的共性方法:
add()
向集合中添加元素
remove()
删除集合中的元素
clear()
清空集合中的元素
contains()
判断元素是否存在
isEmpty()
判断集合是否为空
size()
获取集合的长度
retailAll() 取交集
例如:al1. retailAll(al2):取交集,集合al1中只会保留和集合al2中相同的元素
add方法的参数类型是object。以便于接收任意类型对象
集合中存储的都是对象的引用(地址)
遍历取出集合中的所有元素: 就需要使用迭代器
什么是迭代器呢? 其实就是集合的取出元素的方式
Iterator it = a1.iterator(); 获取迭代器,用于取出集合中的元素
例子:
ArrayList a1=new ArrayList();
a1.add(“abcd1”);
a2.add(“abcd2”);
Iterator it = a1.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
List的特有的方法:凡是可以操作角标的方法都是该体系特有的方法
List:元素是有序的,元素可以重复,因为该集合体系有索引
增加元素:
add(index,element);
addAll(ndex,Collection);
删除元素:
remove(index);
修改元素:
set(index,element);
获取元素:
get(index);
subList(from,to);
listIterator();
list集合中判断元素是否相同,依据的是元素的equals方法
LinledList的特有方法:
添加元素:
addFirst();
addLast();
获取元素:
获取元素,但不删除元素,如果集合中没有元素
getFirst();
getLast();
获取元素,但是元素被删除
removeFirst();
removeLast();
Vector:枚举
枚举就是Vector特有的取出方式 并且枚举和迭代器很像
其实枚举和迭代是一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了
HashSet:底层数据结构是哈希表;无序的,线程不安全的效率高;
HashSet是如何保证元素的唯一性呢?
是通过元素的两个方法,hashCode和equals来完成
如果元素的HashSet值相同,才会判断equals是否为true
如果元素的hashCode值不同,不会调用equals
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法
TreeSet:底层数据结构是二叉树,可以对set集合中的元素进行排序
TreeSet保证元素唯一性的依据:
两种比较的方式:
1)让元素自身具备比较性。 元素需要实现comparable接口,
覆盖compareTo(Object obj)方法,这种方式也称为元素的自然顺序,
或者叫做默认顺序
2)当元素自身不具备比较性,或者具备的比较性不是所需要的这
需要让容器自身具备比较性,在初始化时,就有了比较的方式,
需要实现Comparator接口,重写compare()方法;
当两种排序都存在时,以比较器为主接口,覆盖compare()方法定义一个类,实现Comparator
Set集合的功能和collection是一致的
练习:往TreeSet集合中存储自定义对象学生,想按照学生的年龄进行排序
记住:排序时,当主要条件相同时,一定要判断一下次要条件
Import java.util.*;
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int compareTo(Student s)
{
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
{
return this.name.compareTo(s.name);
}
return num;
}
}
class TreeDemo
{
public static void main(String[] args) throws Exception
{
TreeSet<Student> t=new TreeSet<Student>();
t.add(new Student("zhangsan",34));
t.add(new Student("zhangsan2",11));
t.add(new Student("zhangsan3",50));
t.add(new Student("zhangsan4",24));
Iterator<Student> it=t.iterator();
while(it.hasNext())
{
Student s=(Student)it.next();
System.out.println(s.getName()+"...."+s.getAge());
}
}
}
-------
android培训、java培训、期待与您交流!
----------
相关文章推荐
- 黑马程序员_关于分类的总结
- 黑马程序员-IO字节流的基础应用。。整个IO的分析(字符流和字节流的选择,转换)
- 黑马程序员-java之反射
- 为什么要走上程序员这条道路
- iOS面试题
- 黑马程序员-关于IO字符流基础
- 黑马程序员——Java基础---单例设计模式
- 面试形象标准礼仪
- 卓越程序员和优秀程序员有哪些区别?
- 优秀的程序员和一般的程序员差别在哪?
- 黑马程序员——Java练习笔记——反射
- 软件开发实习生面试经历-----阿冬专栏!!!!
- 黑马程序员——Java基础---面向对象
- 黑马程序员——Java基础——选择排序和冒泡排序
- 黑马程序员——抽象类和接口
- 面试精选:链表问题集锦
- 程序员学SEO系列一:SEO引论
- 2015/6/3 杭州--我的体检网
- 一位蜗牛程序员七年工作总结-2014
- 疯狂Java学习笔记(72)-----------大话程序员面试