JAVA集合类汇总(Collection)(学习笔记一)

学习笔记(一)

一、集合与数组:

       数组,固定长度、可以存储基本数据类型。是用来存储现由对象的一种容器,不适合在对象数量未知的时候使用。

       集合,只能存储对象,对象类型可以不一样,长度可变。

二、关系:

                                                图一集合接口框架

由(图一)可以看出:

       Collection<E>Map<K,V>java.util包框架中的两种不同的数据结构:集合和映射表。JAVA中没有直接提供这个接口的实现类,而是由Set List 继承了这个接口(Collection)。:List<E>有序可重复,可以通过整数索引来访问。Set<E>不包含重复元素

public interface List<E> extends Collection<E>
public interface Set<E> extends Collection<E> 

       Map<K,V>java.util包框架中另一个接口,它和Collection 接口没有关系,是相互独立的。但都是集合的一部分,M,ap包含了key-valueMap不允许重复的key。但是可以包含相同的value

public interface Iterable<T>

    Iterable 接口是JAVA 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,
Iterator<T> iterator();返回一个内部元素类型为T的迭代器。
default void forEach(Consumer<? super T> action)对内部元素进行遍历,并对指定的元素进行操作。 
default Spliterator<T> spliterator()创建并返回一个可分割的迭代器

       Iterable最早在JDK 1.5出现,开始只有 Iterator 这一个抽象方法。需要子类来实现一个内部迭代器iterator遍历集合元素,后面两个方法使在JAVA 8 中新添加的,forEach(Consumer<?super T> action) 是为了方便遍历操作集合内的元素,如果内部元素有为空的会报NullPointerException异常。
      
Spliterator<T>spliterator()提供了一个可以并行遍历集合元素的迭代器。

       关于修饰符,仔细看会发现在JDK8中出现的都是 默认的default 的权限修饰符。我们知道,如果给一个接口新添加一个方法,那么它的子类就必须实现此方法,为了能给接口扩展新的功能,而又不必每个子类都要实现此方法,在JDK8中新加了default 关键字,被其修饰的方法可以不必由子类实现,并且由default修饰的方法在接口中有具体的方法体。这打破了之前JAVA对接口的规范。

public interface Collection<E> extends Iterable<E>

    集合层次的根接口,所有的集合实现类都必须提供Collectin接口的方法,Collectin本身并不关心元素是否重复,是否有序,它只提供了对元素的基本操作方法:

    
 
 
 
 
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
default boolean removeIf(Predicate<? super E> filter)
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
default Spliterator<E> spliterator()
default Stream<E> stream()
default Stream < E > parallelStream()

有几个地方需要注意一下:

       上面说过,Iterable JDK1.8中实现了,defaultvoid forEach(Consumer<?super T> action) 通过forEach 对内部元素进行遍历,并对指定元素进行操作。而Collection 接口继承了 Iterable。提供了循环的新方式,看下面代码:

public static void main(String[] args){

    Collection<String> collection = Arrays.asList("JAVA","Collection","List","Set");
    //这个是使用的lambda表达式的的循环
    collection.forEach(cc -> System.out.println(cc));
    //这个是使用lambda表达式的简化版本双冒号表达式(调用out对象的println方法)
    collection.forEach(System.out::println);
    //这个还是用的java8提供的新函数,但是没有用lambda表达式
    collection.forEach(new Consumer<String>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }
    });
}

       JDK1.5所提供的ForEach就不多说了。

toArray(); toArray(T[] a);
     

toArray to Array(T[]a)返回的都是当前所有元素的数组,toArray返回的是一个Object[]数组,类型不能改变,to Array(T[] a)返回的使当前传入的类型T的数组,更方便用户操作,比如需要获取一个String 类型的数组:
Collection<String> collection = Arrays.asList("JAVA","Collection","List","Set");
String[] s=collection.toArray(new String[0]) ;
for (String sc:s) {
    System.out.println(sc);
}
boolean isEmpty();

       如果此 collection 不包含元素,则返回 true。反之就是false

