java集合
Java集合分类
数据结构
一:集合框架的概述
1.集合、数组都是对多个数据进行存储的结构 简称java容器
说明:此时的存储,主要还是内存层面的存储,不涉及持久化存储(数据库、硬盘等等)
2.数组在存储多个数据方面的特点:
》一旦初始化以后,长度就确定了
》指明数组的数据类型 例如:string[] int [] 一旦定义好其数组的类型、其元素的类型也就指定了
2.2数组在存储多个数据方面的缺点
》一旦初始化以后,其长度就不可以修改
》数组中提供的方法非常有限、对于添加、删除、插入数据等操作,非常不便、同事效率不高
》获取数组中实际元素的个数需求,数组没有现存的属性和方法可用
》数组存储的数据的特点:有序、可重复。对于无序、不可重复的需求、不能满足
二:集合框架: collection接口:单列集合,用来存储一个一个的对象
---list接口:存储有序的可重复的数据 ---》“动态数组”
-----arraylist linkedlist vector
---set接口:无序的不可重复的数据-----》高中讲的“集合”
----hashset linkedhashset
----Map接口:双列集合,存储一对一对的数据(key,value)
-----hashmap、linkedhashmap
package CollectionTest.SetList;
import org.junit.Test;
import java.util.*;
/**
*set接口的框架结构:
* 1.collection
* 1.2set接口 储存无序的、不可重复的数据
* 1.2.1HashSet :作为set接口的主要实现类:线程不安全的;可以储存null值
* 1.2.1LinkedHashSet: 作为HashSet的子类,特点就是加了一个linked,使得遍历kinkeshashset的时候回按照添加顺序进行输出
* 1.2.3TreeSet(二叉树:红黑树) : 可以按照添加的对象的指定属性进行排序
*set接口的:无序和不可重复的数据
* 1.set作为接口没有定义额外的方法,使用的都是collection的方法
*
* @ Author :wiselee
* @ Date :Created in 11:32 2020/4/27
* @ Description:
* @ Modified By:
* @Version: $
*/
public class SetTest {
/*
* set:储存无序的、不可重复的数据
* 1.无序性:不等于随机性
*以hashset为例:储存的数据在底层数组中并非按照数组索引的顺序添加,而是根据数组的hash值来决定
*
* 2.不可重复性:保证添加的元素按照equals判断是不能返回true,即相同的元素不能添加进来,只能添加一个
* 3.添加元素的过程:以hashset为例:
* 我们向hashset中添加元素:a,首先调用元素a的所在类的hashcode()方法,计算元素的哈希值,次哈希值通过某种算法
* 计算出在hashset在底层数组中的存放位置(即:索引位置),判断此位置是否为null
* 如果此位置没其他元素,则元素a就直接添加成功(情况一),如果此位置有其他元素,则调用hash值比较哈希值的异同,如果不同则添加成功(情况二)如果相同则需要调用a的equals方法进行比较,如果返回为true则添加失败,如果返回false则添加成功(情况三)
*
* 对于添加成功的情况2、情况3而言:元素a与已经存在的指定索引位置上的位置上以链表的方式存储
* jdk7:元素a放在数组中,指向原来的元素
* jdk8:原来的元素在数组中,指向元素a
* 总结:七上八下
*hashset底层:数组加链表
*
*
* 2.要求:向set中添加的数据,其所在的类一定要重写hashcode equals
* 要求:重写的hashcode euqals尽可能保证一致性
* */
@Test
public void test1(){
Set set = new HashSet();
set.add(456);
set.add(123);
set.add("aa");
set.add("bb");
set.add(new User("jj",12));
set.add(new User("jj",12));
set.add(159);
set.add(159);
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
/*LinkedHashSet的使用
LinkedHashSet作为hashset的子类,再添加数据的同时,每个数据还维护了两个引用,记录前一个数据和后一个数据
对于频繁的遍历操作,LinkedHashSet比hashset快一些
*
*
* */
@Test
public void test2(){
Set set = new LinkedHashSet();
set.add(456);
set.add(123);
set.add("aa");
set.add("bb");
set.add(new User("jj",12));
set.add(new User("jj",12));
set.add(159);
set.add(159);
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
@Test
public void test3(){
TreeSet set = new TreeSet();
//不能添加不同类的对象:失败
// set.add(123);
// set.add(456);
// set.add("aa");
//举例一
// set.add(123);
// set.add(2123);
// set.add(3);
// set.add(23);
// set.add(9);
// Iterator iterator = set.iterator();
// while (iterator.hasNext()){
// System.out.println(iterator.next());
// }
/*自然排序
定制排序
*
自然排序中:比较两个对象是否相同的标准为:compareto()返回是否为0
*定制排序:comparator 比较两个对象是否相同的标准为:compareto()返回是否为0
* */
//举例二
set.add(new User("tom",12));
set.add(new User("jj",12));
set.add(new User("hh",13));
set.add(new User("pp",122));
set.add(new User("to",15));
set.add(new User("om",18));
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
@Test
public void test4(){
Comparator com = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof User && o2 instanceof User){
User u1 = (User)o1;
User u2 = (User)o2;
return Integer.compare(u1.getAge(),u2.getAge());
}else {
throw new RuntimeException("输入数据不一致");
}
}
};
TreeSet set = new TreeSet(com);
set.add(new User("tom",12));
set.add(new User("jj",12));
set.add(new User("hh",13));
set.add(new User("pp",122));
set.add(new User("to",15));
set.add(new User("om",18));
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
本文来自博客园,作者:wiselee/,转载请注明原文链接:https://www.cnblogs.com/wiseleer/p/16886763.html