什么是集合
集合:就是用来存放数据的一个容器
数组的不足:
1.长度是固定的,不能再去添加元素
Java提供集合类
它的长度是可以改变的
能存储任意的对象
长度是随着你的元素增加而增加的
数组和集合的区别?
1.数组能存基本数据类型,和引用类型
2.集合当中只能存放引用数据类型,直接放,也会帮你自动装箱(把基本数据类型转成对象)
集合当中只能存放对象
3.数组长度是固定的,不能再去增长
集合长度是可以改变,根据元素的增长而增加
什么时候使用数组,什么时候使用集合?
1.如果元素个数是固定,推荐使用数组
2.如果元素不是固定,推荐使用集合
集合类继承体系
Collection添加元素
1.集合当中存的都是对象,集合可以当成是数组,不断往后增加元素
2.Collection是一个接口类型,需要一个实现类进行创建继承
3.添加基本数据类型,会帮你自动装箱(把基本数据类型转成对象)
4.List当中可以添加重复的元素,add方法添加元素,它的返回值都是true
所以在今后开发当中,不会接收结果
因为在set当中是不能添加重复元素的,如果添加就给你一个false
5.ArrayList当中覆盖了toString的方法,直接可以打印结果
package 面向对象.集合;
import java.util.ArrayList;
import java.util.Collection;
class Student{
String name;
String age;
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
public class CollectionDemo {
public static void main(String[] args) {
多态写法,面向接口编程 运行时,表现出来的是子类特征
集合当中存的都是对象
Collection c = new ArrayList();//可以当成是数组,不断往后增加元素
boolean b1 = c.add("abc");
boolean b2 = c.add(10);//会帮你自动装箱(把基本数据类型转成对象)
boolean b3 = c.add(true);
//boolean b2 = c.add(Integer.valueOf(10));
//boolean b3 = c.add(Boolean.valueOf(true));
Student s = new Student();
s.age="17";
s.name="zs";
boolean b4 = c.add(s);
boolean b5 = c.add("abc");//List当中可以添加重复的元素
//List当中的add返回值都是true
//所以在今后开发当中,不会接收结果
//因为在set当中是不能添加重复元素的,如果添加就给你一个false
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);
System.out.println(b5);
System.out.println(c);//[abc, 10, true, 面向对象.集合.Student@15db9742, abc]
//ArrayList当中覆盖了toString的方法,直接可以打印结果
//[abc, 10, true, Student [name=zs, age=17], abc] student类当中覆盖了toString的这个方法
}
}
Collection常用方法
@SuppressWarnings({ "rawtypes", "unchecked" })//扫黄,main方法当中不再出现这些警告
Collection集合方法
public static void main(String[] args) {
Collection c2 = new ArrayList();
c2.add("a");
c2.add("b");
c2.add("c");
System.out.println(c2);//[a, b, c]
可以从集合当中移除指定的元素
c2.remove("a");
System.out.println(c2);//[b, c]
判断一个集合是否为空,true,false
System.out.println(c2.isEmpty());//false
获取集合当中的长度(有几个元素)
System.out.println(c2.size());//size:2 与数组的length一样
清空集合当中的所有内容
c2.clear();
System.out.println(c2);//[]
}
Collection集合转普通数组
集合的遍历:从集合当中一个一个取
元素
package 面向对象.集合;
import java.util.ArrayList;
import java.util.Collection;
class Dog {
private String name;
public String getName() {
return name;
}
Dog(String name) {
this.name = name;
}
}
public class CollectionDemo {
@SuppressWarnings("rawtypes")//扫黄
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
System.out.println(c);
遍历数组
先把集合转成数组, 使用toArray() 返回Object类型
获取数组中的每一个元素
Object[] arr = c.toArray();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
Collection c2 = new ArrayList();
c2.add(new Dog("wc"));//添加狗对象
c2.add(new Dog("wc2"));
c2.add(new Dog("wc3"));
并不能使用get方法 arr2[i].getName()
因为数组当中都是Object
Object[] arr2 = c2.toArray();
并不能使用get方法 arr2[i].getName()
因为数组当中都是Object
自动把数组当中的元素向上转型了,向根类转型了,转为万物之主Object
Object当中没有办法去调用具体类型当中的方法
for (int i = 0; i < arr2.length; i++) {
Dog d = (Dog)arr2[i]; 向下转型
System.out.println(d.getName());
}
}
}
Collection集合带all常用方法
eclipse快捷键 Alt+Shift+R
Collection c1 = new ArrayList();
c1.add("a");
c1.add("b");
c1.add("c");
c1.add("d");
Collection c2 = new ArrayList();
c2.add("a");
c2.add("b");
c2.add("c");
c2.add("d");
System.out.println(c1);[a, b, c, d]
把c2的所有元素合并到c1当中
c1.addAll(c2);
//c1.add(c2);是添加对象[a, b, c, d, [a, b, c, d]]
System.out.println(c1);//[a, b, c, d, a, b, c, d]
Collection c3 = new ArrayList();
c3.add("a");
c3.add("b");
从c1当中删除两个集合的交集removeAll
c1.removeAll(c3);
System.out.println(c1);//[a, b, c, d, a, b, c, d] ----> [c, d, c, d]
Collection c4 = new ArrayList();
c4.add("c");
c4.add("d");
判断调用的集合是否全部包含传入的集合containsAll
boolean res = c1.containsAll(c4);
System.out.println(res);//true
Collection c5 = new ArrayList();
c5.add("c");
c5.add("d");
取交集 retainAll 把交集的结果赋值给调用者 , 有返回值boolean
如果调用的集合改变了,就返回true,c1没改变就返回false
boolean b = c1.retainAll(c5);
System.out.println(c1);//[c, d, c, d]
System.out.println(b);//false
Collection迭代器遍历元素
迭代器(iterator)
集合当中的元素直接放到迭代器当中,迭代器当中有方法直接取出元素
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
//数组遍历
Object[] o = c.toArray();
for (Object object : o) {
System.out.println(object);
}
迭代器遍历
Iterator it = c.iterator();// 放到Iterator内容会自动提升,Object
获取迭代器当中的内容
Object obj = it.next();// 把当前游标的内容取出来,当前的游标往后走一位
System.out.println(obj);// a
Object obj2 = it.next();
System.out.println(obj2);// b
Object obj3 = it.next();
System.out.println(obj3);// c
判断迭代器当中是否还有元素 如果有就返回true,没有就返回false
boolean res = it.hasNext();
System.out.println(res);// 游标到了尽头没有元素了,false
System.out.println("-------");
1.先判断有没有元素,然后再执行下一步
while (it.hasNext()) {
2.如果有,取出元素
System.out.println(it.next());//把上面的代码注释掉,然后会输出 a,b,c
}
}
Collection迭代器遍历自定义对象
class Cat {
String name;
Cat(String name) {
this.name = name;
}
void show() {
System.out.println(this.name);
}
}
public class CollectionDemo1 {
public static void main(String[] args) {
在每一个实现类当中都定义了自己的迭代方法
Collection c2 = new ArrayList();
c2.add(new Cat("mimi"));
c2.add(new Cat("mm"));
Iterator it2= c2.iterator();//迭代器遍历,里面的对象都会自动提升为Object类型
while(it2.hasNext()) {
Cat cat = (Cat)it2.next();//向下转型
cat.show(); //mimi mm
}
}
}