1、什么是集合?有什么用?
数组其实就是一个集合。集合实际上就是一个容器。可以来容纳其它类型的数据。
1.1.集合为什么说在开发中使用较多?
集合是一个容器,是一个载体,可以一次容纳多个对象。
-
在实际开发中,假设连接数据库,数据库当中有10条记录, 那么假设把这10条记录查询出来,在java程序中会将10条数据封装成10个java对象, 然后将10个java对象放到某一个集合当中, 将集合传到前端,然后遍历集合,将一个数据一个数据展现出来。
1.2、集合不能直接存储基本数据类型,另外集合也不能直接存储java对象,
集合当中存储的都是java对象的内存地址。(或者说集合中存储的是引用。)
-
list.add(100); //自动装箱Integer 注意: 集合在java中本身是一个容器,是一个对象。 集合中任何时候存储的都是“引用”。
1.3、在java中每一个不同的集合,底层会对应不同的数据结构。往不同的集合中
存储元素,等于将数据放到了不同的数据结构当中。
-
什么是数据结构?
-
数据存储的结构就是数据结构。不同的数据结构,数据存储方式不同。例如: 数组、二叉树、链表、哈希表... 以上这些都是常见的数据结构。 你使用不同的集合等同于使用了不同的数据结构。
-
java中你需要掌握的不是精通数据结构。java中已经将数据结构实现了,已经写好了这些常用的集合类,你只需要掌握怎么用?在什么情况下选择哪一种合适的集合去使用即可。
new ArrayList(); 创建一个集合,底层是数组。 new LinkedList(); 创建一个集合对象,底层是链表。 new TreeSet(); 创建一个集合对象,底层是二叉树。 .....
1.4、集合在java JDK中哪个包下?
java.util.*;
所有的集合类和集合接口都在java.util包下。
1.5、为了让大家掌握集合这块的内容,最好能将集合的继承结构图背会!!!
- Collection
- Map
1.6、在java中集合分为两大类:
-
一类是单个方式存储元素: 单个方式存储元素,这一类集合中超级父接口:java.util.Collection;
-
一类是以键值对儿的方式存储元素 以键值对的方式存储元素,这一类集合中超级父接口:java.util.Map;
1.7.Collection常用方法
- xx.add(Object e);//加入集合元素
- xx.size();集合大小
- xx.clear();//清空
- xx.contains(Object e);//测试集合中是否包含e
- xx.remove(Object e);//从集合中移除e
1.8.获取迭代器—与—重新获取迭代器
-
Iterator i1=xx.iterator();//获取迭代器
注意:当集合发生改变时,eg:xx.add(Object e)、xx.remove(Object e);必须重新获取迭代器,否则报错
2、总结重点:
-
一:把集合继承结构图背会。
-
二:把Collection接口中常用方法测试几遍。
-
三:把迭代器弄明白。
-
四:Collection接口中的remove方法和contains方法底层都会调用equals,
3.案例程序
注意分析,重写equals的部分。
执行结果:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class SetTest {
public static void main(String[] args) {
Collection c1=new ArrayList();
for (int i=0;i<10;i++){
c1.add(i); /**向集合添加元素**/
}
Object[] obj1=c1.toArray(); /****集合中的元素返回存储到数组**/
System.out.print("c1.toArray()数组输出元素:");
for (int i=0;i<c1.size();i++){
System.out.print(obj1[i]+",");
}
System.out.println();
System.out.println("c1.size():"+c1.size()); /***集合的大小**/
System.out.println("c1.contains():"+c1.contains(1));/***是否包含元素1**/
c1.remove(1); /*****移除元素1***/
System.out.println("c1.contains():"+c1.contains(1));/***是否包含元素1**/
System.out.println("c1.size():"+c1.size()); /***集合的大小**/
System.out.println("c1.isEmpty():"+c1.isEmpty());/***集合是否为空**/
System.out.print("迭代器Iterator的i1.hasNext()、i1.next()输出元素:");
Iterator i1=c1.iterator();
while (i1.hasNext()){ /**先判断下一个是否还有?*****/
Object obj2=i1.next();/****返回下一个元素****/
System.out.print(obj2+",");/**输出*/
}
System.out.println();
/*****Collection接口中的remove方法和contains方法底层都会调用equals,需要重写equals方法****/
User u1=new User("jack");
User u2=new User("jack");
/***注意此处添加的是u1**/
c1.add(u1);
/**1、*//******重写equals方法,是为了让contains在调用底层equals时,比较对象的内容,而不是比较对象的内存地址*
*执行c1.contains(u2)时,它会因为u1和u2内容相同,而返回true
* 如果不重写equals就会返回false
* */
System.out.println("重写equals方法,After c1.add(u1),c1.contains(u2)?:"+c1.contains(u2));/**返回true*/
/**2、*//***调用迭代器,输出集合中的元素,String类型的对象,需要在该类中重写toString()方法**/
System.out.print("迭代器Iterator的i2.hasNext()、i2.next()输出元素:");
Iterator i2=c1.iterator();
while (i2.hasNext()){ /**先判断下一个是否还有?*****/
Object obj2=i2.next();/****返回下一个元素****/
System.out.print(obj2+",");/**输出*/
}
System.out.println();
/**3、*//******重写equals方法,也让remove在调用底层equals时,删除内容相同的对象,而不是按内存地址删除对象
* 所以c1.remove可以删除对象u1,因为两者内容相同
* **/
c1.remove(u2);
System.out.print("重写equals方法,After c1.remove(u2),迭代器Iterator的i3.hasNext()、i3.next()输出元素:");
Iterator i3=c1.iterator();
while (i3.hasNext()){ /**先判断下一个是否还有?*****/
Object obj2=i3.next();/****返回下一个元素****/
System.out.print(obj2+",");/**输出*/
}
System.out.println();
c1.clear();/***清空集合**/
System.out.println("c1.isEmpty():"+c1.isEmpty());/***集合是否为空**/
}
}
class User{
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
/**1、重写equals方法*/
public boolean equals(Object obj){
if (null==obj || !(obj instanceof User)){
return false;
}
if (obj==this)
return true;
return ((User) obj).name.equals(this.name);
}
/**2、重写toString()方法*/
public String toString(){
return this.name;
}
}