Java语言的数据结构、List集合、Set集合、Collections

编程入门 行业动态 更新时间:2024-10-10 04:20:30

Java语言的<a href=https://www.elefans.com/category/jswz/34/1769880.html style=数据结构、List集合、Set集合、Collections"/>

Java语言的数据结构、List集合、Set集合、Collections

数据结构

2.1常见的数据结构




List集合

1.1List接口

1.java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对 象称为List集合。( java.util.List接口 extends Collection接口)
2.List接口的特点:
1.有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123)
2.有索引,包含了一些带索引的方法
3.允许存储重复的元素

1.2 List接口中常用方法

List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下:

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

注意:
1.操作索引的时候,一定要防止索引越界异常
IndexOutOfBoundsException:索引越界异常,集合会报
ArrayIndexOutOfBoundsException:数组索引越界异常
StringIndexOutOfBoundsException:字符串索引越界异常

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class Demo01List {public static void main(String[] args) {//创建一个List集合对象,多态List<String> list = new ArrayList<>();//使用add方法往集合中添加元素list.add("a");list.add("b");list.add("c");list.add("a");//打印集合System.out.println(list);//[a, b, c, d, a]  不是地址重写了toString//public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。// 在c和d之间添加一个DeJonglist.add(3,"DeJong");System.out.println(list);//[a, b, c, DeJong, a]//public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。//移除元素String removeE = list.remove(2);System.out.println("被移除的元素:" + removeE);System.out.println(list);//public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。//把最后一个a,替换为AString setE = list.set(3, "A");System.out.println("被替换的元素:" + setE);System.out.println(list);//List集合遍历有3种方式//使用普通的for循环for (int i = 0; i < list.size(); i++) {//public E get(int index):返回集合中指定位置的元素。String s = list.get(i);System.out.println(s);}System.out.println("===================");//使用迭代器Iterator<String> it = list.iterator();while (it.hasNext()){String s = it.next();System.out.println(s);}System.out.println("===================");//使用增强forfor (String s : list){System.out.println(s);}String r = list.get(4);//IndexOutOfBoundsException: Index 4 out-of-bounds for length 4System.out.println(r);}
}

List的子类

3.1 ArrayList集合

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

3.2 LinkedList集合

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

LinkedList是一个双向链表。

LinkedList集合的特点:
1.底层是一个链表结构:查询慢,增删快
2.里边包含了大量操作首尾元素的方法
注意:使用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。

LinkedList是List的子类,List中的方法LinkedList都是可以使用。

import java.lang.module.ResolutionException;
import java.util.LinkedList;public class Demo02LinkedList {public static void main(String[] args) {show03();}/*- public E removeFirst():移除并返回此列表的第一个元素。- public E removeLast():移除并返回此列表的最后一个元素。- public E pop():从此列表所表示的堆栈处弹出一个元素。此方法相当于 removeFirst*/private static void show03() {//创建LinkedList集合对象LinkedList<String> linked = new LinkedList<>();//使用add方法往集合中添加元素linked.add("a");linked.add("b");linked.add("c");System.out.println(linked);//[a,b,c]//String first = linked.removeFirst();String first = linked.pop();System.out.println("被移除的第一个元素:"+first);String last = linked.removeLast();System.out.println("被移除的最后一个元素:"+last);System.out.println(linked);//[b]}/*- public E getFirst():返回此列表的第一个元素。- public E getLast():返回此列表的最后一个元素。*/private static void show02() {//创建LinkedList集合对象LinkedList<String> linked = new LinkedList<>();//使用add方法往集合中添加元素linked.add("a");linked.add("b");linked.add("c");//linked.clear();//清空集合中的元素 在获取集合中的元素会抛出NoSuchElementException//public boolean isEmpty():如果列表不包含元素,则返回true。if (!linked.isEmpty()) {String first = linked.getFirst();System.out.println(first);String last = linked.getLast();System.out.println(last);}}/*- public void addFirst(E e):将指定元素插入此列表的开头。- public void addLast(E e):将指定元素添加到此列表的结尾。- public void push(E e):将元素推入此列表所表示的堆栈。此方法等效于 addFirst(E)。*/private static void show01() {//创建LinkedList集合对象LinkedList<String> linked = new LinkedList<>();//使用add方法往集合中添加元素linked.add("a");linked.add("b");linked.add("c");System.out.println(linked);//public void addFirst(E e):将指定元素插入此列表的开头。//linked.addFirst("www");等效于:linked.push("www");linked.push("www");System.out.println(linked);//[www, a, b, c]//public void addLast(E e):将指定元素添加到此列表的结尾。此方法等效于 add()linked.addLast("com");System.out.println(linked);//[www, a, b, c, com]}}

Set接口

java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。(java.util.Set接口 extends Collection接口)

Set接口的特点:1.不允许存储重复的元素2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历

3.1HashSet集合介绍

java.util.HashSetSet接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。java.util.HashSet底层的实现其实是一个java.util.HashMap支持。(java.util.HashSet集合 implements Set接口)

HashSet特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class Demo01Set {public static void main(String[] args) {Set<Integer> set = new HashSet<>();//使用add方法往集合中添加元素set.add(1);set.add(3);set.add(2);set.add(1);//使用迭代器遍历set集合Iterator<Integer> it = set.iterator();while (it.hasNext()) {Integer n = it.next();System.out.println(n);}}
}

2.2 HashSet集合存储数据的结构(哈希表)

哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)
在Object类有一个方法,可以获取对象的哈希值
int hashCode() 返回该对象的哈希码值。
hashCode方法的源码:
public native int hashCode();
native:代表该方法调用的是本地操作系统的方法

public class Person extends Object {//重写hashCode方法@Overridepublic int hashCode() {return 1;}
}
public class Demo01HashCode {public static void main(String[] args) {//Person类继承了Object类,所以可以使用Object类的hashCode方法Person p1 = new Person();int h1 = p1.hashCode();System.out.println(h1);//1Person p2 = new Person();int h2 = p2.hashCode();System.out.println(h2);//1/*toString方法的源码:return getClass().getName() + "@" + Integer.toHexString(hashCode());*/System.out.println(p1);//medo03.Person@1System.out.println(p2);//medo03.Person@1System.out.println(p1==p2);//false/*String类的哈希值String类重写Obejct类的hashCode方法*/String s1 = new String("abc");String s2 = new String("abc");System.out.println(s1.hashCode());//96354System.out.println(s2.hashCode());//96354System.out.println("重地".hashCode());//1179395System.out.println("通话".hashCode());//1179395}
}

2.3 HashSet存储自定义类型元素

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

import java.util.HashSet;/*Set集合不允许存储重复元素的原理
* */
public class Demo02HashSetSaveString {public static void main(String[] args) {//创建HashSet集合对象HashSet<String> set = new HashSet<>();String s1 = new String("abc");String s2 = new String("abc");set.add(s1);set.add(s2);set.add("重地");set.add("通话");set.add("abc");System.out.println(set); //[重地, 通话, abc]}
}
import java.util.Objects;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", 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;}
}
  1. HashSet存储自定义类型元素
set集合报错元素唯一:存储的元素(String,Integer,...Student,Person...),必须重写hashCode方法和equals方法要求:同名同年龄的人,视为同一个人,只能存储一次
import java.util.HashSet;public class Demo03HashSetSavePerson {public static void main(String[] args) {//创建HashSet集合存储PersonHashSet<Person> set = new HashSet<>();Person p1 = new Person("哆啦A梦",18);Person p2 = new Person("哆啦A梦",19);Person p3 = new Person("哆啦A梦",18);System.out.println(p1.hashCode());System.out.println(p2.hashCode());System.out.println(p1==p2);System.out.println(p1.equals(p2));set.add(p1);set.add(p2);set.add(p3);System.out.println(set);}
}

2.3 LinkedHashSet

java.util.LinkedHashSet集合 extends HashSet集合
LinkedHashSet集合特点:底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
import java.util.HashSet;
import java.util.LinkedHashSet;public class Demo04LinkedHashSet {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("www");set.add("abc");set.add("abc");set.add("baboo");System.out.println(set);//[baboo, abc, www]无序,不允许重复LinkedHashSet<String> linked = new LinkedHashSet<>();linked.add("www");linked.add("abc");linked.add("abc");linked.add("baboo");System.out.println(linked);//[www, abc, baboo]有序,不允许重复}
}

1.9 可变参数

可变参数:是JDK1.5之后出现的新特性
使用前提:
当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数.
使用格式:定义方法时使用
修饰符 返回值类型 方法名(数据类型…变量名){}
可变参数的原理:
可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数
传递的参数个数,可以是0个(不传递),1,2…多个

public class Demo01VarArgs {public static void main(String[] args) {//int i = add();//int i = add(10);int i = add(10,20);//int i = add(5,10,15,20,25,30,35,40,45,50);System.out.println(i);method("abc",6.6,18,12,11,15);}/*可变参数的注意事项1.一个方法的参数列表,只能有一个可变参数2.如果方法的参数有多个,那么可变参数必须写在参数列表的末尾*//*public static void method(int...a, String...b) {}*//*public static void method(String b,double c,int d,int...a) {}*///可变参数的特殊(终极)写法public static void method(Object...obj){}/*定义计算(0-n)整数和的方法已知:计算整数的和,数据类型已经确定int但是参数的个数不确定,不知道要计算几个整数的和,就可以使用可变参数add(); 就会创建一个长度为0的数组, new int[0]add(10); 就会创建一个长度为1的数组,存储传递来过的参数 new int[]{10};add(10,20); 就会创建一个长度为2的数组,存储传递来过的参数 new int[]{10,20};add(10,20,30,40,50,60,70,80,90,100); 就会创建一个长度为2的数组,存储传递来过的参数 new int[]{10,20,30,40,50,60,70,80,90,100};*/public static int add(int...arr) {System.out.println(arr);//[I@50cbc42f底层是一个数组System.out.println(arr.length);//0,1,2,10//定义一个初始化的变量,记录累加求和int sum = 0;//遍历数组,获取数组中的每一个元素for (int i : arr) {//累加求和sum += i;}//把求和的结果返回return sum;}//定义一个方法,计算三个int类型整数的和
/*    public static int add(int a,int b,int c){return a+b+c;}*/
//定义一个方法,计算两个int类型整数的和/*public static int add(int a,int b){return a+b;}*/
}

第五章 Collections

2.1 常用功能

  • java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
  • public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
  • public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.Callable;public class Demo01Collections {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();//往集合中添加多个元素/*list.add("a");list.add("b");list.add("c");list.add("d");list.add("e");*///public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。Collections.addAll(list,"a","b","c","d","e");System.out.println(list);//[a, b, c, d, e]//public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。Collections.shuffle(list);System.out.println(list);//[e, b, a, d, c]}
}
  • public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。

  • 注意:
    sort(List list)使用前提
    被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则

    Comparable接口的排序规则:
    自己(this)-参数:升序

public class Person implements Comparable<Person> {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", 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;}//重写排序的规则@Overridepublic int compareTo(Person o) {//return 0;//认为元素都是相同的//自定义比较的规则,比较两个人的年龄(this,参数Person)//return this.getAge() - o.getAge();//年龄升序排序return o.getAge() - this.getAge();//年龄升序排序}
}
import java.util.ArrayList;
import java.util.Collections;public class Demo02Sort {public static void main(String[] args) {ArrayList<Integer> list01 = new ArrayList<>();list01.add(1);list01.add(4);list01.add(3);System.out.println(list01);//[1, 4, 3]//public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。Collections.sort(list01);//默认是升序System.out.println(list01);ArrayList<String> list02 = new ArrayList<>();list02.add("f");list02.add("h");list02.add("g");System.out.println(list02);//[f, h, g]Collections.sort(list02);System.out.println(list02);ArrayList<Person> list03 = new ArrayList<>();list03.add(new Person("凌达",19));list03.add(new Person("大卫",20));list03.add(new Person("哈维",15));System.out.println(list03);//[Person{name='凌达', age=19}, Person{name='大卫', age=20}, Person{name='哈维', age=15}]Collections.sort(list03);System.out.println(list03);}
}

2.2 Comparator比较器

  • public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
    Comparator和Comparable的区别
    Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
    Comparator:相当于找一个第三方的裁判,比较两个

    Comparator的排序规则:
    o1-o2:升序

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;}
}
import java.CookieHandler;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class Demo03Sort {public static void main(String[] args) {ArrayList<Integer> list01 = new ArrayList<>();list01.add(2);list01.add(4);list01.add(3);System.out.println(list01);Collections.sort(list01, new Comparator<Integer>() {//重写比较的规则@Overridepublic int compare(Integer o1, Integer o2) {//return o1 - o2;//升序return o2 - o1; //降序}});System.out.println(list01);ArrayList<Student> list02 = new ArrayList<>();list02.add(new Student("a静香", 19));list02.add(new Student("大雄", 20));list02.add(new Student("小夫", 16));list02.add(new Student("b小夫", 19));/*Collections.sort(list02, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//按照年龄升序排序return o1.getAge()-o2.getAge();}});*///扩展:了解Collections.sort(list02, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//按照年龄升序排序int result = o1.getAge() - o2.getAge();//如果两个人年龄相同,在使用姓名的第一个字进行比较if (result == 0) {result = o1.getName().charAt(0) - o2.getName().charAt(0);}return result;}});System.out.println(list02);}
}

2.3 简述Comparable和Comparator两个接口的区别。

Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

更多推荐

Java语言的数据结构、List集合、Set集合、Collections

本文发布于:2024-03-04 13:26:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1709382.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据结构   语言   Java   Collections   Set

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!