A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

集合
1集合框架概述
集中中储存的都是对象的引用(地址)
为什么会出现这么多的容器呢?
因为每个容器对数据的存储方式都有所不同,这个存储方式称之为:数据结构

            
        







2  Collections
创建集合容器使用Collection接口的子类ArrayList

ArrayList a1 =new ArrayList();
2.1添加元素
a1.add(“java01”);
a1.add(“java02”);
2.1.1add方法的参数类型是Object,以便于接任意类型对象
2.1.2集合中存储的都是对象的引用(地址)
2.2获取个数,集合长度
a1.size();
2.3删除元素
a1.remove(“java01”);删除单个元素
a1.clear()//清空集合
2.4判断元素
a1.contains()
a1.isEmpty()
2.5交集
a1.retainAll(a2):取两个集合中相同的元素,然后放置回a1
A1.removeAll(a2):去除与a2交集的部分,然后放置回a1

2.6迭代器
Iterator it =a1.iterator();//获取迭代器用于取出集合中的元素
while(it.hasNext)//如果仍有元素可以迭代,返回true
{
it.next();//返回下一个元素
}
什么是迭代器:集合的取出元素的方式

取出方式可以直接访问集合的元素,所以取出方法定义在集合的内部
因此取出方式就被定义为内部类
而每个容器数据结构不同
所以取出的动作细节也都不一样,但是都有共性内容:判断和取出,可以共性抽取
因此这些内部类都符合一个规则,该规则就是Iterator,并通过一个对外提供的方法iterator()方法来获取集合的取出对象

3.List
Collction
   |--List: 元素时有序的,元素可以重复,因为该集合体系有索引
   |--Set:元素是无序的,元素不可以重复

List:特有方法,凡是可以操作角标的方法都是该体系特有的方法

增:
add(index,element);
addAll(index,Collection);

删:
remove(index);

改:
set(index,element);

查:通过角标获取元素
get(index);
subList(from,to);
listIterator();列表迭代器

For遍历:
for (int x=0;x<a1.size();x++)
{
sop(a1.get(x));
}
迭代器:
Iterator it =a1.iterator();
while(it.hasNext()){
sop(it.next())
}

listIterator();列表迭代器
在迭代时,不可以通过集合对象的方法操作集合中的元素(不能增删等)
因为会发生异常
所以在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的
只能对元素进行判断,取出,删除等的操作
如果想要对其他的操作如添加,修改等,就需要使用其子接口,ListIterator
该接口具备删除remove,添加add,修改set等功能,但此功能是List特有的
ListIterator列表迭代器,是List集合持有的迭代器,是Iterator的子接口。

逆向遍历
it.hasPrevious() 查询前一个是否有元素
It.previous()

4.List集合中的对象
ArrayList:底层数据结构使用的数组结构。特点:查询速度很快,但是增删稍慢,不同步的(默认长度为10,超过就new一个新的元素,50%的延长)
LinkedList:底层使用的链表结构。特点:增删速度快,但是查询稍慢,不同步
Vector:底层使用的数组结构,同步的(默认长度为10,超过100%的延长)

1.Vecter使用:
Vector v =new Vector();
v.add(“Java01”);
v.add(“Java02”);

Enumeration en=v.elements();
While(en.hasMoreElements())
{
en.nextElement();
}
枚举:就是Vecor特有的取出方式,枚举和迭代器是十分类似的

2.LInkedList:特有方法

addFirst():从头部开始添加
addLast():从尾部开始添加

getFirst():只获取头值
getLast():只获取尾值

removeFirst():获取头元素,同时 元素被删除
removeLast():获取尾元素,同时,元素被删除

如果LinkedList内无元素,get或者remove,会出现NoSuchElementException

JDk1.6出现替代方法

添加
offerFirst()
offerLast()
获取
peekFirst()
peekLast()
获取元素,但是不删除元素,如果集合中没有元素,就会返回null
删除
pollFirst()
pollLast()
获取元素,同时删除元素,如果集合中没有元素,就会返回null

LinkedLisr练习:

使用LinkedList模拟一个堆栈或者队列数据结构

堆栈:先进后出,如同一个杯子
队列:先进先出,如同一个水管

例:
Import java.util.*
Class Queue
{
Private LinkedList link;
Queue()
{
Link=new LinkedList();
}
Public void myAdd(Object obj)
{
link.addFirst(obj);
}
Public Object myGet()
{
return link.removeLast();//removeLast队列,removeFirst 堆栈
}
Public boolean isNull()
{
Return link.isEmpty();
}
}

Class LinkedListTest
Public static void main(String[] args)
{
Queue q1=new Queue();
q1.myAdd(“java01”);
q1.myAdd(“java02”);
q1.myAdd(“java03”);
q1.myAdd(“java04”);
While(!q1.isNull)
System.out.println(q1.myGet());
}



