学习笔记(一)
一、集合与数组:
数组,固定长度、可以存储基本数据类型。是用来存储现由对象的一种容器,不适合在对象数量未知的时候使用。
集合,只能存储对象,对象类型可以不一样,长度可变。

图一集合接口框架
由(图一)可以看出:
public interface List<E> extends Collection<E>
public interface Set<E> extends Collection<E>
Map<K,V>是java.util包框架中另一个接口,它和Collection 接口没有关系,是相互独立的。但都是集合的一部分,M,ap包含了key-value。Map不允许重复的key。但是可以包含相同的value
public interface Iterable<T>
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);
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();
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()
这个三个,在以后详细记录。