Java集合讲解

2021-12-09 15:00:08 浏览数 (1)

代码语言:javascript复制
	Java也学到集合了,今天我就来整理整理Java集合的使用以及其中的常用的知识点

Java集合

代码语言:txt复制
    - [一、Java的集合框架与结构](https://cloud.tencent.com/developer)
    - [1.1 List接口](https://cloud.tencent.com/developer)
            - [1.1.1 List 接口的特点](https://cloud.tencent.com/developer)
            - [1.1.2 List 接口常用方法](https://cloud.tencent.com/developer)
            - [1.1.3 LinkedList类](https://cloud.tencent.com/developer)
            - [1.1.4 Vector类](https://cloud.tencent.com/developer)
            - [1.1.5 ArrayList 和 Vector作比较](https://cloud.tencent.com/developer)
    - [2.1 Set 接口](https://cloud.tencent.com/developer)
            - [2.1.1 HashSet 类讲解](https://cloud.tencent.com/developer)
            - [2.1.2 小总结(List 类 Set 类 Map类的特点)](https://cloud.tencent.com/developer)
            - [2.1.3 Map的常用子类](https://cloud.tencent.com/developer)
            - [2.1.4 Iterator迭代器讲解](https://cloud.tencent.com/developer)
    - [3.1 泛型](https://cloud.tencent.com/developer)
    - [总结](https://cloud.tencent.com/developer)

我们之前使用数组的时候,总是要声明数组的空间,但是数组的大小一旦申请完空间,就无法改动了,数组毕竟是一个静态的数据结构,这使得我们的增删改查也有很大的限制,为了防止数据溢出,我们总是会多定义几个空间,但是有没有一种办法使我们不用自己另外给数组添加空间呢?

我们来试试集合

一、Java的集合框架与结构

  • Java中的集合框架是指一系列存储数据的接口和类,这些接口和类都存放在 util包中
  • 有了集合框架我们就可以解决复杂的数据存储问题

下面是一张Java集合框架的思维导图,可以帮助大家理解

1.1 List接口

通过上面的思维导图我们可以知道,List接口是通过Collection接口实现的

1.1.1 List 接口的特点
  1. 存储的数据有序
  2. 可以保存重复的元素
1.1.2 List 接口常用方法
  1. Lsit 常用子类有: ArrayList 和 Vector
  2. ArrayList 用法类似数组,其容量会按照实际情况动态调整,所以也称为动态数组
  3. Vector 也称为动态数组,但是和ArrayList类有些区别

下面给大家分享一些list的常用方法,直接上代码

代码语言:javascript复制
/**
 * @author gorit
 * @date 2019年4月15日20:39:08
 * @missson Java中List接口的复习巩固
 * */
import java.util.*;//*包含了util中的的所有包,ArrayList 是其中的一种
import com.zrgj.list.pojo.Student;


public class Test {
	public static void main(String[] args) {
		//集合,动态数组
		List list=new ArrayList();
		Student stu=new Student(null, 0, null);//这里用的是OOP编程中的学生类的有参构造方法
		list.add(1);//add里的参数是Object 是所有子类的父类,所有这里可以传递数字,字符,对象
		list.add("aa");
		list.add("bb");
		list.add("n");
		list.add(stu);//我们在集合还可以传入对象,但是打印的时候回打印其所在地址
		list.add("p");
		list.remove("aa");//删除元素
		System.out.println("集合的长度:" list.size());
		for (int i = 0; i < list.size(); i  ) {//这里求集合的长度要用到.size方法,这和前面的.length有点区别
			System.out.println(list.get(i));//通过索引值获得指定元素德伟值
		}
		list.removeAll(list);//删除集合中的所有元素
	}
}

Tips:在第一行中的List list=new ArrayList(); 中,我们没有指定 List 的数据类型,所以它会默认为Object 类,“”Object“”类是所有类型的父类,所以在上面的代码,我可以往集合中添加整数,字符(串)、类、甚至boolean 都可以,但是我们一般使用集合的时候都会给限定数据类型,看下面这段代码

加了限制之后,我们只能传入字符串了,这样做的话我们就可以使我们的输入有更多的便捷了

下面来说里一个 List 接口的子类

1.1.3 LinkedList类
  • LinkedList 表示链表的操作类,它同时实现 List 和 Queue(队列)接口
  • LinkedList 中的数据按照先进先出(FIFO)的方式排序

代码示例:

代码语言:javascript复制
import java.util.*;//*包含了util中的的所有包,ArrayList 是其中的一种

public class Test {
	public static void main(String[] args) {
		LinkedList list=new LinkedList();//LinkedList 也在util包中
		list.add("a");
		list.add("ava");
		list.add(123);
		list.addFirst("我是头");
		list.addLast("我是尾巴");
		list.remove("ava");
		for (int i = 0; i < list.size(); i  ) {
			System.out.println(list.get(i));
		}
	}
}

其实这里大部分的功能和 ArrayList 相似,其实也不必特意去记,代码不全会告诉我们有哪些方法,我们点击该方法还能看到该方法使用的“方法”,写的很直观了

补充一下,如果我们想要直接看到集合中所有的元素,可以直接打印 list(之前我们创建的一个对象)

1.1.4 Vector类
  • Vector类能够实现可增长的对象数组(Java对象数组的讲解)
  • 其大小可以根据需要增大或缩小

示例:

代码语言:javascript复制
import java.util.*;//*包含了util中的的所有包,Vector 是其中的一种
 
public class Test {
	public static void main(String[] args) {
		List list=new Vector();
		list.add(1);
		list.add("234");
		list.add("a");
		System.out.println(list);
	}
}
1.1.5 ArrayList 和 Vector作比较

ArrayList

Vector

当元素达到指定容量,自动增长原容量的百分之50

当元素达到指定容量,自动增加一倍

非线程安全且性能更高

线程安全但性能较低

2.1 Set 接口

特点~

  • Set接口存储顺序是无序的
  • 无法重复添加重复元素
2.1.1 HashSet 类讲解

直接上代码:

代码语言:javascript复制
import java.util.*;//*包含了util中的的所有包,Set 是其中的一种

public class Test {
	public static void main(String[] args) {
		Set s=new HashSet();
		s.add("aa");
		s.add("bb");
		s.add(1);
		s.add(2);

		Iterator it=s.iterator();//iterator 称之为迭代器,我们创建一个迭代对象,然后返回集合set中的元素,这里是不支持上面的 get()方法的,所以要用迭代器来返回迭代对象
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

这里还提供了很多其他的方法,比如判断是否为空,返回的是一个布尔值,集合置空等等功能

2.1.2 小总结(List 类 Set 类 Map类的特点)
  • List类 :元素按顺序存放,而且元素可以重复
  • Set类 :元素不按照顺序存放,而且还不能重复,每个元素的数据存放的位置是由该元素的Hashcode唯一决定,所以在集合中的位置也是固定的
  • Map类: 它通过==键 : 值(key : Value)==来存放数据,而且也是没有顺序的
2.1.3 Map的常用子类
  • HashMap
  • Hashtable

声明方法:

Map map=new Map();

示例代码:

代码语言:javascript复制
import java.util.*;//*包含了util中的的所有包,ArrayList 是其中的一种

public class Test {
	public static void main(String[] args) {
	Map map=new HashMap();
	map.put("2", 3);//这里有两个值,左边存放键,右边存放值
	map.put(11, "Hello");
	map.put(null, null);//空键,空值也可以存在
	map.put("price", 20);
	map.put("price", 44);//键值可以相同
	Collection c=map.values();//取出所有value值
	Set s=map.keySet();
	//刚刚讲过迭代器,这里还需要迭代器才能获取数据
	Iterator it=c.iterator();//打印键
	Iterator it1=s.iterator();//打印值

	while(it.hasNext()) {
		System.out.println("键" it.next());
		System.out.println("值" it1.next());
	}
	System.out.println(map);
	}
}
2.1.4 Iterator迭代器讲解

在前面的 List中,传入的数据是可以通过 get() 获得的,但是到了 Set 中,我们发现没有 get() 方法了,这个时候Java提供了 Iterator迭代器供我们使用

Iterator 是对集合进行迭代的迭代器,通过迭代器我们可以对集合进行遍历,我们如果需要输出集合的元素

代码语言:javascript复制
//HashSet情况
Set s=new HashSet();
//迭代HashSet
Iterator it=s.HashSet();
while(it.hasNext()) {//判断是否有元素
	System.out.println(it.next());//返回下一个迭代对象
}

//Map 情况
上面的代码就是很好的实例

文章编辑于

2019年4月16日00:37:07

3.1 泛型

其实在上面的 1.1.2 中就已经用到了泛型,上面我们也多次说到 集合的内部类是 “Object”,也就是所有数据类型的父类。

我们可以特定的指定泛型的数据类型,比如String,int,double 等等,这样做的目的可以提高代码的安全性

例如:

代码语言:javascript复制
List<Object> list1=new LinkedList<Object>();//Object也是默认的类型,可以为任何类型
List<String> list=new ArrayList<String>();//泛型可以为字符串型等等
Set<Student> set=new HashSet<Student>();//泛型可以为对象

总结

集合可以使用泛型,来增加数据的稳定性

集合类型有List接口Set接口

List 又分一下若干子类:

  • ArrayList类,类似动态数组,安全性较高
  • Vector类,也是动态数组,但是安全性比较低
  • LinkedList 有链表的特点,可以在头部,尾部进行增添元素

遍历 List 中的元素可以通过 get() 方法获得,还有List 的元素是按照顺序存放的,并且可以多次存放同样的数据

Set 的子类

  • HashSet,数据的存放不是按照顺序存放,每个数据有一个对应的 HashCode,每个元素的位置都是唯一确定的,因此相同的元素是不能同时出现的
  • Map子类,Map通过 键 : 值 来存放数据
    • HashMap
    • Hashtable

0 人点赞