集合:
1.集合的由来:面向对象语言对事物的描述是通过对象体现出来的,如果要存储多个对象,不能使用基本的变量,而应该使用容器类型的变量,
* 目前位置学习过哪些容器变量?数组,StringBuffer,但是StringBuffer始终返回的是一个字符串,可能不是我们想要的结果;
数组的长度是固定的,不能满足长度变化的需求,
* java就提供了----集合,满足长度变化的需求!
***********面试题:
集合和数组的区别:1)长度的区别:
数组:长度是固定的
集合:长度是可变的
2)内容的区别:
数组储存的是同一类型的元素:举例:水杯中的水
集合储存的是不同类型的元素,举例:杯子例加水加可乐
3)存储数据类型的区别:
数组可以储存基本数据类型,也可以储存引用数据类型
集合只能存储引用数据类型
集合是可以存储多个元素的,但是有时候需求发生变化,给集合中存储元素,但是不能让元素重复,
或者让元素按照某种规则排序,需求不断地变化,java提供了多个集合类,
每一个集合类数据结构不同,数据结构不同不重要的,重要的是能够存储东西,
并且开发者还可使用这些东西,多个集合类他们的共性的功能,将共性的内容向上抽取
----------->集合继承体系图!
数据结构:存储的数据的方式
2.Collection:Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。
一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现,而这里子接口中又有自己的子实现类!
添加功能:
boolean add(Object e):给集合中添加一个元素
boolean addAll(Collection c):添加一个集合中的元素
删除功能:
void clear()移除此 集合 中的所有元素
boolean remove(Object o):删除此集合中的指定的元素
boolean removeAll(Collection c)移除一个集合中的元素 (删除那些也包含在指定 collection 中的所有元素
(思考:删除一个集合中所有元素才算删除还是删除一个算是删除)?//删除一个算是删除
判断功能:
boolean contains(Object o):判断是集合中是否包含指定的元素
boolean containsAll(Collection c):(思考:包含一个元素算是包含还是包含所有算是包含?)//包含所有算是包含
boolean isEmpty():判断集合是否为空
获取功能:
Iterator iterator():迭代器
交集功能
boolean retainAll(Collection c):(A集合对B集合去交集,交集的元素去哪里?返回值boolean在这里表示什么意思?)
获取集合中的元素数
int size()
面试题:
数组中有没有length(),String类中有没有length(),集合中有没有length()方法?
数组中:length属性,
String类中:有length()方法,获取字符串的长度
集合中没有length()方法,获取集合的元素的方法:size()
String类中:有length()方法,获取字符串的长度
集合中没有length()方法,获取集合的元素的方法:size()
代码:
import java.util.ArrayList;
import java.util.Collection;
/**
* boolean addAll(Collection c):添加一个集合中的元素
* boolean removeAll(Collection c)移除一个集合中的元素 (删除那些也包含在指定 collection 中的所有元素
(思考:删除一个集合中所有元素才算删除还是删除一个算是删除)?
* boolean containsAll(Collection c):(思考:包含一个元素算是包含还是包含所有算是包含?)
* boolean retainAll(Collection c):(A集合对B集合去交集,交集的元素去哪里?返回值boolean在这里表示什么意思?)
返回值类型boolean在这里表示的是A集合中的元素是否发生变化!
* */
public class CollectionDemo {
public static void main(String[] args) {
//创建两个集合对象
Collection c1 = new ArrayList();
//给c1集合中添加元素
c1.add("abc1") ;
c1.add("abc2") ;
c1.add("abc3") ;
c1.add("abc4") ;
Collection c2 = new ArrayList();
//给c2集合中添加元素
c2.add("abc1") ;
c2.add("abc2") ;
// c2.add("abc3") ;
// c2.add("abc4") ;
c2.add("abc5") ;
c2.add("abc6") ;
c2.add("abc7") ;
c2.add("abc8") ;
// boolean addAll(Collection c):添加一个集合中的元素
System.out.println("addAll:"+c1.addAll(c2));
// boolean removeAll(Collection c)移除一个集合中的元素 (删除那些也包含在指定 collection 中的所有元素(思考:删除一个集合中所有元素才算删除还是删除一个算是删除)?
//包含一个元素算是删除!
// System.out.println("removeAll:"+c1.removeAll(c2));
//boolean containsAll(Collection c):(思考:包含一个元素算是包含还是包含所有算是包含?):包含一个集合中的所有元素才算包含!
// System.out.println("containsAll:"+c1.containsAll(c2));
//boolean retainAll(Collection c):(A集合对B集合去交集,交集的元素去哪里?返回值boolean在这里表示什么意思?)
/**注意:
* 如果一个A集合对B集合取交集,那么交集的元素要存储A里面,返回值类型boolean在这里
* 表示的是A集合中的元素是否发生变化!
* */
// System.out.println("retainAll:"+c1.retainAll(c2));
System.out.println("c1:"+c1);
System.out.println("c2:"+c2);
}
3. 集合中的一个转换功能:
Object[] toArray():将集合转换成数组,利用这个功能就可以完成集合对元素的遍历
代码:
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo2 {
public static void main(String[] args) {
//创建集合对象
Collection c=new ArrayList();//抽象多态,Collection是抽象类不能直接实例化
//给集合中添加元素
c.add("Good");
c.add("Good");
c.add("Study");
//将集合转换成数组
Object[] objs=c.toArray();
//遍历数组
for(int x=0;x<objs.length;x++){
//需求:我要得到字符串的同时,还要得到字符串的长度
//length(),字符串中特有的功能:长度功能
//强制类型转换
String s=(String) objs[x];
System.out.println(s+","+s.length());
}
}
}
4. Iterator iterator():迭代器 集合中的专用迭代遍历方式
Iterator接口:
Object next()返回迭代的下一个元素,获取元素
单独使用next()会报异常:java.util.NoSuchElementException:没有这样元素的异常!,现在元素已经获取到最后了
boolean hasNext():如果有下一个可以迭代的元素,请进行获取,判断功能
将上面把集合转化成数组进行遍历的代码用迭代器改进
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
//创建集合对象
Collection c=new ArrayList();
//给集合添加元素
c.add("Good");
c.add("Good");
c.add("Study");
//使用迭代器进行数组遍历
Iterator it=c.iterator();
//方式一:
//获取下一个元素
// Object obj=it.next();
// System.out.println(obj);
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());//出现异常
//java.util.NoSuchElementException:没有这样元素的异常!,现在元素已经获取到最后了
//方式二:
//优化改进,增加判断功能, boolean hasNext():如果有下一个可以迭代的元素,猜进行获取,判断功能
if(it.hasNext()){
System.out.println(it.next());
}
if(it.hasNext()){
System.out.println(it.next());
}
if(it.hasNext()){
System.out.println(it.next());
}
if(it.hasNext()){
System.out.println(it.next());
}
System.out.println(".................");
// 方式3
// 方式2 代码重复率高,使用while 循环
Iterator it2=c.iterator();
while(it2.hasNext()){
String s=(String) it2.next();
System.out.println(s+","+s.length());
}
}
}
5.练习
获取5个学生的信息并存储到数组中
public class Student {
private String name;
private int age;
public Student() {
super();
}
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 Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
//测试类
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorTest {
public static void main(String[] args) {
//创建集合对象
Collection c=new ArrayList();
//创建Student对象
Student s1=new Student("小红",23);
Student s2=new Student("小方",22);
Student s3=new Student("小名",21);
Student s4=new Student("小军",27);
Student s5=new Student("小例",24);
//给集合添加元素
c.add(s1);
c.add(s2);
c.add(s3);
c.add(s4);
c.add(s5);
//使用迭代器遍历
Iterator it=c.iterator();
while(it.hasNext()){
Student s=(Student) it.next();
System.out.println(s.getName()+"---"+s.getAge());
}
}
}