《黑马程序员》java笔记->集合List中:ArrayList,LinkedList,及队列设计例子

时间:2022-04-08 19:36:36

------- android培训java培训、期待与您交流! ----------



public class ArrayListTest {



/**
* @param args
*/
public static void main(String[] args) {


/*
* 定义一个功能,去除ArrayList中的重复元素。

* 思路:
* 1,定义一个集合,用于存储唯一性的元素。
* 2,迭代已有的集合,将每一个迭代到的元素都到新集合中判断是否包含。
* 如果包含就不存储,如果不包含就存储到新集合中。
* 3,迭代结束,新集合中存储的都是不重复的元素。





* 注意:ArrayList判断元素是否相同使用的equals方法。
* 比如contains中就是依赖于equals方法。
* 或者remove方法都是依赖于equals方法。

* 尤其存储自定义对象时,该对象一定要覆盖equals方法,建立根据对象自身特点
* 的判断相同的依据。 
* equals就是用于比较对象的内容的。 

*/

ArrayList al = new ArrayList();
// al.add("abc1");
// al.add("abc2");
// al.add("abc1");
// al.add("abc2");
// al.add("abc1");
//存储自定义对象Person,如果姓名和年龄相同就是同一个对象。
al.add(new Person("lisi1",21));
al.add(new Person("lisi2",22));
al.add(new Person("lisi2",22));
al.add(new Person("lisi3",23));
al.add(new Person("lisi3",23));


System.out.println(al);

al = getSingleElmenetList(al);

System.out.println(al);
}


public static ArrayList getSingleElmenetList(ArrayList al) {

//1,创建一个新集合。
ArrayList temp = new ArrayList();

//2,迭代原集合。 
Iterator it = al.iterator();
while(it.hasNext()){
Object obj = it.next();

if(!temp.contains(obj)){//内部依赖的是equals方法。
temp.add(obj);
}

}

return temp;

}

-----------------------------------------------------------------------------------------------------

public class LinkedListTest {


/**
* @param args
*/
public static void main(String[] args) {



/*
* 介绍两种常见的数据结构。
* 1,队列: 先进先出。FIFO  first in  first out
* 2,堆栈: 后进先出。LIFO  Last in  first out

* 面试题:请用LinkedList模拟一个堆栈或者队列数据结构。

*/

//创建我的队列对象。
MyQueue myq = new MyQueue();

//给队列中添加元素。
myq.myAdd("abc1");
myq.myAdd("abc2");
myq.myAdd("abc3");
myq.myAdd("abc4");

while(!myq.isNull()){
System.out.println(myq.myGet());
}


}

----------------------------------------------------------------------------------

*
 * 自定义一种列队数据结构的容器。用LinkedList来完成。
 * 就将链表封装到该结构中,最为最基础结构存在。 
 */
public class MyQueue {


private LinkedList link = null;

public MyQueue(){
link = new LinkedList();
}

/**
* 往队列中添加元素。
*/
public void myAdd(Object obj){
//调用的是LinkedList的方法。
link.addLast(obj);
}

/**
* 获取队列中元素的方法。
*/
public Object myGet(){

return link.removeFirst();
}

/**
* 队列中是否为空。
*/
public boolean isNull(){
return link.isEmpty();
}

------------------------------------------------------------

/*
 * 要想让Person对象具备比较大小的功能。
 * 就需要对person对象进行功能的扩展。
 * 让Person去实现Comparable接口。让Person具备自然顺序。 覆盖compareTo方法。 
 * 
 */
public class Person implements Comparable {


private String name;
private int age;
public Person() {
super();

}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}

/**
* 覆盖Object类中的hashCode方法。建立Person对象自己特点的哈希值算法。
*/
public int hashCode(){
final int NUMBER = 27;

return name.hashCode() + age*NUMBER;//*27是为了尽量保证哈希值唯一。
}
/**
* 覆盖Object类中的equals方法,建立Person对象。
* 判断是否相同的依据。 根据Person自身的特点来判断。
*/
public boolean equals(Object obj){

if(!(obj instanceof Person))
return false;

Person p = (Person)obj;
// if(this.name.equals(p.name) && this.age==p.age)
// return true;
// return false;

return this.name.equals(p.name) && this.age == p.age;
}


/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {

return name+":"+age;
// return super.toString();
}
@Override
public int compareTo(Object o) {

/*
* 按照Person对象的年龄进行排序。从小到大。
*/

/*
* 进行对象比较的时候,通常,先比较主要条件,如果主要条件相同,在比较次要条件。
* 如果想要按照人的年龄排序,如果年龄相同,在比较一次姓名。
*/
//麻烦写法。
// Person p = (Person)o;
// if(this.age>p.age)
// return 1;
// if(this.age==p.age)
// return this.name.compareTo(p.name);
// return -1;


//技巧性写法。
Person p = (Person)o;
int temp = this.age - p.age;

return temp==0?this.name.compareTo(p.name):temp;


/*//这样判断就废了,因为人相同是根据同姓名和同年龄完成的。
 
Person p = (Person)o;
if(this.age>p.age)
return  1;
if(this.age<p.age)
return -1;
return 0;
*/

// return 1;//可以实现TreeSet,怎么存进去,怎么取出来。
}

}




class Person2{
private String name;;
private int age;
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person2 other = (Person2) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}


}