干货满满之ArrayList,LinkedList,
ArrayList集合存储自定义对象
往ArrayList中存储自定义的对象Person
- Person类
package com.rqy.day18;
public class Person {
private String name;
private int 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;
}
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//@Override
// public String toString() {
// return "Person{" +
// "name='" + name + '\'' +
// ", age=" + age +
// '}';
// }
}
package com.rqy.day18;
import java.util.ArrayList;
import java.util.Iterator;
/**
*练习:往ArrayList中存储自定义的对象Person
*思路:
* 1.描述Person
* 2.创建ArrayList对象
* 3.存储
* 4.取出
*/
public class ArrayListDemo {
public static void main(String args[]){
//2.创建ArrayList对象
ArrayList list = new ArrayList();
Person p1 = new Person("xzh",21);
Person p2 = new Person("rqy",22);
//3.存储
list.add(p1);
list.add(p2);
list.add(new Person("zs",12));
/*
取出
两种方式,一种是使用toString,另一种是向下转型,使用get方法
*/
for(Iterator it = list.iterator();it.hasNext();) {
Person p = (Person)it.next();
//System.out.println("name:"+p.getName()+" "+",age:"+p.getAge());
System.out.println(p);
}
}
}
- get方法效果图
开发中向下转型使用get方法,因为很多时候我们并不需要全部获取。
- toString方法效果图
ArrayList取出重复元素方式
方式一
- 首先定义一个功能,取出重复元素
package com.rqy.day18;
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo1 {
public static void main(String args[]){
ArrayList list = new ArrayList();
list.add("rqyboss1");
list.add("rqyboss1");
list.add("rqyboss1");
list.add("rqyboss2");
list.add("rqyboss2");
list.add("xzh3");
list.add("xzh3");
list.add("xzh4");
mathod(list);
System.out.println(list);
}
//定义功能,取出重复元素,无返回值,有参数
public static void mathod(List list){
for(int i = 0;i < list.size()-1;i++){
Object obj_i = list.get(i);
for(int j =i+1;j<list.size();j++){
如果在向下遍历的过程中,有相同的数据,就remove
if(obj_i.equals(list.get(j))){
list.remove(j);
}
}
}
}
}
可以看到,数据并没有完全的清除,只去除了一部分,这是为什么呢?
是因为remove后,数据的长度会发生变化,若移除了索引1上的内容,那么索引2就会到索引1的位置,但这是程序已经向下遍历了,导致数据清除不彻底。
可以在移除之后再将索引退回去重新equals一遍
//定义功能,取出重复元素,无返回值,有参数
public static void mathod(List list){
for(int i = 0;i < list.size()-1;i++){
Object obj_i = list.get(i);
for(int j =i+1;j<list.size();j++){
//如果在向下遍历的过程中,有相同的数据,就remove
if(obj_i.equals(list.get(j))){
list.remove(j);
//返回前一个索引进行对比
j--;
}
}
}
}
- 方式二
/*方式二:可以先定义一个容器用于存储这些唯一性的元素
对原有容器进行元素的获取,并在临时容器中进行判断是否存在
存在不存储,不存在存储
遍历完原容器后,临时容器内存储的就是唯一性的元素
*/
public static void method1(List list){
//定义一个临时容器
List temp = new ArrayList();
//遍历原容器
for(Iterator it = list.iterator();it.hasNext();){
Object obj = (Object)it.next();
//在临时容器中判断遍历到的元素是否存在
if(!temp.contains(obj)){
temp.add(obj);
}
}
//将原容器清空
list.clear();
//将临时容器中的元素放到原容器中
list.addAll(temp);
}
ArrayList取出重复自定义元素方式
- 使用之前的person例子
package com.rqy.day18;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
*练习:往ArrayList中存储自定义的对象Person
*思路:
* 1.描述Person
* 2.创建ArrayList对象
* 3.存储
* 4.取出
* 增加:去除重复元素
*/
public class ArrayListDemo {
public static void main(String args[]){
//2.创建ArrayList对象
List list = new ArrayList();
Person p1 = new Person("xzh",21);
Person p3 = new Person("xzh",21);
Person p2 = new Person("rqy",22);
//3.存储
list.add(p1);
list.add(p3);
list.add(p2);
list.add(new Person("zs",12));
method(list);
System.out.println(list);
/*
取出
两种方式,一种是使用toString,另一种是向下转型,使用get方法
*/
// for(Iterator it = list.iterator();it.hasNext();) {
// Person p = (Person)it.next();
// //System.out.println("name:"+p.getName()+" "+",age:"+p.getAge());
// System.out.println(p);
// }
}
//定义功能,取出重复元素,无返回值,有参数
public static void method(List list){
for(int i = 0;i < list.size()-1;i++){
Object obj_i = list.get(i);
for(int j =i+1;j<list.size();j++){
//如果在向下遍历的过程中,有相同的数据,就remove
if(obj_i.equals(list.get(j))){
list.remove(j);
//返回前一个索引进行对比
j--;
}
}
}
}
// public static void method(List list){
// List empy = new ArrayList();
// for(Iterator it = list.iterator();it.hasNext();){
// Object obj = (Object)it.next();
// if(!empy.contains(obj)){
// empy.add(obj);
// }
// }
// list.clear();
// list.addAll(empy);
// }
}
可以看到,输出的结果是不正确的,这是因为,当我们新new一个对象时,就在堆中开辟了一块区域,而之所以出错,是因为比较的是对象的路径。
- 解决办法就是重写Person类中的equals方法
public boolean equals(Object obj){
//如果比较的是同一个人,直接返回true
if(this == obj)
return true;
//若输入的数据类型不匹配,抛出异常
if(!(obj instanceof Person)){
throw new ClassCastException(obj.getClass().getName()+"类型错误");
}
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
查看contains封装的equals方法,即数据是如何进行比较的
// 查看contains封装的equals方法
System.out.println(this+"-----"+obj);
LinkedList特有方法
- addFirst()
- addLast()
- getFirst()
- getLast()
- removeFirst()
- removeLast()
取出所有元素
//取出所有元素
while (!link.isEmpty()){
//removeFirst和removeLast都可,取出顺序有所区别
System.out.println(link.removeFirst());
}
LinkedList实现队列结构
package com.rqy.day18;
import java.util.LinkedList;
/**
* @author rqyboss
* 使用LinkedList实现一个堆栈,或者队列数据结构
* 堆栈:先进先出
* 队列:先进后出
*/
class MyQueue{
private LinkedList link;
MyQueue(){
link = new LinkedList();
}
//添加元素的方法
public void myAdd(Object obj){
//内部使用的是LinkedList的方法
link.addFirst(obj);
}
//获取队列元素的方法
public Object myGet(){
return link.removeLast();
}
//集合中是否有元素的方法
public boolean isNull(){
return link.isEmpty();
}
}
public class LinkedListDemo1 {
public static void main(String args[]){
//创建自定义的队列对象
MyQueue queue = new MyQueue();
//添加元素
queue.myAdd("a1");
queue.myAdd("a2");
queue.myAdd("a3");
queue.myAdd("a4");
//获取全部元素,先进先出
while (!queue.isNull()){
System.out.println(queue.myGet());
}
}
}
文章为学习笔记,若有不足之处还请指正