ArrayList练习一:

去除ArrayList中的重复元素
import java.util.*;
class ArrayListTest
{
        public static void main(String[] args)
        {
                ArrayList al=new ArrayList();
                al.add("java01");
                al.add("java02");
                al.add("java01");
                al.add("java03");
                al.add("java01");
                al.add("java01");
                sop(al);

                al=singleElement(al);
                sop(al);
        }

        public static ArrayList singleElement(ArrayList al)
        {
                ArrayList newAl= new ArrayList();
                ListIterator it=al.listIterator();
                while (it.hasNext())
                {
                        Object obj=it.next();
                        if (!newAl.contains(obj))
                        {
                                newAl.add(obj);
                        }
                }
                return newAl;
        }

        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}


public static ArrayList singleElement(ArrayList al)
        {
                ArrayList newAl= new ArrayList();
               
                ListIterator it=al.listIterator();
               
                while (it.hasNext())
                {
                        Object obj=it.next();
                        if (!newAl.contains(obj))
                        {
                                newAl.add(obj);
                        }
                }
                return newAl;
        }



import java.util.*;
/*
将自定义对象当做元素传入ArrayList集合中,并去除重复元素
比如,人作为对象,拥有相同名字和年龄的人视为同一个人
*/
class ArrayListTest2
{
        public static void main(String[] args)
        {
                ArrayList al=new ArrayList();

                al.add(new Person("lisi01",30));
                al.add(new Person("lisi02",32));
                al.add(new Person("lisi03",34));
                al.add(new Person("lisi04",35));
                al.add(new Person("lisi01",30));
                al.add(new Person("lisi02",32));

                //sop(al);//[Person@659e0bfd]
                al=singleElement(al);
                Iterator it =al.iterator();

                while (it.hasNext())
                {
                        Person p=(Person) it.next();
                        sop(p.getName()+"--"+p.getAge());
                }
        }

        public static ArrayList singleElement(ArrayList al)
        {
                ArrayList newAl= new ArrayList();
               
                ListIterator it=al.listIterator();
               
                while (it.hasNext())
                {
                        Object obj=it.next();
                        if (!newAl.contains(obj))
                        {
                                newAl.add(obj);
                        }
                }
                return newAl;
        }

        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}


class Person
{
        private String name;
        private int age;

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

        public  String getName()
        {
                return name;
        }

        public  int getAge()
        {
                return age;
        }

        public boolean equals(Object obj)//contains底层调用的是equals方法,覆盖equals方法
        {
                if(!(obj instanceof Person))

                   return false;

                Person p=(Person) obj;

                return this.name.equals(p.name) && this.age==p.age;//比较是否是同一个的名字和年龄
      
        }
}


5 set
Set:元素是无序(存入和取出的顺序是不一定一致的)的,元素不可以重复
  |--HashSet:底层数据结构是哈希表
           HashSet是如何保证元素的唯一性的那?
           是通过元素的两个方法,hashcode和equals来完成的
           如果元素的hashcode是一致的,才会判断equals是否为true
           如果元素的hashcode值不同,就不会调用equals
           对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法
  |--TreeSet

Set集合的功能和Collection是一致的
/*
将自定义对象当做元素传入HashSet集合中
比如,人作为对象,拥有相同名字和年龄的人视为同一个人
*/
import java.util.*;
class HashSetTest
{
        public static void main(String[] args)
        {

                HashSet hs=new HashSet();
                hs.add(new Person("lisi01",30));
                hs.add(new Person("lisi02",32));
                hs.add(new Person("lisi03",34));
                hs.add(new Person("lisi04",35));
                hs.add(new Person("lisi04",35));
                hs.add(new Person("lisi02",32));

                //sop(al);//[Person@659e0bfd]
               
                Iterator it =hs.iterator();

                while (it.hasNext())
                {
                        Person p=(Person) it.next();
                        sop(p.getName()+"--"+p.getAge());
                }
        }

        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}


class Person
{
        private String name;
        private int age;

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

        public  String getName()
        {
                return name;
        }

        public  int getAge()
        {
                return age;
        }

        public int hashCode()
        {
                System.out.println(this.name+"--hashcode");

                return name.hashCode()+age*39;       
        }

        public boolean equals(Object obj)//contains底层调用的是equals方法,覆盖equals方法
        {
                if(!(obj instanceof Person))

                   return false;

                Person p=(Person) obj;

                System.out.println(this.name+"--equals--"+p.name);

                return this.getName().equals(p.getName()) && this.age==p.age;//比较是否是同一个的名字和年龄
      
        }
       
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马