List、Set集合

一、List系列集合
1.List集合特点、特有API
1):ArrayList、LinkedList:有序,可重复,有索引
2)List集合特有方法
List集合因为支持索引,所以多了很多索引操作的独特API,其他Collection的功能List也都继承了。
① void add (int indx,E element)
在此集合中的指定位置插入指定元素
② E remove (int index)
删除指定索引处的元素,返向被删除的元素
③E set (int index,E element)
修改指定索引处的元素,返回被修改的元素
④ E get (int index)
返回指定索引处的元素

package d5_collection_list;

import java.util.ArrayList;
import java.util.List;

public class ListDemo1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1、创建一个ArrayList集合对象
		List<String> list=new ArrayList<>();
		list.add("Java");
		list.add("java");
		list.add("MySQL");
		list.add("MySQL");
		
		//2、在某个索引位置插入元素
		list.add(2, "HTML");
		System.out.println(list);
		
		//3、根据索引删除元素,返回被删除元素
		System.out.println(list.remove(2));
		System.out.println(list);
		
		//4、根据索引获取元素:public E get(int index) 返回集合指定位置的元素
		System.out.println(list.get(2));
		
		//5、修改索引位置处的元素:public E set(int index,E element)
		//返回修改前的数据
		System.out.println(list.set(1, "高斯林"));
		
		list.clear();
		System.out.println(list);
		

	}

}

2、List集合的遍历方式小结:
 1)遍历方式
①迭代器
②增强for循环
③Lambda 表达式
④for循环(List的集合存在索引)

package d5_collection_list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<String> list=new ArrayList<>();
		list.add("Java");
		list.add("java");
		list.add("MySQL");
		list.add("MySQL");
		
		//for循环
		for(int i=0;i<list.size();i++) {
			System.out.println(list.get(i));
		}
		
		//迭代器
		System.out.println("-----------------------");
		Iterator<String> it=list.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		//foreach/增强for循环
		System.out.println("--------------------");
		for(String lists:list) {
			System.out.println(lists);

		//JDK1.8开始之后的Lambda表达式
		System.out.println("-----------------------");
		//list.forEach(e->System.out.println(e));
		list.forEach(e->{
			System.out.println(e);
		});
	}
	}
}


3、ArrayList集合的底层原理
1)ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作
2)第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组

4.LinkedList集合的就层原理
1)LinkedList的特点
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API
2)ListedList集合的特有功能
① public void addFirst(E  e)     在该列表开头插入指定的元素
②public void addLast(E e)
将指定的元素追加到此列表的尾
③pubic E getFirst()
返回此列表中的第一个元素
④public E getLast()    返回此列表的最后一个元素
⑤ public  E remove First()
删除并返回第一个元素
⑥ pubic E removeLast()
删除并返回最后一个元素

package d5_collection_list;

import java.util.LinkedList;

public class ListDemo3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//LinkedList可以完成队列结构,和栈结构(双链表)
		//栈
		LinkedList<String> stack=new LinkedList<>();
		//压栈,入栈
		stack.addFirst("第一颗子弹");
		stack.addFirst("第二颗子弹");
		stack.push("第三颗子弹");
		System.out.println(stack);//[三  二  一]
		//出栈  弹栈
		System.out.println(stack.removeFirst());
		System.out.println(stack.removeFirst());
		System.out.println(stack);
		
		//队列
		LinkedList<String> queue=new LinkedList<>();
		//入队
		queue.addLast("1号");
		queue.addLast("2号");
		queue.offerLast("3号");
		System.out.println(queue);
		//出列
		System.out.println(queue.removeFirst());
		System.out.println(queue.removeFirst());
		System.out.println(queue);
		
		

	}

}

