[Java视频笔记]day14

来源:互联网 发布:18u网络机柜 编辑:程序博客网 时间:2024/06/05 09:26

为什么出现集合类?

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。

 

数组和集合类同是容器,有何不同?

数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。数组中可以存储基本对象类型,集合只能存储对象,对象可以不同。



1. add方法的参数类型是Object,以便于接收任意类型对象。

2. 集合中存储的都是对象的引用(地址)


什么是迭代器呢?

其实就是集合的取出元素的方式。



共性方法代码:

import java.util.*;class  day14{public static void main(String[] args) {method_get();}public static void method_get(){ArrayList al1 = new ArrayList();al1.add("java01");al1.add("java02");al1.add("java03");al1.add("java04");/*Iterator it = al1.iterator();//获取迭代器,用于取出集合中的元素while(it.hasNext()){sop(it.next());//获取每个元素}*///开发写下面这个  it这个对象用完就没了for(Iterator it = al1.iterator(); it.hasNext(); ){sop(it.next());}}public static void method_2(){ArrayList al1 = new ArrayList();al1.add("java01");al1.add("java02");al1.add("java03");al1.add("java04");ArrayList al2 = new ArrayList();//1.添加元素al2.add("java01");//add(Object obj)多态al2.add("java02");al2.add("java05");al2.add("java06");al1.retainAll(al2);//取交集,al1中只会保留和al2中相同的元素sop("al1:"+al1);//输出al1:[java01, java02]sop("al2:"+al2);//输出al2:[java01, java02, java05, java06]//al1.removeAll(al2);//取差集,把al2的元素从al1中去掉}public static void base_method(){//创建一个集合容器。使用Collection接口的子类,ArrayListArrayList al = new ArrayList();//1.添加元素al.add("java01");//add(Object obj)多态al.add("java02");al.add("java03");al.add("java04");//打印原集合sop(al);//输出 [java01, java02, java03, java04]//2.获取个数,集合长度sop("size : "+ al.size());//3.删除元素al.remove("java02");//al.clear();//清空集合//打印删除后集合sop(al);//输出[java01, java03, java04]//4.判断元素sop("java03是否存在:"+al.contains("java03")); //输出falsesop("集合是否为空:" + al.isEmpty());//输出false}public static void sop(Object obj){System.out.println(obj);}}

Collection下面

         |--List:元素是有序的(存的顺序和取得顺序一样,不是指里面的元素是有序的),元素可以重复。因为该集合体系有索引。

                   |--ArrayList:底层的数据结构使用的是数组数据结构。特点:查询速度块。增删慢。

                   |--LinkedList:底层使用的是链表数据结构。特点:增删很快,查询慢。

                   |--Vector:底层是数组数据结构。功能和ArrayList一样。不过是同步的,但ArrayList是不同步的.Vector被ArrayList替代了。

         |--Set:元素是无序的,元素不可以重复。

List:

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

增  :add(index,element);

       addAll(index, Collection);

 

删  : remove(index);

 

改  : set(index, element);

 

查  : get(index);

        subList(from, to);

        listIterator();

<span style="white-space:pre"></span>public static void method(){ArrayList al = new ArrayList();//添加元素al.add("java01");al.add("java02");al.add("java03");sop("原集合是: "+ al);//在指定位置添加元素al.add(1,"java09");sop(al);//输出[java01, java09, java02, java03]//删除指定位置的元素al.remove(2);sop(al);//输出[java01, java09, java03]//修改元素al.set(2, "java07");sop(al);//输出[java01, java09, java07]//通过角标获取元素sop(al.get(1));//输出java09//获取所有元素for(int x = 0; x < al.size(); x ++){sop("al("+ x +") = "+al.get(x));}//输出  al(0) = java01             // al(1) = java09              //al(2) = java07//或者Iterator it = al.iterator();while(it.hasNext()){sop(it.next());}//通过indexOf获取对象的位置sop("index = "+ al.indexOf("java07"));//输出index = 2//子列表List sub = al.subList(1,3);sop(sub);//输出[java09, java07]}

List集合特有的迭代器:ListIterator是Iterator的子接口。

在迭代时,不可以通过集合的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所以,在迭代时,只能用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断,取出,删除的操作。如果想要其它的操作如添加,修改等,就需要使用其子接口ListIterator,该接口只能通过List集合的listIterator方法获取。

 

List集合中都带有角标

import java.util.*;class  day14{public static void main(String[] args) {ArrayList al = new ArrayList();al.add("java01");al.add("java02");al.add("java03");/*//在迭代过程中,准备添加或者删除元素Iterator it = al.iterator();while(it.hasNext()){//sop(it.next());Object obj = it.next();if(obj.equals("java02"))//al.add"java08");不行,不能添加,有局限性it.remove();//将java02的引用从集合中删除了sop(obj);}*/ListIterator li = al.listIterator();while(li.hasNext()){Object obj = li.next();if(obj.equals("java02"))li.add("java09");//li.set("java06");//将java02修改为java09}sop(al);//输出[java01, java02, java09, java03]sop(li.hasNext());//输出falsesop(li.hasPrevious());//输出truewhile(li.hasPrevious()){sop(li.previous());//逆向遍历}}public static void sop(Object obj){System.out.println(obj);}}

Vector特殊的地方:

枚举就是Vector特有的取出方式。

发现枚举和迭代器很像。

其实枚举和迭代是一样的。为什么要出迭代呢?因为枚举的名称以及方法的名称都过长,所以被迭代器取代了。枚举被淘汰了。

 

LinkedList 特有方法

addFirst();

addLast();

 

getFirst();

getLast();

获取元素,但不删除,如果集合中没有元素,会出现NoSuchElementException异常

 

removeFirst();

removeLast();

获取元素,且删除该元素,如果集合中没有元素,会出现NoSuchElementException异常

 

在JDK 1.6出现了替代方法

offerFirst();

offerLast();

 

peekFirst();

peekLast();

获取元素,但不删除,如果集合中没有元素,会返回null

 

pollFirst();

pollLast();

获取元素,且删除该元素,如果集合中没有元素,会返回null

import java.util.*;class day13{public static void main(String[] args) {LinkedList link = new LinkedList();link.addFirst("java01");link.addFirst("java02");link.addFirst("java03");link.addFirst("java04");sop(link);//输出[java04, java03, java02, java01]sop(link.getFirst());//输出java04sop(link.getLast());//输出java01sop(link.removeFirst());//输出java04并删除sop(link.size()+"");//输出3while(!link.isEmpty()){sop(link.removeFirst());//输出每个元素,取出一个删除一个}}public static void sop(Object obj){System.out.println(obj);}}

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

堆栈:先进后出

队列:先进先出

import java.util.*;class Que{private LinkedList link;Que(){link = new LinkedList();}public void myAdd(Object obj){link.addFirst(obj);}public Object myGet(){return link.removeLast();//堆栈的话改成removeFirst()}public boolean isNull(){return link.isEmpty();}}class day13{public static void main(String[] args) {Que dl = new Que();dl.myAdd("java01");dl.myAdd("java02");dl.myAdd("java03");dl.myAdd("java04");sop(dl.myGet());//输出java01}public static void sop(Object obj){System.out.println(obj);}}

去除ArayList集合里的重复元素

import java.util.*;class day13{public static void main(String[] args) {ArrayList al = new ArrayList();al.add("java01");al.add("java02");al.add("java03");al.add("java04");al.add("java01");al.add("java02");al = singleElement(al);sop(al);//输出[java01, java02, java03, java04]}public static ArrayList singleElement(ArrayList al){ArrayList newAl = new ArrayList();Iterator it = al.iterator();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);}}

将自定义对象存储到ArrayList集合中,并去除重复元素

比如:人对象,同姓名同年龄,视为同一个人,为重复元素。

 

思路:

1.对人描述,将数据封装进人对象。

2.定义容器,将人存入。

3.去重。

 

List集合判断元素是否相同依据的是元素的equals方法。

remove 或 contains都依赖equals方法

import java.util.*;class Person{private String name;private int age;Person(String name, int age){this.name = name;this.age = age;}public boolean equals(Object obj)//重写equals方法{if(!(obj instanceof Person))return false;Person p = (Person)obj;return this.name.equals(p.name) && this.age == p.age;}public String getName(){return name;}public int getAge(){return age;}}class day13{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", 33)); al.add(new Person("lisi04", 34)); al.add(new Person("lisi02", 32));al.add(new Person("lisi04", 34));sop("remove 03 :"+ al.remove(new Person("lisi03", 33)));//remove底层也调用了equals方法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();Iterator it = al.iterator();while(it.hasNext()){Object obj = it.next();if(!newAl.contains(obj))//调用底层equals方法newAl.add(obj);}return newAl;}}

Set: 元素是无序(存入和取出的顺序不定一致),元素不可以重复。

Set集合的功能和Collection是一致的

常见的子类有:

HashSet: 底层数据结构是哈希表

TreeSet:  

import java.util.*;class day13{public static void main(String[] args) {HashSet hs = new HashSet();hs.add("java01");sop(hs.add("java01"));//输出false,添加失败,重复了hs.add("java02");hs.add("java04");hs.add("java03");Iterator it = hs.iterator();while(it.hasNext()){sop(it.next());}}public static void sop(Object obj){System.out.println(obj);}}

向HashSet里面存自定义对象(人)

姓名和年龄相同则视为同一个元素。

 

HashSet是如何保证元素的唯一性的呢?

是通过元素的两个方法,hashCode和equals来完成的。如果元素的hashCode值相同,才会判断equals是否为true。如果元素的hashCode不同,则不会调用equals.

开发的时候一般都会复写hashCode和equals

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法。先判断hashCode,再判断equals。 ArrayList只依赖equals.


import java.util.*;class Person{private String name;private int age;Person(String name, int age){this.name = name;this.age = age;}public int hashCode()//不要写成hasCode(){return name.hashCode() + age * 37;  //*37是为了hash值尽量不同}public boolean equals(Object obj)//重写equals方法,参数不要写成Person p,要复写{if(!(obj instanceof Person))return false;Person p = (Person)obj;return this.name.equals(p.name) && this.age == p.age;}public String getName(){return name;}public int getAge(){return age;}}class day13{public static void main(String[] args) {HashSet hs = new HashSet();hs.add(new Person("a1", 11));hs.add(new Person("a2", 12));hs.add(new Person("a3", 13));hs.add(new Person("a2", 12));//sop(hs.contains(new Person("a1", 11)));//输出true,先判断hash值,再判断equals//sop(hs.remove(new Person("a3", 13)));//输出trueIterator 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);}}











0 0
原创粉丝点击