java基础-Collection集合

Collection集合:

存取数据时是单个存取,只能存储引用类型的数据 ;
都是可迭代的,迭代就是顺序访问集合的每个元素,并且只访问一次

List集合 有序且允许重复:(底层是数组,访问快添加删除慢)

add(index o);remove(index);get(index);sort()排序

List 实现类:ArrayList、Vector、LinkedList、 CopyOnWriteArrayList

开发多线程程序选择CopyOnWriteArrayList

不开发多线程程序选择ArrayList

list进行比较

list.sort(new Comparator() { 
@Override 
public int compare(Student o1, Student o2) 
{ return o2.getScore() - o1.getScore(); } 
});

Collection的常用操作(接口)

boolean add(E e) 向集合中添加元素e
addAll(Collection c) 把集合c中的元素全部添加到当前集合中** **void clear()删除集合中所有的元素** **boolean contains(Object o)判断集合中是否包含指定元素o** **boolean containsAll(Collection c)判断集合中是否c集合中的所有元素
boolean isEmpty() 判断集合是否为空
Iterator iterator()返回集合的迭代器对象
boolean remove(Object o) 在集合中删除第一个与o匹配的元素
boolean removeAll(Collection c) 把当前集合中出现在c集合里的元素删除** **boolean retainAll(Collection c) 删除当前集合中的元素,如果该元素在c集合中存在就保留
int size() 返回元素的个数
Object[] toArray() 把集合转化为数组

Collection操作代码:

//Collection是一个接口,需要赋值实现类对象
Collection collection=new ArrayList();
//约束集合中只能存储String类型的数据  泛型可以在编译的时候进行数据类型的检查
Collection<String> collection1=new ArrayList<>();
//向集合中添加对象
collection.add("nana");
collection.add(123);//添加基本类型数据时,系统会自动装箱为包装类对象 再添加到集合中去
collection.add(true);
//在实际运用中 一个集合一般只存储一个类型的数据,可以通过泛型约束集合中的元素类型
collection1.add("jj");
collection1.add("jj");
collection1.add("dd");
System.out.println(collection1.toString());
System.out.println(collection1); //调用的是ArrayList的toString()方法
//判断
System.out.println(collection1.isEmpty());
System.out.println(collection1.size());
System.out.println(collection1.contains("dd "));
//删除"jj"
collection1.remove("jj");
System.out.println(collection1);
//转化为数组
String[] myArray=new String[collection1.size()];i
collection1.toArray(myArray);
System.out.println(Arrays.toString(myArray));

Collection 集合迭代器

Collection<String> collection=new ArrayList<>();
collection.add("jj");
collection.add("dd");
collection.add("mm");
collection.add("jj2");
collection.add("mm1");
Iterator<String> iterator=collection.iterator();
//获取了迭代器后,迭代器有一个游标,指向第一个元素的前面  hasNext()判断是否还有下个元素,next()返回下个元素,游标下移
while (iterator.hasNext()){
    String str=iterator.next();
    System.out.println(str+"\t");
}
System.out.println();

结果:

删除集合中的数据:

//删除集合中的所有 dd,遍历集合中的所有元素,如果该元素是dd就删除
//iterator迭代器的游标 经过while循环后,指向最后一个元素的后面,需要重新获的迭代器对象
//注意 当已经获得了迭代器之后,通过collection集合啊 add remove clear修改了集合的结构,再使用迭代器的next()方法返回下个元素时可能会出现异常
        iterator=collection.iterator();
        while (iterator.hasNext()){
            String string=iterator.next();
            if("dd".equals(string)){
                iterator.remove();//通过迭代器删除
//collection.remove("dd");//java.util.ConcurrentModificationException
            }
        }
        System.out.println(collection);

List集合

List<String> list=new ArrayList<>();
list.add("jj");
list.add("jj");
list.add("mm");
list.add("bb");
list.add("dd");
System.out.println(list);
//1)在指定的索引值添加数据
list.add(0,"xmm");
list.add(list.size(),"gg");
System.out.println(list);
//删除指定位置的元素
list.remove("jj");
list.remove(0);
//返回元素第一次出现的位置
System.out.println(list.indexOf("bb"));
System.out.println(list.lastIndexOf("dd"));
//返回指定元素的位置
for(int i=0;i<list.size();i++){
    System.out.println(list.get(i));
}

Set集合无序不允许重复

接口Set实现类:CopyOnWriteArraySet、HashSet

HashSet类:底层是HashMap,HashSet就是HashMap的键的集合,向HashSet中添加元素,实际上把该元素作为键添加到HashMap中;HashSet就是HashMap键的集合;

HashSet类有个子接口,SortedSet,可以对元素进行自然排序,要求集合中的元素必须是可比较的

TreeSet,实现了SortedSet,可以对元素进行自然排序;TreeSet的底层就是TreeMap,TreeSet就是TreeMap的键的集合,向TreeSet中添加元素,实际上把该元素作为键添加TreeMap中

如果元素中有个值一样,定义了比较器,如果当两个Product的价格一样,则TreeSet以为是同一个对象,

1)创建TreeSet时指定Comparator比较器

2)如果没有指定Comparator比较器,可在类中实现Comparable接口

如何选择HashSet(不需要排序)或者TreeSet(根据某个字段排序 )

//创建set集合
Set<String> set =new HashSet<>();

TreeSet比较

1)Treeset要求元素必须是可比较的,先看集合是否有Comparator 在看类是否有Comparable

2)一般情况下 类中定义Comparable默认排序,集合Comparator可定义不同的排序规则

实现TreeSet比较的两种方式

1)类中定义Comparable默认排序

public class Product implements Comparable<Product> {
    private String productName;
    private double price;
    private int count;
@Override
public int compareTo(Product o) {
    return o.getCount()-this.getCount();
}
}
class Test04{
    public static void main(String[] args) {
        //创建TreeSet集合 存储product产品,默认按照价格升序排序,向集合中添加一些Product对象
        TreeSet<Product> treeSet=new TreeSet<>(new Comparator<Product>() {
            @Override
            public int compare(Product o1, Product o2) {
                return (int) (o1.getPrice()-o2.getPrice());
            }
        });
//        TreeSet<Product> treeSet=new TreeSet<>();
        treeSet.add(new Product("安慕希",59.9,11));
        treeSet.add(new Product("AD钙奶",80,12));
        treeSet.add(new Product("纯牛奶",75.5,24));
        for(Product product:treeSet){
            System.out.println(product);
        }
//        Iterator<Product> iterator=treeSet.iterator();
//        while (iterator.hasNext()){
//            Product product=iterator.next();
//            System.out.println(product );
//        }
    }

}

2)集合Comparator可定义

//创建TreeSet集合,存储String,按字符串降序排列,指定Comparator比较器
TreeSet<String> treeSet=new TreeSet<>(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        //降序
        return o2.compareTo(o1);
    }
});
treeSet.add("123");
treeSet.add("444");
treeSet.add("aaa");
treeSet.add("9999");
System.out.println(treeSet);

总结:

1)开发多线程程序基本使用java.util.concurrent包中线程安全的集合类 如:线程安全的list集合 copyonWriteArrayList 线程安全的set集合:copyonWriteArraySet 、concurrentSkipListSet

2)Collections工具类提供了一些对Collection集合进行操作的方法:synchronizedXXX(XXX)可以吧XXX集合由不是线程安全的集合转化为线程安全的集合

posted @ 2021-08-10 16:17  只要不兔的学习笔记  阅读(99)  评论(0)    收藏  举报