Java简单基础的复习(九)Collection集合 (二)

LinkedList

  1. 简介:
    双链表实现了List和Deque接口。 实现所有可选列表操作,并允许所有元素(包括null )。
    所有的操作都能像双向列表一样预期。 索引到列表中的操作将从开始或结束遍历列表,以更接近指定的索引为准。

  2. 方法:

    • void addFirst(E e) :在该列表开头插入指定的元素。
    • void addLast(E e) :将指定的元素追加到此列表的末尾。
    • E get(int index) :返回此列表中指定位置的元素。
    • E getFirst() :返回此列表中的第一个元素。
    • E getLast() :返回此列表中的最后一个元素。
    • E removeFirst() :从此列表中删除并返回第一个元素。
    • E removeLast() :从此列表中删除并返回最后一个元素。
    • int size() :返回此列表中的元素数
		LinkedList list = new LinkedList();
		list.addFirst("a");
		list.addFirst("b");
		list.addFirst("c");
		list.addFirst("d");
		list.addLast("e");
		System.out.println(list);
		System.out.println(list.getFirst());
		System.out.println(list.getLast());
		System.out.println(list.removeFirst());
		System.out.println(list.removeLast());
		System.out.println(list.get(1));
		System.out.println(list);
  1. 案例:使用LinkedList来模拟栈
			public class Stack {
				private LinkedList list = new LinkedList();		//创建LinkedList对象
				
				public void in(Object obj) {
					list.addLast(obj);							//封装addLast()方法
				}
				
				public Object out() {
					return list.removeLast();					//封装removeLast()方法
				}
				
				public boolean isEmpty() {
					return list.isEmpty();						//封装isEmpty()方法
				}
			}

泛型

推荐两个链接:

  1. https://blog.csdn.net/gyhgyh12345/article/details/86078349?ops_request_misc=&request_id=&biz_id=&utm_source=distribute.pc_search_result.none-task-blog-1blogbaidu_landing_v1~default-2
  2. https://blog.csdn.net/u011275346/article/details/103850568?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158689713619195239859901%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158689713619195239859901&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-1blogdefault~default-1

总的来说泛型就是java为了避免类型转换异常和安全创造出来的,当你写代码的时候泛型就会报错,避免了类型不匹配导致的错误问题

for循环增强

  1. 简化数组和Collection集合的遍历
  2. for(元素的数据类型:需要遍历元素的数组名)
int[] arr = {1,2,3,4};
for(int i:arr){
	System.out.println(i);
}

数组转集合

  1. Array对象的aslist() 方法
		//Arrays中的asList方法:数组转换成集合(不能增加或减少元素)
		//数组转换成集合必须使用引用数据类型
		String[] str = {"a","b","c","d"};
		List<String> list1 = Arrays.asList(str);//将数组转换成集合
		System.out.println(list1);
  1. 集合转数组
		//当集合转数组时,如果集合长度大于数组长度,那转换后的数组长度就等于集合长度
		//如果数组长度大于集合长度,那么分配的数组长度就等于你指定的数组长度一样
		List<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		
		String[] arr = list.toArray(new String[0]);
		
		for (String str : arr) {
			System.out.println(str);
		}

Set集合

  1. 简介:
    不包含重复元素的集合。 更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。 正如其名称所暗示的那样,这个接口模拟了数学集抽象。
  2. 方法:跟Collection的方法大致相同
  3. 特点:无索引,无重复,无序(存取顺序不一样)

HashSet

  1. 简介:
    此类实现Set接口,由哈希表(实际为HashMap实例)支持。 对集合的迭代次序不作任何保证; 特别是,它不能保证订单在一段时间内保持不变。 这个类允许null元素。
  2. 方法:
    • boolean add(E e) :将指定的元素添加到此集合(如果尚未存在)。
    • void clear() :从此集合中删除所有元素。
    • boolean contains(Object o) :如果此集合包含指定的元素,则返回 true 。
    • boolean isEmpty() :如果此集合不包含元素,则返回 true 。
    • Iterator iterator() :返回此集合中元素的迭代器。
    • boolean remove(Object o) :如果存在,则从该集合中删除指定的元素。
    • int size() :返回此集合中的元素数
  3. HashSet如何保证元素唯一性的原理
    例子:
HashSet<Person> hs = new HashSet<>();
		hs.add(new Person("zjf",23));
		hs.add(new Person("zjf",23));
		hs.add(new Person("gzq",24));
		hs.add(new Person("gzq",24));
		hs.add(new Person("gzq",24));
		System.out.println(hs.size());//6

在这里插入图片描述
当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
* 1. 如果没有哈希值相同的对象就直接存入集合
* 2. 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存

  1. LinkedHashSet:
    • 哈希表和链表实现了Set接口,具有可预测的迭代次序。 这种实现不同于HashSet,它维持于所有条目的运行双向链表。 该链表定义了迭代排序,它是将元素插入集合(插入顺序 ) 的顺序 。 请注意,如果一个元件被重新插入到组插入顺序不受影响 。
    • 特点:底层是链表实现的,可以保证怎么存就怎么取,因为是HashSet的子类,也可以保证元素唯一性。

TreeSet集合

  1. 是用来对元素进行排序的,也同样可以保证元素唯一。
  2. 当他存储自定义对象的时候,如果自定义对象没有重写CompareTo方法时,会报错
    例子:
		//当compateTo方法返回0的时候集合中只有一个元素
		//当compateTo方法返回正数的时候集合中会怎么存怎么取
		//当compateTo方法返回负数的时候集合中怎么存会倒序存储
		TreeSet<Person> ts = new TreeSet<>();
		ts.add(new Person("zjf",23));
		ts.add(new Person("gzq",24));
		ts.add(new Person("wrq",25));
		ts.add(new Person("xxp",26));
		System.out.println(ts);

在这里插入图片描述
3. 特点
* TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
* 使用方式
* 自然顺序(Comparable)
* TreeSet类的add()方法中会把存入的对象提升为Comparable类型
* 调用对象的compareTo()方法和集合中的对象比较
* 根据compareTo()方法返回的结果进行存储
* 比较器顺序(Comparator)
* 创建TreeSet的时候可以制定 一个Comparator
* 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
* add()方法内部会自动调用Comparator接口中compare()方法排序
* 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
* 两种方式的区别
* TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
* TreeSet如果传入Comparator, 就优先按照Comparator

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值