集合类:
为什么使用集合类?
在面向对象的编程思想中,都是以对象的形式对事物进行描述的,为了保证对象的生命周期,我们需要持有对象
(什么叫做持有对象呢?Person p = new Person())
数组和集合类的区别?
1.数组和集合类都是容器,都能存储对象
2.集合类优点就是长度可变,而数组一旦定义.长度是不能修改的.
集合的特点:
集合类可用于存储对象.
集合类的长度可变
一个集合可以存储多种类型的对象..
Collection 接口:
1.一个独立的元素的序列,这些元素从一条或多条规则
2.collection接口下分为list集合和Set集合
3.list集合的特点是元素有序,可以允许有重复的元素
4.set集合的特点是元素无序,不允许有重复的元素
↓↓
List(子接口)
↓↓
ArrayList(实现类)
1.底层数组实现,查找快,增删慢
2.线程不安全
----------------------------------
Vector(实现类)
1.与ArrayList基本一样
2.线程安全
----------------------------------
LinkedList(实现类)
1.底层是链表的实现
2.增删快,查找慢
{
List集合元素存取方法一致
使用add()方法增加元素
由于List集合有序,可以使用get()方法获取元素
元素的迭代(Iterator)
通过集合对象的iterator()方法获得迭代器Iterator
通过Iterator迭代器的hasNext()方法判断是否存在下一个元素
通过Iterator迭代器的next()方法获取下一个元素
元素的迭代(Enumeration)
迭代Vector集合中的元素可以使用Enumeration
通过Enumeration的hasNextElements()方法判断是否还有元素
通过Enumeration的nextElement()方法返回下一个元素
}
↓↓
Set(子接口)
↓↓
Set集合无须,不允许有重复的元素
1.set集合通过存入对象的equals方法来保证集合中没有重复的元素
HashSet(实现类)
HashSet是set的子类,因而没有重复元素
底层使用了哈希算法保证没有重复元素
存储对象时,先调用对象的HashSet()方法,找到存储位置,再和当前的存储位置上已经存在的元素通过equals()方法进行比较,如果返回false,才能进行存储
往HashSet集合里存储的对象必须是重写HahCode 和equals()方法。
TreeSet(实现类)
TreeSet集合通过二叉树算法保证无重复元素,并对元素进行排序
第一种方式: 如果对象实现了Comparable接口,就可以存入TreeSet集合 因为它会自动的去调用里面的一个比较方法.所以在Person里面重写
第二种方式: 如果对象没有实现Comparable接口,在创建TreeSet对象时,需要给构造函数扔进一个比较器,实现Comparator接口 .(必须要在匿名内部类重写.或者继承一个类来重写)
----------------------------------
Map接口:
1.一组成对的“键值对”对象,允许根据键来查找值
2.Map集合的健值不允许有重复的,所以Map所有的键都构成了一个Set集合
Iterable接口:
1.JDK1.5新定义的接口作为Collection的父接口
2.主要就是实现了增强for循环
jdk1.5的新特征:
泛型:
由于集合可以存储不同数据类型的对象,所以取元素(地址)时会导致类型转换错误
jdk1.5新增加了泛型,为了减少操作集合的出错里
例如: ArrayList<Person> arraylist = new ArrayList<Person>();
比喻: 我在每一个挂了一个牌子.只能是Person 使用.做了一个限制..
使用泛型的好处:
1.提高的代码的安全性
2.讲运行期间的问题转到了编译期间的问题(你懂的~~)
3.省起了类型转换的麻烦
4.泛型类的出现优化了程序设计
增强for循环:
新接口Iterable中定义了增强for循环
可以通过增强for循环对数组和集合进行遍历
在迭代集合元素时,需要定义了泛型才能使用for循环
可变参数:
有的时候在设计方法时无法确定将来别人会传入的参数个数
JDK1.5增加了新特性可变参数,在函数中只声明参数类型,不规定个数
方法接受的参数实际上是一个数组,可以在方法中遍历数组
可变参数只能被定义为函数的最后一个形参
语法格式: 返回值 函数名(参数类型… 形参)
package com.javami.kudy.javaapin.StringStudy;
public class Test {
public static void main(String[]args)
{
show(33,45,7657,332,11,5465);
}
public static void show(int ... i)
{
for(int num : i)
System.out.println(num);
}
}