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());
- }
-
- }
- }
复制代码
|
|