如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用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集合底层是链表结构,删除和插入元素效率高
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);
- }*/
- }
-
- }
1)Set接口存储一组唯一,无序的对象
2)HashSet是Set接口常用的实现类
Set接口不存在get()方法
3)Set中存放对象的引用
判断加入对象是否已经存在:
采用对象的equals()方法比较两个对象是否相等
方法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);
- }
- }
-
- }