黑马程序员技术交流社区
标题:
自学day14List和Set集合
[打印本页]
作者:
牛德阳
时间:
2015-12-26 23:02
标题:
自学day14List和Set集合
List:元素存入和取出的顺序是一致的,元素都有索引,元素可以重复
| --ArrayList: 底层的数据结构是数组, 线程不同步, ArrayList 替代了 Vector,
查询元素的速度非常快
。
| --LinkedList: 底层的数据结构是链表, 线程不同步,
增删元素的速度非常快
。
| --Vector: 底层的数据结构就是数组,
线程同步的
, Vector 无论查询和增删都巨慢。
List集合的特点是该集合所有方法都有索引
主要方法有添加,删除,获取和修改
集合引用和迭代器引用在同时操作元素, 通过集合获取到对应的迭代器后 在迭代中进行集合引 用的元素
添加, 迭代器并不知道, 所以会出现异常情况。因此 是List 集合特有迭代器ListIterator接口,它 具备了对元素的增、 删、 改、 查的动作。
LinkedList模拟堆栈和队列的数据结构:
package day14;
import java.util.LinkedList;
/*使用LinkedList模拟堆栈和队列的数据结构
1、堆栈先进后出
2、队列先进先出*/
public class LinkListdemo {
public static void sop( Object o)
{
System.out.println(o);
}
public static void main(String[] args)
{
LinkedList ll=new LinkedList();
ll.addFirst("java01");
ll.addFirst("java02");
ll.addFirst("java03");
sop(ll);
复制代码
对于 list 集合, 底层判断元素是否相同, 其实用的是元素自 身的 equals 方法完成的。 所以建议元素都
要复写 equals 方法, 建立元素对象自己的比较相同的条件依据。
例如:将自定义对象做为元素 传入ArrayList集合中去除重复的元素,
比如人的年龄姓名相同则视为重复元素
public class Arraylistdemo2 {
public static void sop( Object o)
{
System.out.println(o);
}
public static ArrayList getArray(ArrayList al)//定义方法用于获取一个存储不重复元素集合的方法
{
ArrayList a2=new ArrayList();//定义新集合
Iterator it=al.iterator();
while(it.hasNext())
{
Object obj=it.next();
if(!(a2.contains(obj)))//判断新集合中是否包含此元素
a2.add(obj);//若不包含则存入
}
return a2;
}
public static void main(String[] args) {
ArrayList al=new ArrayList();
al.add(new person("java1",1));
al.add(new person("java1",1));
al.add(new person("java2",2));
al.add(new person("java2",2));
al.add(new person("java3",3));
al.add(new person("java3",3));
al.add(new person("java4",4));
al=getArray( al);
Iterator it=al.iterator();
while(it.hasNext())
{
Object obj=it.next();
person p=(person)obj;
sop(p.getAge()+"......"+p.getName());//打印元素信息
}}}
复制代码
<div class="blockcode"><blockquote>package day14;
public class person {
private String name;
private int age;
public person(String name,int age){
this.name=name;
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int hashCode()
{
System.out.println(this.name+"-------hashcode");
return this.name.hashCode()+this.age;
}
public boolean equals(Object obj)//重写equals方法,主函数调用contains(obj)方法时会自动调用元素的equals方法进行比较
{
if(!(obj instanceof person))
return false;
person p=(person)obj;
System.out.println(this.name+"---equals---"+p.name);
return this.name.equals(p.name)&&this.age==p.age;
}
}
复制代码
HashSet: 底层数据结构是哈希表, 线程是不同步的。 无序, 高效;
HashSet 集合保证元素唯一性: 通过元素的 hashCode 方法和equals方法完成的。
当元素的 hashCode 值相同时, 才继续判断元素的 equals 是否为 true。如果为 true, 那么视为相同元素, 不存。 如果为 false, 那么存储。如果 hashCode 值不同, 那么不判断 equals, 从而提高对象比较的速度。
<blockquote>package day14;
复制代码
package day14;
public class person {
private String name;
private int age;
public person(String name,int age){
this.name=name;
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int hashCode()//重写hashCode()方法
{
System.out.println(this.name+"-------hashcode");
return this.name.hashCode()+this.age;
}
public boolean equals(Object obj)//重写equals方法,主函数调用contains(obj)方法时会自动调用元素的equals方法进行比较
{
if(!(obj instanceof person))
return false;
person p=(person)obj;
System.out.println(this.name+"---equals---"+p.name);
return this.name.equals(p.name)&&this.age==p.age;
}
}
复制代码
TreeSet 集合排序有两种方式, Comparable 和 Comparator 区别:
1: 让元素自 身具备比较性, 需要元素对象实现 Comparable 接口 , 覆盖 compareTo 方法。
2: 让集合自 身具备比较性, 需要定义一个实现了 Comparator 接口 的比较器, 并覆盖 compare 方法, 并将
该类对象作为实际参数传递给 TreeSet 集合的构造函数。当两者同时存在时以第二种为主
package day14;
public class Student implements Comparable {//实现Comparable接口对象强制排序
private String name;
private int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int compareTo(Object o) {//复写compareTo方法
if(!(o instanceof Student))
throw new RuntimeException("不是学生对象");
Student s=(Student)o;
System.out.println(this.name+"::"+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age){
return this.name.compareTo(s.name);//返回1表示this大于s,返回0表示对象相等
}
return -1;
}
}
复制代码
package day14;
import java.util.Comparator;
public class myCompare implements Comparator//定义比较器
{
@Override
public int compare (Object o1,Object o2)//重写compare方法
{
Student s1=(Student)o1;
Student s2=(Student)o2;
int num=s1.getName().compareTo(s2.getName());
if(num==0)
{
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
}
return num;
}
}
复制代码
package day14;
import java.util.Iterator;
import java.util.TreeSet;
public class treesetdemo1 {
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args) {
TreeSet ts=new TreeSet(new myCompare());//构造方法传入比较器
ts.add(new Student("ts1",1));
ts.add(new Student("ts3",3));
ts.add(new Student("ts2",2));
ts.add(new Student("ts4",2));
ts.add(new Student("ts1",1));
Iterator it=ts.iterator();
while(it.hasNext())
{
Object obj=it.next();
Student s=(Student)obj;
sop(s.getName()+"-----"+s.getAge());
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2