(二)java集合框架

本文深入探讨了集合数据结构,包括Set、Map和List的用法,重点讲解了HashSet、LinkedHashSet、TreeSet的不同特性和应用场景,以及List接口的实现类ArrayList和LinkedList的特点。
摘要由CSDN通过智能技术生成

一:引言

集合:(set)是一个储存和处理无重复元素的高效数据结构,映射表(map)类似于目录,提供了使用键值对快速查询和获取值得功能
本章将讨论Set Map 以及List的用法

 collection包括set和list接口

二:set接口

set接口中包括三个具体类分别为:散列类HashSet,树形集TreeSet和链式散列集LinkedHashSet用来创建集合。Set接口拓展了Collection接口,其中Set实例中不包含重复元素    e1.equals(e2)!=true

2.1HashSet

Hashset默认情况下,初始容量为16而负载系数为0.75,若知道将创建的集合大小,则可以再构造方法中创建指定容量和负载系数。负载系数大小为0.0~1
若创建完成,在增加容量前,负载系数会测量集合是否允许多满。如果元素个数超过集合的容量与负载系数的大小,那么集合的容量将会自动翻倍;(若容量为16,负载系数为0.5,那么当集合尺寸达到8(16*0.5=8)时,容量将会自动翻倍到32)
负载系数过高会降低空间开销,默认0.75是时间开销和空间开销的最佳权衡值(将在散列章节中更深入讨论负载系数问题)

例:将字符串添加到集合中

Set <String> set = new HashSet<String>();
String s1 = "Hello";
String s2 = s1;
String s3 = "world";
set.add(s1);
set.add(s2);
Set.add(s3);
//取值方法用迭代器进行取值
Itreator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next()+" ");
}
//也可使用for each方法进行取值,如下:
for(String string:set){
System.out.prientln(set.toUpperCase()+" ");
}
/*
迭代器Itreator,创建一个迭代器,迭代器(iterator)是一种对象
它能够用来遍历标准模板库容器中的部分或全部元素。
迭代器使开发人员能够在类或结构中支持foreach迭代。
*/
//HashSet集合中,可使用add进行添加元素,或者addAll()方法,使用remove()进行删除

~~~~~~~~~~~~~~~~~~~~~手动分隔线 ~~~~~~~~~~~~~~~~~~~~~~~~~ ~

2.2 LinkedHashSet

LinkedHashSet用一个链表实现拓展HashSet,支持对链表中的元素进行排序,HashSet 中的元素是无序的,LinkedHashSet可以根据元素插入的顺序提取,同时LinkedHashSet同样是集合,其中的元素是不能重复的,只是简单的对插入的元素进行简单的插入的顺序的排序,若要强行加一个不同的顺序,使用TreeSet更加高效

~~~~~~~~~~~~~~~~~~~~~~~~~~手动分隔线 ~~~~~~~~~~~~~~~~~~~ ~

2.3TreeSet

TreeSet继承自SortSet抽象类,显然,TreeSet 中的元素是有序的

3.1   创建一个TreeSet:
import java.util.TreeSet;
public class TreeSetmothod {
public static void main(String[] args) {
	TreeSet<String> ts = new TreeSet<String>();
	ts.add("关羽");
	ts.add("刘备");
	ts.add("张飞");
	ts.add("刘备");
	ts.add("李逵");
	ts.add("赵云");
	for(String i:ts) {
		System.out.print(i+" ");
	}
	System.out.println("first:" + ts.first());
	//SortSet集合提供first和last方法返回集合中最大值和最小值
	System.out.println("last:" + ts.last());
	System.out.println("headSet:" + ts.headSet("张飞"));
	//SortSet方法提供headSet(x)和tailSet(x)方法分别返回小于x的元素
	//和大于等于x的元素
	System.out.println("tailSet:" + ts.tailSet("张飞"));
}
}

输出结果为:
输出结果

TreeSet实现自定义排序

方法一:(创建关于自定义对象的HashSet集合并实现Comparable接口)
本例使用学生的成绩作为排序

//创建自定义的Student类
package ScoreMangement;
public class Student implements Comparable<Student>{
    private int score;
    private String name;
    private String sno;
    public Student() {
    }
    public Student(String sno,String name,int score ) {
        this.score = score;
        this.name = name;
        this.sno = sno;
    }

    public Student(String sno ,int score ) {
        this.score = score;
        this.sno = sno;
    }
    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public void setScore(int score) {
        this.score = score;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }
    @Override
    public String toString() {
        return "学号:"+ this.getSno()+" 姓名"+this.getName()+" 成绩:"+this.getScore();
    }
    @Override
    public int compareTo(Student o) {
        int num = this.score - o.score;
        int num2 = num == 0?this.sno.length() - o.sno.length(): num;
        int num3 = num2 == 0?this.name.length() - o.name.length():num2;
        return num3;
    }
}

创建实例对象1

package ScoreMangement;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
    public static void main(String[] args) {
        Set<Student> students = new TreeSet<>();
        students.add(new Student("201819244325", "吴用", 196));
        students.add(new Student("201819244326", "公孙胜", 128));
        students.add(new Student("201819244329", "花荣", 129));
        students.add(new Student("201819244330", "李逵", 100));
        students.add(new Student("201819244331", "鲁智深", 163));
        students.add(new Student("201819244332", "林冲", 168));
        students.add(new Student("201819244333", "柴进", 166));
        students.add(new Student("201819244334", "朱仝", 145));
        students.add(new Student("201819244335", "杨志", 103));
        students.add(new Student("201819244336", "史进", 126));
        students.add(new Student("201819244337", "阮小五", 130));

        for (Student str : students) {
            System.out.println(str.getSno() + " " + str.getName() + " " + str.getScore());
        }
}

方法二:自定义排序类,实例方法继承此类

//非完全代码
//创建自定义的排序类
class MyComparator implements Comparator(String){
public int compare(String str1,String str2){
return str1.length() - str2.length();
}

//实例类实现自定义的排序类
}
public static void main(String [] args){
TreeSet <String> set = new TreeSet<String> (new MyComparator());
//set.add()添加元素
//指定方式,自定义数据类型以及方法必须是可比较的对象
    traverse(set);
}

~~~~~~~~~~~~~~~~~~~~~~~~手动分隔线 ~~~~~~~~~~~~~~~~~~~~~ ~

由于List和Set同时继承了Collection接口,因此接下来讨论LIst集合中的实现子类及其方法

三: List

序:List接口继承自Collection接口,定义顺序储存元素的合集其中包括两个具体的类ArrayList 和 LinkedList

3.1数组线性表ArrayList

ArrayList: 数组线性表,动态创建。若需要通过下标随机访问元素,而不会在线性表起始位置插入或删除元素,那么使用ArrayList更高效,同时ArrayList使用可变大小的数组实现List接口,容量可以自动增大但是不可以自动减小并且可以储存相同的元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值