二、Set系列集合
1.Set系列集合概述
1)Set系列集合特点:
①无序:存取顺序不一致(只会无序一次,第二次执行与第一次一样)
②不重复
③无索引:没有带索引的方法
2)set集合实现类特点:
①Hashset:无序,不重复,无奈引
② LinkedHashset:有序,不重复,无奈引
③TreeSet:排序、不重复,无索引
Set集合的功能上基本上 Collection的API一致
2、HashSet元素无序的底层原理:哈希表
1)HashSet底层原理
①Hashsat集合底层采取哈希表存储的数据
②哈希表是一种对于增删改查数据性能都较好的结构
2)哈希表的组成
JDK8之后,底层来用(数组+链表+红黑树)相成3)哈东值哈希值跟数组的长度求余
3)哈希值(哈希值跟数组的长度求余)
是JDK根据对象的地址,按照某种规则(哈希值跟数组的长度求余)算出来的int类型的数值
4)Object类的API
public int hashCode()
返回对象的哈希值
5)对象的哈希值特点
①同一个对多次调用hashCde()方法返回的哈希值是相同的
②默认情况下,不同对象的哈希值是不同的.

3、HashSet元素去重复的底层原理
1)如果希望Set集合认为2个内容相同的对象是重夏的应该怎么办?
重写对的hashCode() 和equals()方法。

@Override
	public int hashCode() {
		return Objects.hash(age, name, sex);
	}
	
	/*
	 * 只要两个内容一样,结果一定是true
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		return age == other.age && Objects.equals(name, other.name) && sex == other.sex;
	}


4、实现类:ListedHashSet
1)LinkedHashSet集合概述和特点
①有序,不重复,无索引
②这里有序指的是保证存储和取出的元素顺序一致
③原理:底层数据结构依哈希表,只是每元素又额外的多了一个双链表的机制记录存储的顺序。
5、实现类:TreeSet
1)TreeSet集合概述和特点
①不重复、无索引、可排序
②可排序:按照元素的大小默人升序(由小到大)排序
③TreeSet集合底层是基于红黑树数据结构实现排序的,增删改查性能都较好。
注:TreeSet  集合是一定要排序的,可以将元素按照指定的规则进行排序。

2)TreeSet集合默认的规则
①对于数值类型:Integer,Double
官方默认按照大小进行升序排序.
②对于字符串类型:默认按照首字母符的编号升序排序。
③对于自定义类型如Studert对象,Treset无法直接排序,需自己制定排序规则
3)自定义排序规则
Teset集合存储对象的时候有2种方式河以设计自定义比较规则
①方式一:
让自定义的类实现Comparable 接口重写里面的compareTo方法来定制比较规则

}
	/*
	 * 方式一:自定义比较规则
	 * o1.compareTo(o2)
	 */
	@Override
	public int compareTo(Apple o) {
		// TODO Auto-generated method stub
//		return this.weight-o.weight;//去除重量重复的元素
		return this.weight-o.weight>=0? 1:-1;//保留重量重复的元素
	}
	@Override
	public String toString() {
		return "Apple [name=" + name + ", color=" + color + ", price=" + price + ", weight=" + weight + "]";
	}



③方式二: 
TeeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则

//		方式二:集合自带比较器对象进行规则定制
		//注意:如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序
//		Set<Apple> a=new TreeSet<>(new Comparator<Apple>() {
//
//			@Override
//			public int compare(Apple o1, Apple o2) {
//				// TODO Auto-generated method stub
				return o1.getWeight()-o2.getWeight();//升序
				return o2.getWeight()-o1.getWeight();//降序
				return Double.compare(o1.getPrice(), o2.getPrice());//升序
//				return Double.compare(o2.getPrice(), o1.getPrice());//降序
//			}
//		});
		Set<Apple> a=new TreeSet<>((o1,o2)-> Double.compare(o2.getPrice(), o1.getPrice()));
		a.add(new Apple("红富士","红色",18.9,500));
		a.add(new Apple("青苹果","青色",9.9,300));
		a.add(new Apple("绿苹果","绿色",20.9,200));
		a.add(new Apple("黄苹果","黄色",9.8,500));
		System.out.println(a);


注:如果TreeSet集合存储的对象有实现比较集合也自带比较器,默认使用集合自带的比较器排序.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值