Java教程

Java之Set与List区别

本文主要是介绍Java之Set与List区别,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Set与List主要区别

  1.  在List中允许插入重复的元素,而在Set中不允许重复元素存在。
  2. ​与元素先后存放顺序有关,List是有序集合,会保留元素插入时的顺序,Set是无序集合。
  3. ​List可以通过下标来访问,而Set不能。

List接口

  1. ArrayList(数组实现):允许对元素进行快速随机访问,从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
  2. LinkedList(链表实现):很适合数据的动态插入和删除,随机访问和遍历速度比较慢(遍历和访问可以使用ArrayList)。还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
  3. Vector(数组实现):支持线程的同步,某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销(相关方法与ArrayList很相似,在方法上用synchronized修饰)。

Set接口

  1. hashset : 当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置(为什么HashSet 是如何保证不重复的)。也就是说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等。不能保证元素的排列顺序,顺序有可能发生变化;集合元素可以是null,但只能放入一个null;
  2. LinkedHashSet : LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
  3. ​TreeSet : TreeSet是SortedSet接口的唯一实现类,底层的数据结构是红黑树,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。

ArrayList与TreeSet的对比代码案例

package cn.tedu.test6;
import java.util.*;
public class SetVsList {
	public static void main(String[] args) {
		//TreeSet和ArrayList对比案例
		Set<Integer> set = new TreeSet<>();
		List<Integer> list = new ArrayList<>();
		set.add(1); 	list.add(1);
		set.add(2);		list.add(2);
		set.add(3);		list.add(3);
		set.add(4);		list.add(4);
		set.add(5);		list.add(5);
		System.out.println("set:"+set); 	//输出set
		System.out.println("list"+list);	//输出list
		set.add(2);//不会添加重复数据
		list.add(2);//可以添加重复数据
		System.out.println("添加数据之后:");
		System.out.println("set:"+set);
		System.out.println("list:"+list);
		System.out.println("是否含有数据5:");
		System.out.println(set.contains(5));	//是否含有数据5
		System.out.println(list.contains(5));
		System.out.println("移除数据之后:");
		set.remove(4);	//移除数据4
		list.remove(4);	//移除下标(索引)为4的数据
		System.out.println("set:"+set);
		System.out.println("list:"+list);
		System.out.println("获取数据(只针对list):");
		System.out.println("指定下标获取内容:"+list.get(1)); //获取list下标为1的数据,set无get()方法
		System.out.println("指定内容获取下标:"+list.indexOf(2));//获取list数据内容为2的位置
		System.out.println("set size:"+set.size());		//输出set大小	
		System.out.println("list size:"+list.size());	//输出list大小
		System.out.print("遍历set之后:");
		for(Integer value:set) {			//遍历set
			System.out.print(value+" ");
		}
		System.out.println();
		System.out.print("遍历list之后:");
		for(Integer value:list) {			//遍历list
			System.out.print(value+" ");
		}
	}
}

结果显示:
set:[1, 2, 3, 4, 5]
list[1, 2, 3, 4, 5]
添加数据之后:
set:[1, 2, 3, 4, 5]
list:[1, 2, 3, 4, 5, 2]
是否含有数据5:
true
true
移除数据之后:
set:[1, 2, 3, 5]
list:[1, 2, 3, 4, 2]
获取数据(只针对list):
指定下标获取内容:2
指定内容获取下标:1
set size:4
list size:5
遍历set之后:1 2 3 5 
遍历list之后:1 2 3 4 2 

 

这篇关于Java之Set与List区别的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!