第一章 集合框架和泛型(一)

Java高级特性

集合框架和泛型(一)

在开发应用程序时,如果想存储多个同类型的数据,可以使用数组来实现;但是使用数组存在数组长度固定不变的明显缺陷。
因此,产生了集合框架,也就是说,集合框架是对数组的升级。

一、集合

1、集合框架

集合框架就是Java提供的一套可以存储多个变量,并且长度可变的Java类,这些类的属性用于存储数据,而类的方法就是对这些所存储数据的操作。

2、Java集合框架结构图

在这里插入图片描述
注意:虚线表示接口或者抽象类,实线表示实现类。
(1)Collection(集合):是一个接口,其含义就是集合,就是对数组的升级,称之为线性表。
(2)Collecion接口下有两个常用的子接口,List和Set。其中:

  • List接口就是对数组的二次升级,包含两个常用的实现类:ArrayList和LinkedList。
  • Set接口虽然也是存储多个数据,但是其存储数据的特征是不重复,有一个常用的实现类:HashSet。

(3)Map接口:称之为散性表。其存储数据的特征是成对存储,包含key-value。呈现出键值对的形式,其常用的实现类:HashMap。
(4)List接口:其存储的特征和数组完全保持一致,有序可重复。
(5)Set接口:其存储特征是有序可重复。

3、ArrayList类

(1)这个类其存储数据的结构就是采用了数组,其属性就是一个数组,方法就是对这个数组的操作。
(2)ArrayList和数组采用相同的存储方式,在内存中分配连续的空间。经常称ArrayList为动态数组。
(3)ArrayList的源代码得到:

  • 存储数据时,使用的是一个Object[]的类型
    在这里插入图片描述

  • 当创建一个ArrayList时,如果不存放任何元素,那么ArrayList就是空的,其内部的Object[]就是一个长度为0的空数组。
    在这里插入图片描述
    在这里插入图片描述

  • 当ArrayList存入第一个元素时,那么内部那个空Object[]类型的数组会自动进行扩容为一个长度为10的Object[]。
    在这里插入图片描述
    在这里插入图片描述

  • 当每一次ArrayList中Object[]的元素放满时,会自动在其基础上扩容,增加原来的0.5倍。
    在这里插入图片描述

  • 正是由于ArrayList采用的是一个Object[],因此ArrayList会将所有元素进行连续存放,就导致在查找某个元素时效率较高,但是在移除或者添加元素时效率较低。

4、ArrayList类的常用方法

在这里插入图片描述
在这里插入图片描述

public class ArrayListDemo01 {
	public static void main(String[] args) {
		// 创建 ArrayList 类型的对象
		ArrayList arrayList = new ArrayList();
		// 要想查看此时 ArrayList 中存放了多少个元素,可以使用 ArrayList 的 size()
		System.out.println("此时 ArrayList 的元素个数是:" + arrayList.size());
		// 如果需要向 ArrayList 中放入元素,则可以通过 add() 来完成
		arrayList.add("张三");
		System.out.println("存入姬翔后,ArrayList 的元素个数是:" + arrayList.size());
		arrayList.add("里斯");
		arrayList.add(250);
		arrayList.add(true);
		System.out.println("经过元素存放之后,ArrayList 的元素个数是:" + arrayList.size());
		// 对于 ArrayList 来说,可以直接在控制台输出
		System.out.println(arrayList);
		// 如果需要获得存入到 ArrayList 中的元素,则可以通过 get() 以下标的方式进行获取
		System.out.println("下标为 2 的元素是:" + arrayList.get(2));
		// 如果需要移除一个元素,那么使用下标通过 remove() 完成
		arrayList.remove(2);
		System.out.println(arrayList);
		// 除了按照下标进行移除之外,还可以按照元素的值来进行移除
		// 在移除时,会首先查找是否存在该元素,如果存在,那么进行移除
		arrayList.remove("里斯");
		// 如果要移除所有元素,可以通过 removeAll()、clear()
        //		arrayList.clear();
		System.out.println(arrayList);
		// 要想在数组中查找是否存在某个元素,可以通过 contains() 来进行
		System.out.println(arrayList.contains("王五"));
		// 如果需要在查找到某个元素后,获得这个元素的下标,则可以通过 indexOf 进行
		// 当对应的元素不存在时,返回的下标为 -1,表明该元素不存在。
		System.out.println(arrayList.indexOf(false));
		// 如果要判断一个集合中是否为空集合,可以使用长度为 0,
		// 或者使用 isEmpty()
		System.out.println(arrayList.isEmpty());
	}
}
5、LinkedList类

