1、面试官:能画一下ArrayList的Dragrams吗?
我:画不出来,但知道底层原理。
2、ArrayList有哪些函数接口,能写一下吗?
3、现在有一个list,如何删除指定的几个元素,能手写一段代码吗?
我:慌乱应付中,手写代码呀,没有IDEA根本想不起来呀。
简直就是耻辱,一个学而不专的耻辱。
下面开始恶补吧。
Iterable接口:遍历器接口,实现了这个接口的类能够轻松便利集合中的每元素。
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
public interface Collection<E> extends Iterable<E> 接口
public interface Collection<E> extends Iterable<E> { //一共新增了19种方法
// Query Operations
int size(); //返回集合中元素个数
boolean isEmpty(); //判断集合是不是空的
boolean contains(Object o); //判断集合中是否包含传入的元素
Iterator<E> iterator(); //返回一个遍历器
Object[] toArray(); //转成数组
<T> T[] toArray(T[] a); // 这个不知道,传入数组,饭后返回数组,是不是要保存至指定的数组中?
// Modification Operations
boolean add(E e);
boolean remove(Object o);
// Bulk Operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
boolean retainAll(Collection<?> c);
void clear();
// Comparison and hashing
boolean equals(Object o);
/**
* Returns the hash code value for this collection. While the
* <tt>Collection</tt> interface adds no stipulations to the general
* contract for the <tt>Object.hashCode</tt> method, programmers should
* take note that any class that overrides the <tt>Object.equals</tt>
* method must also override the <tt>Object.hashCode</tt> method in order
* to satisfy the general contract for the <tt>Object.hashCode</tt> method.
* In particular, <tt>c1.equals(c2)</tt> implies that
* <tt>c1.hashCode()==c2.hashCode()</tt>.
*
* @return the hash code value for this collection
*
* @see Object#hashCode()
* @see Object#equals(Object)
*/
int hashCode();
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
}
Collection是集合类的基本接口,提供了很多方法,实现了Collection接口的所有集合类都必须实现或者覆盖这些方法。
- 返回集合中元素的个数;
- 判断集合是不是空的;
- 判断某一个元素是不是集合中的元素;
- 返回一个遍历器;
- 将列表转成数组输出;
- 增、删元素;
- 集合对集合的操作,即操作的参数是一个子集,包括增加一个子集到该集合、删除一个集合到该子集、判断是不是包含这个子集;
- removeIf() 使用lambda移除元素;
- retainAll(Collection <?> c) 移除取反,不在传入子集中的元素全部移除;
- void clear(); 移除所有的元素;
- 判断是不是相等;
- 返回哈希code;
- 返回流;
- 返回并行流;
大致可以总结如下:
- 元素对集合的操作:增加、删除、判断包含关系;
- 集合对集合的操作:增加、删除、判断包含关系;
- 集合本身属性的操作:是不是空,元素个数,遍历器,转数组等;
- 花样法删除元素:java8引入的Lambad也用到了,还有取反删除,全部删除;
- 赠送方法:判断相等,返回hashCode;
- 返回流,包括正常流和并行流。
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
//ArrayList 结构彻底分析
ArrayList<String> list = new ArrayList<>();
list.add("miller");
list.add("xiaofang");
list.add("boy");
list.add("girl");
list.add("man");
list.add("woman");
System.out.println("list中元素的个数:" + list.size());
//使用高级的方式删除指定的几个元素 方法一:
//如果我想删除指定的三个元素, miller, boy, man,怎么办?
list.removeIf(s -> {
if(s.equals("miller") || s.equals("boy") || s.equals("man")) {
return true;
}
else {
return false;
}
});
System.out.println("使用方法一后list中元素的个数:" + list.size());
Iterator<String> it = list.iterator();
if(list.contains("woman")) {
System.out.println("list中包含 woman" );
}
while(it.hasNext()) {
System.out.println(it.next());
}
}
使用Lambda表达式实现删除指定元素的代码如上。
//