Java面向对象—集合框架

一、集合框架简介

1、数组

int [] arr=new int[50];
arr[0]=12;
arr[1]=13;
arr[2]=15;

数组:长度固定不变,可以通过.length获取长度,且不能获取实际值的个数 内存中采用连续空间存储,效率底下

如何解决这个问题呢?

2、集合框架

那么集合到底是什么呢? ●集合:集合是java中提供的一种容器,可以用来存储多个数据。 集合和数组既然都是容器,它们有啥区别呢? ●数组的长度是固定的。集合的长度是可变的。 ●数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一 致。在开发中一般当对象多的时候,使用集合进行存储。

集合框架 JAVASE提供了满足各种需求的API ,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。

集合按照其存储结构可以分为两大类,分别是单列集合java.util.collection 和双列集合java.util.Map

集合框架:是位于java.util包中的一套性能优良、使用方便的接口和类

3、ArrayList:连续空间 a b a b c d e

0 1 2 3 4 5 6

4、LinkedList:链表 a——b——a——b——c——d

二、集合中的常用方法:
  • boolean add(Object O) 在列表的末尾顺序添加元素,起始索引位置从0开始

  • void add(int index,Object O) 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间

  • int size() 返回列表中的元素个数

  • Object get(int index) 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换

  • boolean contains(Object O) 判断列表中是否存在指定元素

  • boolean remove(Object O) 从列表中删除元素

  • Object remove(int index) 从列表中删除指定位置元素,起始索引位置从0开始

三、ArrayList实现类

1、使用ArrayList实现类演示集合中的各个方法

案例:使用List集合存储狗狗信息,获取狗狗数量,按顺序打印狗狗信息,删除狗狗等。

//1、创建狗狗对象
Dog d1=new Dog("小黄","拉布拉多");
Dog d2=new Dog("小黑","泰迪");
Dog d3=new Dog("小白","金毛");
Dog d4=new Dog("小花","边牧");
//Dog d4=new Dog("小黄","拉布拉多");//注意不是同一个对象
//2、创建ArrayList集合,使用add()方法存储狗狗对象
List dogs=new ArrayList();
dogs.add(d1);
dogs.add(d2);
dogs.add(d3);
dogs.add(2,d4);
//3、获取狗狗数量
System.out.println("集合中狗狗的数量:"+dogs.size());
//4.输出每条狗狗的信息
for (int i = 0; i < dogs.size(); i++) {
    //获取对象信息,获取到的是Object类型,需要强转
    Dog dog=(Dog) dogs.get(i);
    System.out.println("姓名:"+dog.getName()+",品种:"+dog.getStrain());
}
//5、删除一只狗狗
//dogs.remove(4);//下标越界,下标从0开始,到大小的位置
dogs.remove(3);
//dogs.remove(d1);
System.out.println("集合中狗狗的数量:"+dogs.size());
//6、增强for循环,for-each
for (Object o:dogs) {
    Dog d=(Dog) o;
    System.out.println(d.getName());
}
//7、查询集合中是否包含某个狗狗
if (dogs.contains(d1)){
    System.out.println("集合中有小黄");
}else {
    System.out.println("集合中没有小黄");
}

2、泛型

泛型代表集合中数据的类型,一般都是引用类型和包装类。

(1)当指定了泛型,使用时就不需要强转了

(2)指定了泛型后,foreach循环中就只能把集合放到指定的泛型中

//1、创建狗狗对象
Dog d1=new Dog("小黄","拉布拉多");
Dog d2=new Dog("小黑","泰迪");
Dog d3=new Dog("小白","金毛");
Dog d4=new Dog("小花","边牧");
​
//2.现在的集合是Object类型的,任何值都能存
List list=new ArrayList();
list.add(d1);
list.add(1);
list.add("张三");
//但是获取值时就需要强转
Dog dog=(Dog) list.get(0);
​
//3.当指定了泛型时,就不需要强转了
List<Integer> a=new ArrayList<Integer>();
a.add(11);
//a.add("李四");
List<String> b=new ArrayList<String>();
//b.add(11);
b.add("李四");
//指定泛型为Dog类型
List<Dog> d=new ArrayList<Dog>();
d.add(d1);
d.add(d2);
d.add(d3);
d.add(d4);
for (int i = 0; i < d.size(); i++) {
    Dog dogs=d.get(i);//指定泛型后就不需要强转了
    System.out.println(dogs.getName());
}
//指定了泛型后,foreach循环中就只能把集合放到指定的泛型中
for (Dog dogs1:d) {
    System.out.println(dogs1.getName());
}
d.remove(0);
System.out.println(d.contains(0));
四、LinkedList实现类

