欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java_List、Set、Conllections工具类

程序员文章站 2022-04-01 10:52:17
List接口java.util.List 接口继承自 Collection 接口List接口特点:它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。List接口中常用方法public void add(int index, E element) :...

List接口

java.util.List 接口继承自 Collection 接口

List接口特点:

  1. 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。
  2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
  3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

List接口中常用方法

  • public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
  • public E get(int index) :返回集合中指定位置的元素。
  • public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
  • public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
import java.util.ArrayList;
import java.util.List;

public class Demo{
	public static void main(String[] args) {
		// 创建List集合对象
		List<String> list = new ArrayList<String>();
		// 往 尾部添加 指定元素
		list.add("张三");
		list.add("李四");
		list.add("王五");
		System.out.println(list);
		// add(int index,String s) 往指定位置添加
		list.add(1,"赵六");
		System.out.println(list);
		// String remove(int index) 删除指定位置元素 返回被删除元素
		// 删除索引位置为2的元素
		System.out.println("删除索引位置为2的元素");
		System.out.println(list.remove(2));
		System.out.println(list);
		// String set(int index,String s)
		// 在指定位置 进行 元素替代(改)
		// 修改指定位置元素
		list.set(0, "钱七");
		System.out.println(list);
		// String get(int index) 获取指定位置元素
		// 跟size() 方法一起用 来 遍历的
		for(int i = 0;i<list.size();i++){
		System.out.println(list.get(i));
		}
		//还可以使用增强for
		for (String string : list) {
		System.out.println(string);
		}

	}
}

List的子类

ArrayList集合

java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合。

LinkedList集合

java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。

LinkedList是一个双向链表

java_List、Set、Conllections工具类
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法

  • public void addFirst(E e) :将指定元素插入此列表的开头。
  • public void addLast(E e) :将指定元素添加到此列表的结尾。
  • public E getFirst() :返回此列表的第一个元素。
  • public E getLast() :返回此列表的最后一个元素。
  • public E removeFirst() :移除并返回此列表的第一个元素。
  • public E removeLast() :移除并返回此列表的最后一个元素。
  • public E pop() :从此列表所表示的堆栈处弹出一个元素。
  • public void push(E e) :将元素推入此列表所表示的堆-栈。
  • public boolean isEmpty() :如果列表不包含元素,则返回true。
public class Demo{
	public static void main(String[] args) {
		LinkedList<String> link = new LinkedList<String>();
		//添加元素
		link.addFirst("张三");
		link.addFirst("李四");
		link.addFirst("王五");
		System.out.println(link);
		// 获取元素
		System.out.println(link.getFirst());
		System.out.println(link.getLast());
		// 删除元素
		System.out.println(link.removeFirst());
		System.out.println(link.removeLast());
		while (!link.isEmpty()) { //判断集合是否为空
		System.out.println(link.pop()); //弹出集合中的栈顶元素
		}
		System.out.println(link);
	}
}

Set接口

java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

HashSet集合

java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)

HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与 equals 方法。

在给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

创建自定义Student类

public class Student {
	private String name;
	private int age;
	
	public Student() {
	
	}
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public boolean equals(Object o) {
		if (this == o)
			return true;
		if (o == null || getClass() != o.getClass())
			return false;
		Student student = (Student) o;
		return age == student.age &&
			Objects.equals(name, student.name);
	}
	@Override
	public int hashCode() {
		return Objects.hash(name, age);
	}
}
public class Demo{
	public static void main(String[] args) {
		//创建集合对象 该集合中存储 Student类型对象
		HashSet<Student> stuSet = new HashSet<Student>();
		//存储
		Student stu = new Student("张三", 23);
		stuSet.add(stu);
		stuSet.add(new Student("李四", 37));
		stuSet.add(new Student("张三", 23));
		stuSet.add(new Student("王五", 25));
		stuSet.add(stu);
		for (Student stu2 : stuSet) {
			System.out.println(stu2);
		}
	}
}
执行结果:
Student [name=李四, age=37]
Student [name=张三, age=23]
Student [name=王五, age=25]

LinkedHashSet

java.util.LinkedHashSet元素存放进去保证有序

public class Demo{
	public static void main(String[] args) {
		Set<String> set = new LinkedHashSet<String>();
		set.add("bbb");
		set.add("aaa");
		set.add("abc");
		set.add("ccc");
		Iterator<String> it = set.iterator();
		while (it.hasNext()) {
		System.out.println(it.next());
		}
	}
}
结果:
bbb
aaa
abc
ccc

可变参数

JDK1.5以后。出现了简化操作。… 用在参数上,称之为可变参数。

同样是代表数组,但是在调用这个带有可变参数的方法时,不用创建数组,直接将数组中的元素作为实际参数进行传递,其实编译成的class文件,将这些元素先封装到一个数组中,在进行传递。这些动作都在编译.class文件时,自动完成了。

public class Demo{
	public static void main(String[] args) {
		int[] arr = { 1, 4, 7, 6, 5 };
		int sum = getSum(arr);
		System.out.println(sum);// 23
	}

	// 完成数组 所有元素的求和 原始写法
	/*public static int getSum(int[] arr) {
		int sum = 0;
		for (int a : arr) {
			sum += a;
		}
		return sum;
	}*/

	// 可变参数写法
	public static int getSum(int... arr) {
		int sum = 0;
		for (int a : arr) {
			sum += a;
		}
		return sum;
	}
}

Collections

java.utils.Collections 是集合工具类,用来对集合进行操作。

部分方法如下:

  • public static boolean addAll(Collection c, T… elements) :往集合中添加一些元素。
  • public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。
  • public static void sort(List list) :将集合中元素按照默认规则排序。
  • public static void sort(List list,Comparator<? super T> ) :将集合中元素按照指定规则排
    序。
public class Demo {
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		//采用工具类完成往集合中添加元素
		Collections.addAll(list, 6, 48, 72);
		System.out.println(list);
		//排序方法
		Collections.sort(list);
		System.out.println(list);
	}
}
结果:
[6, 48, 7, 2]
[2, 6, 7, 48]

Comparator比较器

那么在JAVA中提供了两种比较实现的方式,一种是比较死板的采用 java.lang.Comparable 接口去实现,一种是灵活的当我需要做排序的时候在去选择的java.util.Comparator 接口完成。

public int compare(String o1, String o2) :比较其两个参数的顺序。

两个对象比较的结果有三种:大于,等于,小于。

如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数)

如果要按照降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)

比如:

public class Demo3{
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("cba");
		list.add("aba");
		list.add("zba");
		list.add("lba");
		//排序方法 按照第一个单词的降序
		Collections.sort(list, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o2.charAt(0) - o1.charAt(0);
			}
			});
		System.out.println(list);
	}
}

输出结果为:

[zba,lba, cba, aba]

Comparable和Comparator两个接口的区别

Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,无需指定比较器。

Comparator:强行对某个对象进行整体排序。允许在排序顺序上实现精确控制。

本文地址:https://blog.csdn.net/guixinchn/article/details/107660383