(1)其存储和操作与ArrayList一致,但是LinkedList的内部结构采用了双向链表的机构来实现,对比此结构,不再需要所有元素必须连续存放,其存储元素时,每个元素都会包含三个信息:

  • 头部信息:存储上一个元素的地址;
  • 元素信息:所存储的数据;
  • 尾部信息:存取下一个元素的地址。
    (2)LinkedList采用了双向链表,其特征:
    在这里插入图片描述
  • 存储的数据将不再需要时连续空间存储,每个元素都会知道其上一个和下一个元素的位置,只要有内存空间,就可以进行存放。
  • 插入和删除元素时,只需要最多两个元素即可完成,因此LinkedList的插入和删除效率较高。
  • 因为所有元素都不采用连续的空间存储,因此查询效率较低。
6、LinkedList类

在这里插入图片描述

public class LinkedListDemo01 {
	public static void main(String[] args) {
		/*
		 * LinkedList 和 ArrayList 来自于同一个 List 接口,
		 * 那么这两个集合的操作方法大致相同,
		 */
		// 创建 LinkedList 对象
		LinkedList linkedList = new LinkedList();
		// 获得该 LinkedList 集合的长度,同样使用 size()
		System.out.println("LinkedList 的长度是:" + linkedList.size());
		// 区别在于添加元素时,处理 add() 向后添加之外,还提供了向头部添加
		linkedList.add("张三");
		linkedList.add("李四");
		System.out.println(linkedList);
		linkedList.addFirst("王五");
		System.out.println(linkedList);
		// 和向最后添加
		linkedList.addLast("赵六");
		System.out.println(linkedList);
		// 要想获得元素,通过 get() 按照下标获取
		System.out.println(linkedList.get(3));
		// 也可以直接获得第一个和最后一个
		System.out.println(linkedList.getFirst());
		System.out.println(linkedList.getLast());
		// 同理移除也提供了 removeFirst 和 removeLast
	}
}

二、泛型

  • 对集合来说,所存放的元素要求时Object类型,那么意味着任何类型的元素都可以进行存放,但是当从集合中获取这些元素时,就会导致无法确定该元素真正的数据类型,也为以后使用代码带来极大的不便,因此我们需要限定存入该集合的元素数据类型。
  • 为了限定存入数组中元素的数据类型,在JDK5时,提出泛型这一概念,泛型就是用于限定存入一个集合元素的数据类型。
  • 泛型中所写的类型必须是引用数据类型。
1、泛型的概念

将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转转换的安全性和稳定性,称之为泛型。
在这里插入图片描述

2、本质

参数化类型

三、增强型for循环(for-each)

编程中采用哪种for循环呢?主要是取决你的需求,如果你要对元素下标,也就是索引进行操作,那么选择传统的for循环,如果你实现操作和索引没有关系,建议采用for-each循环。下面通过例子,来介绍下这样的情况。

1、for循环遍历数组
public class LianXi16 {
	public static void main(String[] args) {
		int[] arr = {1,3,4,1,5};
		for(int i = 0;i<arr.length;i++) {
			System.out.println(i);
		}

	}
}
2、for-each遍历数组
public class LianXi16 {
	public static void main(String[] args) {
		int[] arr = {1,3,4,1,5};

		for(int a:arr) {
			System.out.println(a);
		}
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值