集合框架(ArrayList
存储数据并遍历)
JDK1.8新增的一个方法也能遍历集合
void forEach(Consumer<? super E> action)
执行特定动作的每一个元素的 Iterable
直到所有元素都被处理或操作抛出异常
代码示例:
去除一个列表中的重复的元素
package org.westos.demo;
import java.util.ArrayList;
/**
* @Author: Administrator
* @CreateTime: 2019-05-03 09:10
*/
public class MyTest2 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(300);
list.add(300);
list.add(300);
list.add(500);
list.add(500);
list.add(500);
list.add(100);
list.add(100);
list.add(500);
list.add(200);
list.add(500);
list.add(100);
list.add(500);
list.add(400);
list.add(500);
list.add(500);
list.add(500);
list.add(500);
list.add(500);
list.add(100);
list.add(300);
list.add(300);
list.add(300);
list.add(300);
list.add(100);
for (int i = 0; i < list.size() - 1; i++) {
for (int j = i + 1; j < list.size(); j++) {
Integer a = list.get(i);
Integer b = list.get(j);
if (a.equals(b)) {
list.remove(b);
j = i;
}
}
}
System.out.println(list);
}
}
-
ArrayList
创建对象就是一般方法,在上述代码中使用到了泛型,这里先不做过多讲解,在后续博客中会讲解到泛型,只需要知道在上述代码创建的列表中只能存储Integer
类型的数据,否则会报错 -
在上述代码中,先给一个列表中添加了很多个元素,之后对其进行处理,去除列表中重复的元素
-
在比较列表中每一个元素时使用到了
equal
方法,这里需要提一下,因为在之前Integer类的博客中有讲解到,equal
方法比较的是两个Integer
对象的内容大小,而因为Integer类会提前创建从-128~127个对象,所以在自动装箱时就可能会发生创建新对象的情况,就会有新的地址值,所以用==
比较就会发生错误,所以在这里一定要使用equal
方法 -
去除重复元素的思想是将每一个元素对后面的每一个元素进行比较,如果发现重复的就将后面的元素删除,所以使用
for
循环嵌套,或使用迭代器自带的添加删除功能,否则会发生并发修改异常 -
这里使用
for
循环嵌套,n
个元素比较n-1
次,从而确定了两个循环的初始条件,list.remove(b);
,依据索引删除元素 -
开头还提到了
forEach
方法,代码如下:list.forEach(new Consumer() { @Override public void accept(Object o) { System.out.println(o); } });
-
这里的方法需要一个参数就是
Consumer
接口,根据之前的传参博客知道如果一个方法的参数需要一个接口,传上一个该接口的子类的对象,可以直接使用匿名内部类完成,在圆括号中输入new Consumer()
后按住alt+enter之后再按回车键便可自动生成下面的代码,在public void accept(Object o) {}
代码的括号中输入需要的代码逻辑即可 -
由于上述代码的
Consumer
接口中只含有一个抽象方法,所以可以使用Lambda表达式实现简写,代码实现如下:Consumer con = (obj) -> System.out.println(obj);
,不用纠结于此,后面还会再次讲解到
集合框架(ArrayList
功能)
-
int indexOf (Object o)
返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 - 1。 -
int lastIndexOf (Object o)
返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 - 1。 -
List<E> subList ( int fromIndex, int toIndex)
返回一个视图之间的指定 fromIndex和 toIndex这两个指定索引的列表,List list1 = list.subList(0, list.indexOf(200)+1);
根据起始索引和结束索引从集合中截取一段元素,放到一个新集合中 -
void forEach (Consumer < ? super E > action)
执行特定动作的每一个元素的Iterable
直到所有元素都被处理或操作抛出异常。
.
集合框架(Vector
的特有功能)
Vector
类概述: Vector
类可以实现可增长的对象数组 , Vector
是同步的。
Vector
类特有功能:
-
public void addElement(E obj)
将指定的组件添加到此向量的末尾,将其大小增加1。 -
public E elementAt(int index)
返回指定索引处的组件。 -
public Enumeration elements()
返回此向量的组件的枚举。 -
void insertElementAt (E obj,int index)
将指定对象作为此向量中的组件插入到指定的index
处。 -
vector
特有的迭代方式elements()
获取一个迭代器
代码实现:Enumeration elements = vector.elements(); while (elements.hasMoreElements()){ Object o = elements.nextElement(); System.out.println(o); }
集合框架(LinkedList
的特有功能)
LinkedList
类概述: List
接口的链接列表实现 , 此实现不是同步的
LinkedList
类功能:
-
public void addFirst(E e)及addLast(E e)
将指定元素插入此列表的开头 / 结尾。 -
public E getFirst()及getLast()
返回此列表的 第一个 / 最后一个 元素。 -
public E removeFirst()及public E removeLast()
移除并返回此列表的 第一个 / 最后一个 元素。 -
E getFirst ()
返回此列表的第一个元素。 -
E getLast ()
返回此列表的最后一个元素。 -
int indexOf (Object o)
返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 - 1。 -
int lastIndexOf (Object o)
返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 - 1。 -
E peek ()
获取但不移除此列表的头(第一个元素)。 -
E peekFirst ()
获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。 -
E peekLast ()
获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。 -
E pop ()
从此列表所表示的堆栈处弹出一个元素。 -
void push (E e)
将元素推入此列表所表示的堆栈。 -
E removeFirst ()
移除并返回此列表的第一个元素。 -
E removeLast ()
移除并返回此列表的最后一个元素。 -
E poll()
获取并移除此列表的头(第一个元素)
集合框架(用LinkedList模拟栈数据结构的集合并测试)
需求:请用LinkedList
模拟栈数据结构的集合,并测试/栈的数据结构特点:先进后出
package org.westos.java;
import java.util.LinkedList;
/**
* @Author: Administrator
* @CreateTime: 2019-05-03 11:11
*/
public class MyTest {
public static void main(String[] args) {
MyStack myStack = new MyStack();
myStack.addEle(100);
myStack.addEle(200);
myStack.addEle(300);
myStack.addEle(400);
myStack.addEle(500);
Object o = myStack.get();
System.out.println(o);
Object o2 = myStack.get();
System.out.println(o2);
Object o3 = myStack.get();
System.out.println(o3);
Object o4 = myStack.get();
System.out.println(o4);
Object o5 = myStack.get();
System.out.println(o5);
Object o6= myStack.get();
System.out.println(o6);
}
}
class MyStack {
LinkedList linkedList;
public MyStack() {
linkedList= new LinkedList();
}
public void addEle(Object obj){
linkedList.addFirst(obj);
}
public Object get(){
//将第一个元素取出,并删除他
Object poll = linkedList.poll();
//把删除的元素再次加入到容器的最后面
linkedList.addLast(poll);
return poll;
}
}
通过上述代码便可实现模拟栈操作
集合框架(去除ArrayList中重复字符串元素方式)
需求:ArrayList
去除集合中字符串的重复值(字符串的内容相同)
思路:创建新集合方式
package org.westos.demo6;
import java.util.ArrayList;
/**
* @Author: Administrator
* @CreateTime: 2019-05-03 11:25
*/
public class MyTest {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("abc");
list.add("bbb");
list.add("abc");
list.add("abc");
list.add("ccc");
list.add("ddd");
list.add("ccc");
list.add("ddd");
ArrayList newList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
String s = (String) list.get(i);
if(!newList.contains(s)){
newList.add(s);
}
}
System.out.println(newList);
}
}
通过上述代码便可以实现去除集合中重复字符串的功能
集合框架(去除ArrayList中重复自定义对象元素)
需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
package org.westos.java;
import java.util.ArrayList;
import java.util.Objects;
import java.util.function.Consumer;
/**
* @Author: Administrator
* @CreateTime: 2019-05-03 11:29
*/
public class MyTest {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new Student("张三",232));
list.add(new Student("张三", 232));
list.add(new Student("张三", 23));
list.add(new Student("张三2", 23));
list.add(new Student("张三3", 23));
list.add(new Student("张三5", 23));
list.add(new Student("张三", 23));
list.add(new Student("张三", 23));
list.add(new Student("张三4", 23));
list.add(new Student("张三7", 23));
list.add(new Student("张三5", 23));
ArrayList newList = new ArrayList(); //定义一个新的列表
for (int i = 0; i < list.size(); i++) {
Student student = (Student) list.get(i);
if(!newList.contains(student)){
newList.add(student);
}
}
newList.forEach(new Consumer() {
@Override
public void accept(Object o) {
Student student= (Student) o;
System.out.println(student.getName()+"=="+student.getAge());
}
});
}
}
class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
在上述代码中在自定义类中重写了equal方法,为什么?
查看contains
方法的源码可以看到
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
再查看index
方法的源码
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
里面使用到了自定义类的equal
方法,自定义类默认方法是比较两个对象的引用,但是在这个案例中当两个对象的值相同时认为它们相等会更有意义,所以需要对equal
方法进行重写,当两个对象的内容相等时就认为他们相等,便可将列表中内容相同的对象认为相等并删除后面的元素,实现了去除ArrayList
中重复自定义对象元素的功能