【大数据开发】Java语言基础——Collection、ArrayList、LinkedList、HashSet、TreeSet(Comparable接口和Comparator方法的实现)day15

一、Collection:共性的方法

  1. List

存储的对象是有序的(添加对象的顺序和集合存储的顺序是一致的),且是可以重复的

  • ArrayList:后缀是父接口,前缀说的是数据结构
    底层使用的是数组,(内存连续),线程不安全的,便于数据的查找,不便于数据的添加和删除

  • Vector: 底层使用的是数组,(内存连续),线程安全的,便于数据的查找,不便于数据的添加和删除

  • LinkedList:底层使用的是链表,(内存不连续),不便于数据的查找,便于数据的添加和删除

  • Set
    存储的对象是无序的(添加对象的顺序和集合存储的顺序是不一致的),对象是不可以重复的
    没有特有的功能

  • HashSet
    底层数据结构是(链表+数组)–散列表,具备了Set的基本特性(无序,不可重复)
    向集合中添加对象时,先和集合中已有的对象依次比较,先比较哈希值,若哈希值不同,则直接加入链表,如果哈希值相同了,再对两个对象调用equals方法,如果equals方法返回值为true。则认为是相同的对象,不加入集合,如果哈希值不同,直接加入集合
    计算哈希值

      int hashCode()  
      boolean equals(Object obj)
	哈希值相同不一定是相同的对象
	相同的对象哈希值肯定相同
  • TreeSet
    底层数据结构是二叉树,线程不安全的,除了具备Set的基本特性(无序,不可重复),还可以排序
    排序的原理
    需要加入集合的对象实现了Comparable接口的int compareTo(Object obj)方法。TreeSet只根据compareTo方法的返回值来判断谁大谁小,如果返回值为0,则认为是同一个对象,不加入集合,这也是TreeSet保证对象不重复的方式
import java.util.*;
class Person implements Comparable
{
	public int compareTo(Object obj)
	{
		return 0;
	}
}
class Demo1 
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet();       //Comparable<? super K> k = (Comparable<? super K>) key;
		//ts.add("hello");//添加的时候就比较大小了
		//ts.add("aaaabbbbbccc");//"aaaabbbbbccc".compareTo("hello")  -6
		//ts.add("zeselkjek");//"zeselkjek".compareTo("aaaabbbbbccc")>0   "zeselkjek".compareTo("hello")>0

		ts.add(new Person());//Person cannot be cast to java.lang.Comparable 因为Person没有实现Comparable接口,所以不能被转成Comparable对象
		ts.add(new Person());//new Person().compareTo(new Person())  返回值为0则认为是同一个对象,不会加入集合
		ts.add(new Person());//

		System.out.println(ts.size());
	}
}

下面来写一个例子,看代码

import java.util.*;
class Student implements Comparable
{
	private String name;
	private int age;

	Student(){}
	Student(String name,int age)
	{
		this.name=name;
		this.age=age;
	}

	public int compareTo(Object obj)  //先按照年龄排序,年龄相同则按照姓名排序(这一段比较重要)
	{
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不对");

		Student stu=(Student)obj;

		int num =this.age-stu.age;

		return num==0?this.name.compareTo(stu.name):num;
		//return 0;
	}

	public String getName()
	{
		return this.name;
	}
	public int getAge()
	{
		return this.age;
	}
	public String toString()
	{
		return name+","+age;
	}
}
class Demo2 
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet();

		ts.add(new Student("lisi",28));
		ts.add(new Student("zhaosi",26));
		ts.add(new Student("aaaaawangsi",28));
		ts.add(new Student("zhangsan",22));
		ts.add(new Student("jiasi",25));

       //按年龄升序排序

		System.out.println(ts);
	}
}

更改需求,按照姓名排序,那就需要实现Comparator,再新建一个文件

/*
Collection:共性的方法
    List:存储的对象是有序的(添加对象的顺序和集合存储的顺序是一致的),且是可以重复的
	      ArrayList:后缀是父接口,前缀说的是数据结构
		             底层使用的是数组,(内存连续),线程不安全的,便于数据的查找,不便于数据的添加和删除
		  Vector:   底层使用的是数组,(内存连续),线程安全的,便于数据的查找,不便于数据的添加和删除

		  LinkedList:底层使用的是链表,(内存不连续),不便于数据的查找,便于数据的添加和删除

    Set:存储的对象是无序的(添加对象的顺序和集合存储的顺序是不一致的),对象是不可以重复的
        没有特有的功能

		  HashSet:底层数据结构是(链表+数组)--散列表,具备了Set的基本特性(无序,不可重复)

		          向集合中添加对象时,先和集合中已有的对象依次比较,先比较哈希值,如果哈希值
				  相同了,再对两个对象调用equals方法,如果equals方法返回值为true。则认为是
				  相同的对象,不加入集合,如果哈希值不同,直接加入集合

				  计算哈希值:int hashCode()  
				  
				              boolean equals(Object obj)

				  哈希值相同不一定是相同的对象
				  相同的对象哈希值肯定相同

          TreeSet: 底层数据结构是二叉树,线程不安全的,除了具备Set的基本特性(无序,不可重复),还可以排序

		           Comparable 排序的原理:需要加入集合的对象实现了Comparable接口的int compareTo(Object obj)方法
				               TreeSet只根据compareTo方法的返回值来判断谁大谁小,如果返回值为0,则认为是
							   同一个对象,不加入集合,这也是TreeSet保证对象不重复的方式

                   Comparator:当类具备的比较大小方式不满足我们的需求时,需要使用这个接口

				              单独使用的接口,可以使用这个接口自定义比较大小的方式
								
							有comparator优先使用comparator
				               
         

*/
import java.util.*;
//按照姓名排序
class CompareByName implements Comparator
{
	public int compare(Object o1, Object o2) 
	{
		if(!(o1 instanceof Student))
			throw new ClassCastException();
		
		if(!(o2 instanceof Student))
			throw new ClassCastException();

		Student stu1=(Student)o1;
		Student stu2=(Student)o2;

		return stu1.getName().compareTo(stu2.getName());
	}
}
class Demo3 
{
	public static void main(String[] args) 
	{
		CompareByName byName=new CompareByName();//创建自定义的比较方式的对象  TreeSet优先使用Comparator的比较方式
		TreeSet ts = new TreeSet(byName);

		ts.add(new Student("lisi",28));
		ts.add(new Student("zhaosi",26));
		ts.add(new Student("aaaaawangsi",28));
		ts.add(new Student("zhangsan",22));
		ts.add(new Student("jiasi",25));
		System.out.println("Hello World!");
	}
}

下面的例子就很明显了

//按字符串的长短,从长到短排序  String已经实现了Comparable接口,是按照字符大小比较的,不符合需求,所以使用Comparator自定义比较方式
import java.util.*;
class ByLength implements Comparator
{
	public int compare(Object obj1,Object obj2)
	{
		if(!(obj1 instanceof String))
			throw new ClassCastException();
		
		if(!(obj2 instanceof String))
			throw new ClassCastException();

		String s1=(String)obj1;
		String s2=(String)obj2;

		return s2.length()-s1.length();

	}
}
class Demo4 
{
	public static void main(String[] args) 
	{
		ByLength length=new ByLength();
		TreeSet ts = new TreeSet(length);
		ts.add("jksdhf");
		ts.add("jksdhfsdfsdfererer");
		ts.add("jksdhfdfsdf");
		ts.add("jk");
		System.out.println(ts);
	}
}

总结
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值