1、LinkedList和ArrayList其实是一样的都是不唯一有序,ArrayList存连续空间;LinkedList存链表;

2、LinkedList可以在任何位置(头,中间,尾)做添加、获取、删除操作

3、添加和删除操作频繁时,使用LinkedList效率更高

4、LinkedList额外提供了对头和尾元素做添加、获取、删除操作的方法

addFirst、addLast、getFirst、getLast、removeFirst、removeLast

注意:已上方法是LinkedList类中特有的方法,List接口中没有

案例1:测试LinkedList中的添加,删除,获取等方法

Dog d1=new Dog("小黄","拉布拉多");
Dog d2=new Dog("小黑","泰迪");
Dog d3=new Dog("小白","金毛");
Dog d4=new Dog("小花","边牧");
//LinkedList和ArrayList一样,都有添加、获取、删除等方法
List list=new LinkedList();
list.add(d1);
list.add(d2);
list.add(d3);
list.add(d4);
Dog dog=(Dog) list.get(2);
System.out.println(dog.getName());
list.remove(3);
System.out.println(list.size());

案例2:测试LinkedList实现类中特有的方法

Dog d1=new Dog("小黄","拉布拉多");
Dog d2=new Dog("小黑","泰迪");
Dog d3=new Dog("小白","金毛");
Dog d4=new Dog("小花","边牧");
//对头尾操作的方法时LinkedList中特有的方法,父类到子类时是调不到的
//List list=new LinkedList();
//list.add(d1);
//list.addFirst(d2);//特有,调不到
//list.addLast(d3);
LinkedList<Dog> list=new LinkedList<Dog>();
list.add(d1);
list.add(d2);
list.addFirst(d3);
list.addLast(d4);
Dog d= list.get(2);
System.out.println(d.getName());
d= list.getFirst();
System.out.println(d.getName());
d= list.getLast();
System.out.println(d.getName());
System.out.println("删除前:"+list.size());
list.removeFirst();
list.removeLast();
System.out.println("删除后:"+list.size());
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i).getName());
}
System.out.println("----------------");
for (Dog dog:list) {
    System.out.println(dog.getName());
}
五、set集合测试:

1、set集合是无序的

2、set集合中添加时不能指定位置,也没有get()方法。

3、删除时只能删除指定的对象,不能删除指定位置

Dog d1=new Dog("小黄","拉布拉多");
Dog d2=new Dog("小黑","泰迪");
Dog d3=new Dog("小白","金毛");
Dog d4=new Dog("小花","边牧");
//创建集合对象
Set<Dog> set=new HashSet<Dog>();
set.add(d1);
set.add(d2);
set.add(d3);
set.add(d4);
//set.add(1,d2); //Set集合是无序的,也没有get()方法
//无序集合只能用foreach循环遍历
for (Dog dog:set) {
    System.out.print(dog.getName()+"\t");
}
System.out.println();
//删除后再输出
set.remove(d1);
for (Dog dog:set) {
    System.out.print(dog.getName()+"\t");
}
六、Map集合测试:

1、Map以键值对形式存取值,键唯一,值不唯一

2、Map集合中指定泛型时,也要指定成键值对形式,键一般都是String类型

3、Map集合中添加数据用put()方法,当键发生重复时,值会出现覆盖现象

4、获取和删除时可以通过键来执行

5、遍历Map集合时,可以先把所有键获取出来存Set集合,再通过遍历键集合来获取值

