List,Set,Map接口

版权声明:啥是版权,感觉都是侵权必究。我也会究的。 https://blog.csdn.net/Scan_13286/article/details/85115004

集合框架

各种数据结构封装类


数据结构的类型:
1.连续存储
2.链式(非连续)


java集合框架有两大类:
1.Collection(一个元素只存储一个对象)

list接口继承Collection接口
Set接口继承Collection接口

2.Map(一个元素存储key-value两个对象)

HashMap直接实现Map接口
TreeMap直接实现Map接口


List接口

List接口的两个实现类分别是ArrayListLinkedList


ArrayList

以动态数组的形式存储数据。
声明:ArrayList<E> arraylist = new ArrayList<E>();

其中E是一种泛型,表示某一种类型。可以是String,也可以是自定类型,看其中存储的数据类型,【但是不能为int和char,只能是它们的包装类:Integer和Character】

数组
ArrayList和Array的存储形式一致,因为ArrayList的底层实现就是使用Arrays.copyof().

这样的存储形式,保证了数据的有序性。便于查找,但是不便于添加,删除等操作。

而ArrayList和Array不同的是,它有自己的方法。用于操作数组。

ArrayList的常用方法

1:ArrayList.add(E e)
返回boolean类型,添加一个元素在列表末尾。

2: ArrayList.add(int index, E e);
返回void类型,在指定索引位置添加元素

3:ArrayList.addAll(Collection<? extends E> c);
返回boolen类型,将指定集合追加到列表的末尾

4:ArrayList.clear();
返回void类型,清除列表中的所有元素

5:ArrayList.get(int index);
返回E类型,通过指定索引返回指定索引元素。

6:ArrayList.isEmpty()
返回Boolean类型。判断列表中是否存在元素,Ture为不存在

7:ArrayList.remove(int index);
返回E类型,通过索引删除指定索引的元素。

8:ArrayList.remove(Object o)
返回boolean类型。通过匹配元素,删除匹配到的第一个元素。

9:ArrayList.set(int index, E element)
返回E类型。用指定元素替换指定索引位置的元素

10:ArrayList.size()
返回int类型,返回列表的元素个数。

LinkedList

以链表的形式存储数据
声明:LinkedList<E> linkedlist = new LinkedList<E>();
在这里插入图片描述

如上图所示,LinkedList是以链表的形式来存储数据的,和ArrayList不同的是:LinkedList方便添加、删除等操作,但是不便于遍历和查找。

在这里插入图片描述

从LinkedList的源码中可以看出它的成员变量有Node<E> firstNode<E> last
表示LinkedList的底层实现,是通过Node[节点]。
而通过节点来保存数据的话,只需要知道上一个节点和下一个节点。

故LinkedList方便于添加和删除,只需要改变上节点和下节点,不需要和ArrayList一样,要把每一个元素后移或前移。


Set接口

Set接口的两个实现类分别是HashSettreeSet

Set和List的区别在于,Set是无序无重复的。


HashSet

使用HashSet存储数据和List一致,只是不会存储重复数据。

News news1 = new News(1,"news1");
News news2 = new News(2,"news1");
News news3 = new News(3,"news1");
News news4 = new News(4,"news1");
Set<News> list = new HashSet<News>();
list.add(news1);
list.add(news3);
list.add(news2);
list.add(null);
list.add(news4);
System.out.println(list);

当用HashSet添加数据后,在输出列表,会发现数据是无序的。【】

TreeSet

TreeSet和HashSet的区别:TreeSet会按照自然规律或者重写的compare()方法排序

TreeSet<String> list = new TreeSet<String>();
list.add("1111");
list.add("2222");
list.add("4444");
list.add("7777");
list.add("6666");
list.add("9999");
list.add("3333");
list.add("8888");
System.out.println(list);

运行后,会发现输出列表的顺序都是排列好的。

当存储的数据类型为自定义类型时。需要实现比较器的接口,重写compare()方法。
方法1:自己新建一个类实现Comparator接口。然后实例化。传给TreeSet。

public class NewsComparator implements Comparator<News> {
	@Override
	public int compare(News o1, News o2) {
		return o1.getId() - o2.getId();
	}
}
News news1 = new News(1,"news1");
News news2 = new News(2,"news2");
News news3 = new News(3,"news3");
News news4 = new News(4,"news4");
NewsComparator nc = new NewsComparator();
TreeSet<News> list = new TreeSet<News>(nc);
list.add(news1);
list.add(news3);
list.add(news4);
list.add(news2);

方法2:直接在TreeSet中写匿名内部类

News news1 = new News(1,"news1");
News news2 = new News(2,"news2");
News news3 = new News(3,"news3");
News news4 = new News(4,"news4");
TreeSet<News> list = new TreeSet<News>(
	new Comparator<News>() {
	@Override
	public int compare(News o1, News o2) {
		return o1.getId() - o2.getId();
	}
});
list.add(news1);
list.add(news3);
list.add(news4);
list.add(news2);

方法3:用lambda表达式写匿名内部类

News news1 = new News(1,"news1");
News news2 = new News(2,"news2");
News news3 = new News(3,"news3");
News news4 = new News(4,"news4");
TreeSet<News> list = new TreeSet<News>((o1,o2)->o2.getId() - o1.getId());
list.add(news1);
list.add(news3);
list.add(news4);
list.add(news2);

Map

使用key-value【键值对】的方式存储数据的结构

Map的两个实现类:
1.HashMap
2.TreeMap

Map的存储结构图
在这里插入图片描述
采用键值对的形式,每一个key对应一个value,因为map中的key是以Set集合存储的,故Map的存储也是无序的。

Map的声明:
1.Map<Integer,String> map = new HashMap<Integer, String>();
2.Map<Integer,String> map = new TreeMap<Integer, String>();

Map中的常用方法:
1.map.clear();					//清除map中的所有映射【即所有元素】
2.map.containsKey(key);			//判断map中是否存在该key
3.map.containsValue(value)		//判断map中是否存在该value
4.map.forEach();					//遍历map
5.map.get(key);					//获取该key的value
6.map.isEmpty();					//判断map是否包含数据
7.map.keySet();					//返回key的Set集合
8.map.remove(key)				//移除某个key和所对应的value
9.map.replace(key,value)			//替换key所对应的value
10.map.size()					//返回map的键值对数目
11.map.put(key,value)			//在map中添加一个键值对,如果key重复,将替换之前的value
12.map.putAll(Map)				//将另一个Map添加到map中,如果key重复,将替换。

HashMap和TreeMap的区别:
TreeMap和TreeSet的一样,都可以通过实现比较器接口来排序的。


猜你喜欢

转载自blog.csdn.net/Scan_13286/article/details/85115004