集合的使用:
如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架
java集合框架:
在java中数据结构是以某种形式将数据组织在一起的集合。他们不仅存储数据,还支持访问以及处理数据的操作。这些数据结构通常称为java集合框架。
1、容器:一种能够存储其他数据或者元素的数据结构。
2、java集合框架支持的两种类型的容器:
1)、一种是为了存储一个元素集合,简称为集合(collection)。
2)、另一种是为了存储键/值对,称为图(map)。
1)准备数据:创建NewsTitle类对象
NewsTitle nt1 = new NewsTitle(对象(即数据));
2)准备容器:创建集合对象,创建ArrayList对象
ArrayList al = new ArrayList();//集合名:al
准备容器:创建集合对象,创建LinkedList对象
List list = new LinkedList();
集合包含的内容
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中
1)接口:Collection、Map
Collection包含了List和Set两大分支。
2)具体类
3)算法
Collection提供了对集合进行排序、遍历等多种算法实现
1)List集合中元素的特点:
不唯一(可重复)、有序
2)Set集合中元素的特点
唯一(不可重复)、无序
3)Map集合中元素的特点
键唯一、值不唯一
遍历集合的方法
遍历集合的方法有三种:
1)List集合:普通for循环、增强for循环、迭代器
2)Set集合:增强for循环、迭代器
3)Map集合:增强for循环、迭代器、键值对遍历
ArrayList和LinkedList集合的区别
ArrayList集合底层是长度可变的数组,遍历和查询集合中的元素效率高
LinkedList集合底层是链表结构,删除和插入元素效率高
List接口
List三种遍历方法都可采用
确定存储方式
ArrayList类是List接口的一个具体实现类
ArrayList对象实现了可变大小的数组
随机访问和遍历元素时,它提供更好的性能
确定存储对象
创建类型:新闻标题
包含属性: ID、名称、创建者
具体实现
代码:
类
package GatherDemo01;
public class NewsTitle {
private int id;//编号
private String name;//标题名称
private String author;//作者
public NewsTitle() {
super();
}
public NewsTitle(int id, String name, String author) {
super();
this.id = id;
this.name = name;
this.author = author;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "NewsTitle [id=" + id + ", name=" + name + ", author=" + author
+ "]";
}
}
对象:
package GatherDemo01;
import java.util.ArrayList;
public class ArrayListDemo01 {
public static void main(String[] args) {
// 准备数据:创建5个NewsTitle类对象
NewsTitle nt1 = new NewsTitle(1001, "三亚新增本土480+774", "百度");
NewsTitle nt2 = new NewsTitle(1002, "中国成功发射一箭十六星", "中国航天");
NewsTitle nt3 = new NewsTitle(1003, "男子救落水5人后遇难 同伴讲述经过", "民间观察");
NewsTitle nt4 = new NewsTitle(1004, "苏氏祖祠:苏炳添是苏东坡第29代孙", "生活观察");
NewsTitle nt5 = new NewsTitle(1005, "家长花200万给娃集奥特曼卡没集齐", "合肥观察");
// 准备容器:创建集合对象,创建ArrayList对象
ArrayList al = new ArrayList();
// 将数据存储到集合中,向集合中添加元素不是通过元素下标来赋值,而是通过集合对象调用方法实现
al.add(nt1);
al.add(nt3);
al.add(nt4);
al.add(nt2);
al.add(nt4);
// 可以通过集合对象调用方法实现对集合中元素的操作
// 获取集合中的元素个数
int size = al.size();
System.out.println("al集合中元素个数:" + size);
/*// 获取集合中指定位置的元素
Object obj0=al.get(0);
NewsTitle nwt0 = (NewsTitle)obj0;
System.out.println(nwt0);
Object obj1=al.get(1);
NewsTitle nwt1 = (NewsTitle)obj1;
System.out.println(nwt1);
Object obj2=al.get(2);
NewsTitle nwt2 = (NewsTitle)obj2;
System.out.println(nwt2);
Object obj3=al.get(3);
NewsTitle nwt3 = (NewsTitle)obj3;
System.out.println(nwt3);
Object obj4=al.get(4);
NewsTitle nwt4 = (NewsTitle)obj4;
System.out.println(nwt4);*/
/* // 遍历集合
for (int i = 0; i < al.size(); i++) {
Object object = al.get(i);
NewsTitle ntw = (NewsTitle) object;
System.out.println(ntw);
}*/
System.out.println("--------------------");
// 增强for循环遍历集合
/*for (Object object : al) {
NewsTitle ntw = (NewsTitle) object;
System.out.println(ntw);
}*/
System.out.println("--------------------");
// 使用迭代器遍历集合
/*
* 集合对象调用iterator()方法将集合中的所有元素按照顺序取出来放入到迭代器容器里面
* 然后通过迭代器对象调用hasNext()方法判断迭代器中是否有元素,有元素就通过next()方法取出这个元素
* 判断一个就取出一个,判断一个就取出一个,所以可以使用循环来取出里面所有的元素
*/
/*Iterator it = al.iterator();
while (it.hasNext()) {
Object object = it.next();
NewsTitle nt = (NewsTitle) object;
System.out.println(nt);
}*/
System.out.println("--------------------");
//将数据存储到集合中的指定位置
al.add(1, nt5);//将元素nt5插入到下标为1的位置
// 增强for循环遍历集合
for (Object object : al) {
NewsTitle ntw = (NewsTitle) object;
System.out.println(ntw);
}
System.out.println("---------------------");
//删除集合中的某个元素
// Object ob=al.remove(1);//刪除下标为1的元素
/*al.remove(nt3);
for (Object object : al) {
NewsTitle ntw = (NewsTitle) object;
System.out.println(ntw);
}*/
//判断集合中是否包含指定的元素
/*boolean result =al.contains(nt3);
System.out.println("集合中包含nt3元素:"+result);*/
//判断集合是不是空的
/*System.out.println("集合是空的:"+al.isEmpty());*/
//清空集合
/*al.clear();
System.out.println("集合是空的:"+al.isEmpty());
System.out.println(al.size());*/
System.out.println("****************************");
//将集合转换成数组
Object[] objects=al.toArray();
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
System.out.println("****************************");
/*//清空集合
al.clear();
System.out.println("集合是空的:"+al.isEmpty());
System.out.println(al.size());*/
}
}
对象
package GatherDemo01;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class LinkedListDemo01 {
public static void main(String[] args) {
// 准备数据:创建5个NewsTitle类对象
NewsTitle nt1 = new NewsTitle(1001, "三亚新增本土480+774", "百度");
NewsTitle nt2 = new NewsTitle(1002, "中国成功发射一箭十六星", "中国航天");
NewsTitle nt3 = new NewsTitle(1003, "男子救落水5人后遇难 同伴讲述经过", "民间观察");
NewsTitle nt4 = new NewsTitle(1004, "苏氏祖祠:苏炳添是苏东坡第29代孙", "生活观察");
NewsTitle nt5 = new NewsTitle(1005, "家长花200万给娃集奥特曼卡没集齐", "合肥观察");
// 准备容器:创建集合对象,创建LinkedList对象
// List是一个接口,LinkedList是List接口的实现类,将List接口引用指向了实现类的实例,
// 向上转型:父类(接口)的引用指向子类的实例,父类引用无法调用子类特有的方法
List list = new LinkedList();
list.add(nt1);
list.add(nt3);
list.add(nt2);
list.add(nt2);
System.out.println(list.size());
//使用迭代器将list集合进行遍历
Iterator it =list.iterator();
while(it.hasNext()){
Object object =it.next();
NewsTitle nt = (NewsTitle)object;
System.out.println(nt);
}
System.out.println("-------------------------");
/*向下转型:子类的引用指向父类的对象 需要进行向下转型的原因是父类
引用无法调用子类中特有的方法,子类特有的方法只能通过子类对象调用*/
LinkedList link = (LinkedList)list;
link.addFirst(nt5);
link.addLast(nt4);
for (Object object : link) {
System.out.println(object);
}
System.out.println("-------------------------");
//获取集合中的第一个元素和最后一个元素
System.out.println(link.getFirst());
System.out.println(link.getLast());
/*System.out.println("-------------------------");
//删除集合中的第一个元素和最后一个元素
link.removeFirst();
link.removeLast();
for (Object object : link) {
System.out.println(object);
}*/
}
}
Set接口
1)Set接口存储一组唯一,无序的对象
2)HashSet是Set接口常用的实现类
Set接口不存在get()方法
3)Set中存放对象的引用
判断加入对象是否已经存在:
采用对象的equals()方法比较两个对象是否相等
遍历Set集合:
方法1:通过迭代器Iterator实现遍历
1)获取Iterator :Collection 接口的iterator()方法
2)Iterator的方法
boolean hasNext(): 判断是否存在另一个可访问
的元素
Object next(): 返回要访问的下一个元素
方法2:增强型for循环
package GatherDemo03;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapDemo01 {
public static void main(String[] args) {
//准备容器:创建HashMap对象
HashMap hm = new HashMap();
//准备元素并将元素存储到集合中
hm.put("CN", "中华人民共和国");
hm.put("JP", "小日本");
hm.put("RU", "俄罗斯联邦");
hm.put("USA", "美利坚合众国");
hm.put("UK", "大不列颠及北爱尔兰联合王国");
System.out.println(hm.size());
//根据键获取对应的值
Object obj1=hm.get("CN");
String str1=(String)obj1;
System.out.println(str1);
System.out.println(hm.get("CNN"));
//删除集合中的元素
Object obj2=hm.remove("JP");
String str2=(String)obj2;
System.out.println(str2);
System.out.println(hm.size());//删除元素JP,还有4个元素
//获取HashMep集合中所有键值对的键
Set keys=hm.keySet();
for (Object object : keys) {
String key=(String)object;
System.out.println(key);
}
//获取HashMep集合中所有键值对的值
Collection values= hm.values();
for (Object object : values) {
String value=(String)object;
System.out.println(value);
}
//查询集合中是否存在指定键对应的键值对
System.out.println(hm.containsKey("RU"));//true
System.out.println(hm.containsKey("JP"));//false
//遍历键值对的3种方式
//方式一:获取键的集合,然后在遍历键的集合过程中调用get()方法获取值
Set keys2 = hm.keySet();
for (Object object : keys2) {
//获得键
String key=(String)object;
//根据键获取值
Object obj=hm.get(key);
String value = (String)obj;
System.out.println(key+"---"+value);
}
System.out.println("********************************");
//方式二:获取键的集合,然后在遍历键的集合过程中调用get()方法获取值
Set keys3=hm.keySet();
Iterator it = keys3.iterator();
while (it.hasNext()) {
Object object = it.next();
String key=(String)object;
//获得键
Object obj=hm.get(key);
String value=(String)obj;
System.out.println(key+"---"+value);
}
System.out.println("********************************");
//方式三:键值对遍历,将hm集合中的键值对整体取出来后放入到Set集合中
/*
*1)使用entrySet( )方法将hm集合中的键值对整体取出来放在Set集合中
*
*2)然后使用增强for循环或者迭代器取出Set集合中的键值对元素,取出来的
* 是Object类型,实际,上键值对的真正类型是Map. Entry类型
*
*3)所以将取出来的元素强制转换为Map. Entry类型,Map. Entry类中有getKey( )
* 方法获取键值对的键,有getValue( )方法获取键值对的值
*/
Set keyValues=hm.entrySet();
for (Object object : keyValues) {
Map.Entry me = (Map.Entry)object;
//获取键
Object object1=me.getKey();
String key = (String)object1;
//根据键获取值
Object object2=me.getValue();
String value = (String)object2;
System.out.println(key+"---"+value);
}
}
}