Dog d1=new Dog("小黄","拉布拉多");
Dog d2=new Dog("小黑","泰迪");
Dog d3=new Dog("小白","金毛");
Dog d4=new Dog("小花","边牧");
//Map集合是键值对形式存储数据,键唯一,值不唯一
//创建Map集合时,泛型要指定成键值对形式,键一般都是String类型
Map<String,Dog> map=new HashMap<String,Dog>();
//添加使用put()方法
map.put("1",d1);
map.put("2",d2);
map.put("3",d3);
map.put("1",d4);//键重复时,后添加的值会覆盖先添加的值
//获取
Dog dog=map.get("1");
System.out.println(dog.getName());
//删除
map.remove("2");
System.out.println(map.size());
​
//循环输出
//把键全部获取出来存到Set集合中
Set<String> str=map.keySet();
//使用foreach循环遍历键集合
for (String s:str){
    //通过遍历键集合取到对象
    Dog d=map.get(s);
    System.out.print(d.getName()+"\t");
}
七、迭代器

java. util. Iterator接口:迭代器(对集合进行遍历)

在程序开发中,经常需要遍历集合中的所有元素。针对这种需求, JDK专门提供了一个接口java.util.Iterator。Iterator 接口也是Java集合中的一员 ,但它与Collection、Map 接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历) Collection和Map中的元素,因此Iterator对象也被称为迭代器。

想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法 :

public Iterator iterator() :获取集合对应的迭代器,用来遍历集合中的元素的。

下面介绍一下迭代的概念:

迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

有两个常用的方法:

boolean hasNext() 如果仍有元素可以迭代,则返回true。判断集合中还有没有下一个元素,有就返回true,没有就返回false

E next() 返回迭代的下一个元素。取出集合中的下一个元素

Iterator迭代器,是一个接口, 我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象

Iterator<E> iterator() 返回在此Collection 的元素上进行迭代的迭代器。

迭代器的使用步骤(重点):

1.使用集合中的方法iterator( )获取迭代器的实现类对象,使用Iterator接口接收(多态)

2.使用Iterator接口中的方法hasNext判断还有没有下一个元素

3.使用Iterator接口中的方法next取出集合中的下一个元素

Dog d1 = new Dog("小黄", "拉布拉多");
Dog d2 = new Dog("小黑", "泰迪");
Dog d3 = new Dog("小白", "金毛");
Dog d4 = new Dog("小花", "边牧");
//ArrayList
List list =new ArrayList();//Object类型
list.add(d1);
list.add(d2);
list.add(d3);
list.add(d4);
//1、把list集合元素放到迭代器中
Iterator i=list.iterator();
//2、判断迭代器中是否有下一个元素
while (i.hasNext()){
    //3、取出迭代器中下一个元素
    Object o=i.next();//存Object类型
    Dog d=(Dog) o;//转型
    System.out.print(((Dog) o).getName()+"\t");
}
//LinkedList
List list1=new LinkedList();
list1.add(d1);
list1.add(d2);
list1.add(d3);
list1.add(d4);
//1、把list1集合元素放到迭代器中
Iterator i1=list1.iterator();
//2、判断迭代器中是否有下一个元素
while (i1.hasNext()){
    //3、取出迭代器中下一个元素
    Object o=i1.next();//存Object类型
    Dog d=(Dog) o;//转型
    System.out.print(((Dog) o).getName()+"\t");
}
//HashSet
Set set=new HashSet();
set.add(d1);
set.add(d2);
set.add(d3);
set.add(d4);
//1、把set集合元素放到迭代器中
Iterator i3=set.iterator();
//2、判断迭代器中是否有下一个元素
while (i3.hasNext()){
    //3、取出迭代器中下一个元素
    Object o=i3.next();//存Object类型
    Dog d=(Dog) o;//转型
    System.out.print(((Dog) o).getName()+"\t");
}
//HashMap
Map<String,Dog> map=new HashMap<String,Dog>();
map.put("1",d1);
map.put("2",d2);
map.put("3",d3);
map.put("4",d4);
//把键取出来存Set集合
Set<String> s=map.keySet();
//1、把键集合元素放到迭代器中
Iterator<String> i4=s.iterator();
//2、判断迭代器中是否有下一个元素
while (i4.hasNext()){
    //3、取出迭代器中下一个元素
    String str=i4.next();//存Object类型
    Dog d=map.get(str);
    System.out.print(str+":"+d.getName()+"\t");
}
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值