Collection<String> collection = Arrays.asList("JAVA","Collection","List","Set");
if(!collection.isEmpty()){
    System.out.println("true");
}else{
    System.out.println("false");
}

    如果 collection 包含指定的元素的,返回true ClassCastException - 如果指定元素的类型与此 collection 不兼容(可选)。 NullPointerException- 如果指定的元素为 null,并且此 collection 不允许 null 元素

 
boolean contains(Object o);boolean containsAll(Collection<?> c);

    如果 collection 包含指定的元素的,返回true ClassCastException - 如果指定元素的类型与此 collection 不兼容(可选)。 NullPointerException- 如果指定的元素为 null,并且此 collection 不允许 null 元素


  
Collection<String> collection = Arrays.asList("JAVA","Collection","List","Set");
System.out.println(collection.contains("JAVA"));
	Collection<String> collection = Arrays.asList("JAVA","Collection","List","Set");
System.out.println(collection.containsAll(collection));
boolean retainAll(Collection<?> c);

       用于移除未包含在指定collection 中的所有元素

List<String> list=new ArrayList<String>();
list.add("第一个元素");  //向列表中添加数据
list.add("第二个元素");  //向列表中添加数据
list.add("第三个元素");  //向列表中添加数据
List<String> list1=new ArrayList<String>();
list1.add("第一个元素");  //向列表中添加数据
list1.add("第三个元素");  //向列表中添加数据
boolean ret=list.retainAll(list1);
if(ret){
    System.out.println("元素被移除成功");
}else{
    System.out.println("列表中不包含要移除的元素");
}
list.forEach(c->System.out.println(c));

default boolean removeIf(Predicate<? super E> filter)

       JAVA8中新添加的方法,用于移除符合removeIf参数格式的元素

List<String> list=new ArrayList<String>();
list.add("第一个元素");  //向列表中添加数据
list.add("第二个元素");  //向列表中添加数据
list.add("第三个元素");  //向列表中添加数据
list.removeIf(test->test.startsWith("第一"));
list.forEach(c->System.out.println(c));
boolean equals(Object o);

       List.equals Set.equals 的协定声称List只能与List相等,Set只能与Set相等。不可能编写一个同时正确实现 Set List 接口的类。所以当同为List或者Set的实现类时,equals方法就等于containsAll方法。(List Set 接口是值比较)

    
List<String> list=new ArrayList<String>();
list.add("第一个元素");  //向列表中添加数据
list.add("第二个元素");  //向列表中添加数据
list.add("第三个元素");  //向列表中添加数据
List<String> list1=new ArrayList<String>();
list1.add("第一个元素");  //向列表中添加数据
list1.add("第二个元素");  //向列表中添加数据
list1.add("第三个元素");  //向列表中添加数据
if(list.equals(list1)){
    System.out.println("true");
}else{
    System.out.println("false");
}
int hashCode();

    返回此 collection 的哈希码值。当 Collection 接口没有为Object.hashCode 方法的常规协定添加任何约束时,为了满足 Object.hashCode 方法的常规协定,程序员应该注意任何重写Object.equals 方法的类必须重写 Object.hashCode 方法。需要特别指出的是,c1.equals(c2) 暗示着 c1.hashCode()==c2.hashCode()
List<String> list=new ArrayList<String>();
list.add("第一个元素");  //向列表中添加数据
list.add("第二个元素");  //向列表中添加数据
list.add("第三个元素");  //向列表中添加数据
List<String> list1=new ArrayList<String>();
list1.add("第一个元素");  //向列表中添加数据
list1.add("第二个元素");  //向列表中添加数据
list1.add("第三个元素");  //向列表中添加数据
System.out.println(list.hashCode());
System.out.println(list1.hashCode());

default Spliterator<E> spliterator()
default Stream<E> stream()
default Stream<E> parallelStream() 

这个三个,在以后详细记录。





猜你喜欢

转载自blog.csdn.net/qq_21416001/article/details/80251521
今日推荐