[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);}}
- [Java视频笔记]day14
- JAVA视频笔记(day14)
- 传智播客-Java学习笔记day14
- day14-笔记
- day14笔记
- day14笔记
- java学习笔记(精华)day14总结
- 21天学通Java学习笔记-Day14(Tomcar-Servlet-JSP)
- Java基础:Day14笔记内容 ( StringBuilder类)
- 正则表达式、Math、SimpleDateFromat、Calendar类+JAVA学习笔记-DAY14
- C++学习笔记 day14
- PHP笔记10-day14
- day14笔记-api
- 夜灵的Html笔记Day14——H5新表单、视频音频
- java学习day14
- JAVA - day14 -1
- java学习day14
- day14/ArrayListTest2.java
- 最长上升子序列 (Longest Increasing Subsequence, 常简称为 LIS)
- 返回到上一页的html代码的写法2
- Hexo 我的博客
- React-Natvie 介绍大全
- 自定义字符串加密
- [Java视频笔记]day14
- 欢迎使用CSDN-markdown编辑器
- 自定义可设置每行最多显示数目,每个子View宽度等分的FlowView
- mysql的查询、子查询及连接查询
- 找出一组数中指出现一次的数2
- P1071 LCIS 最长公共上升子序列
- linux文件描述符和套接字的问题
- 下面介绍几种查看linux版本信息的方法和GCC版本
- Python 通过调用接口获取公交信息