---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
今天学习了集合,集合是继数组后的又一个用于存储数据的容器,集合的出现补足了数组在使用上的一些缺点,下面是一些集合的特点。
1:集合和数组的区别:
数组:
a:数组长度固定。
b:可以存储基本类型的元素,也可以存储引用类型的元素
c:只能存储同一种类型的元素
集合:
a:集合长度不固定
b:只能存储引用类型的元素
c:可以存储不同类型的元素
2:集合体系:
由于数据结构的不同,多个集合类的存储,删除,判断等功能也不完全相同,通过不断地将各个集合类中的共性内容向上抽取,最终形成了一个继承实现的集合体系。
集合体系的最上层是Collection接口,Collection接口下面是List接口和Set接口,List接口下面有三个子类,分别是ArrayList,Vector,LinkedList;Set接口下面有两个子类,分别是TreeSet和HashSet。List接口的特点是List子类中存储的元素是有序并且可以重复;Set接口的特点是Set子类中存储的元素是无序而且是唯一的,不能有重复。
3:数据结构:
数据结构可以理解为数据的组织方式或者存储方式。
常见的数据结构及特点:
栈:栈中存储的元素的顺序是先进后出。
队列:队列的特点是先进先出。
数组:查询快,增删慢。
链表:查询慢,增删快。
4:List子类的数据结构及特点以及选择:
ArrayList:底层数据结构是数组,查询快,增删慢;线程不安全,效率高。
Vector:底层数据结构是数组,查询快,增删慢;线程安全,效率低。
LinkedList:底层数据结构是链表,查询慢,增删快;线程不安全,效率高。
三个子类中应该使用哪一个要根据具体的需求来看,如果要求线程安全,那么就使用Vector集合,如果不要求线程安全,那么就看具体的操作中是增删多还是查询多,如果是增删多,那么就使用LinkedList集合,如果是查询多,那么就是用ArrayList集合。
5:List集合中的遍历方式:
迭代器遍历,JDK1.5中的新特性增强for循环都是List从父接口Collection继承来的,除此之外,List集合还可以通过for循环进行遍历。
6:下面是一个通过ArrayList集合存储自定义对象并通过三种方式进行遍历的例子
/*
需求:定义一个学生类,有成员变量name和age,创建4个学生类的对象添加到ArrayList集合中并通过三种方式进行遍历。
*/
//定义一个学生类
package cn.itcast
public class Student {
//定义成员变量
private String name;
private int age;
//定义构造方法
public Student() {}
Public Student() {
this.name = name;
this.age = age;
}
//定义setxxx/getxxx方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
pbulic int getAge() {
return age;
}
}
//创建测试类
public class StudentTest {
pbulic static void main(String[] args) {
//创建集合对象
ArrayList<Student> array = new ArrayList<Student>();
//用带参构造方法创建Student对象
Student s1 = new Student("Zxx",23);
Student s2 = new Student("Wxx",18);
Student s3 = new Student("Dxx",22);
Student s4 = new Student("Hxx",27);
//通过add()方法将对象添加到集合中
array.add(s1);
array.add(s2);
array.add(s3);
array.add(s4);
//对集合进行遍历
//方式1:通过迭代器对集合遍历
Iterator<Student> it = array.iterator();//通过集合对象得到迭代器对象
//通过迭代器的hasnext()方法判断集合中是否有元素
while(it.hasNext()) {
//通过迭代器的next()方法获取集合中的对象并移动到下一个位置
Student s = it.next();
System.out.println(s.getName() + "--" + s.getAge());
}
//方式2:通过普通for循环+get()方法遍历
for(int x = 0;x < array.size();x++) {
Student s = array.get(x);
System.out.println(s.getName() + "--" + s.getAge());
}
//通过增强for循环进行遍历
for(Student s : array) {
System.out.println(s);
}
}
}
7:集合中用到的JDK1.5的新特性
在集合中用到了两个JDK1.5的新特性,分别是泛型和增强for循环。下面简单介绍这两个新特性。
a:泛型
泛型是用于把确定数据类型的过程推迟到对象创建或者方法被调用期间才去执行的一种特殊的类型。
泛型的好处:
优化了程序设计,解决了黄线警告
把运行期的异常提前到了编译期
避免了强制类型转换
b:增强for循环:
作用:为了更方便的遍历数组和集合
格式:for(数组或者集合中元素的数据类型 变量名 : 数组名或集合名) {
直接使用变量,该变量就是数组中的元素;
}
注意事项:
增强for循环在使用的时候,建议每次先判断目标集合是否为null。
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>