黑马程序员--集合框架、Collection集合
来源:互联网 发布:桌面定时提醒软件 编辑:程序博客网 时间:2024/05/17 07:28
------- android培训、java培训、期待与您交流! ----------
第一节--集合框架
集合是什么?
集合是一种容器,可以用来存储对象。
在开发过程中需要创建很多对象,为了方便对众多的对象进行操作,按照面向对象的思想,java提供了容器对对象进行存储和操作,集合就是最常用的容器。
集合和数组有什么区别?
数组也是一种容器,和集合的区别:
1、数组长度是固定的,既可以存储基本数据也可以存储对象(其实是对象的引用)
2、集合长度是可变的,只能存储对象
开发过程中需要的对象个数是不确定的,所以最常用集合来存储
集合容器有很多种,是因为容器对数据的存储方式即底层数据结构不同,有各自的特点,但既然都是容器,就会有共性内容,将这些共性内容不断抽取并封装,就形成了集合体系。
第二节--Collection接口
Collection是集合框架中的常用接口。其下有两个子接口:List,Set
所属关系:
Collection
|--List,集合中元素有序,可重复,因为有脚标
|--Set,集合中元素无序(存入和取出顺序不一定一致),不可重复
1、Collection接口中常用的操作
添加
add(Object obj); add方法的参数类型是Object。以便于接收任意类型对象。
删除
remove(Object obj);
removeAll(另一集合);调用者只保留另一集合中没有的元素。
clear();清空集合
判断
contains(Object obj);判断是否存在obj这个元素
isEmpty();是否为空
获取集合长度
size();
取交集
retainAll(另一集合);调用者只保留两集合的共性元素。
/* * collection是存储对象的常用集合,他有两个子接口:list和set。 * collection接口中常用的方法 */public class CollectionDemo {public static void main(String[] args) {ArrayList arr = new ArrayList();//添加元素arr.add("java01");arr.add("java02");sop("添加"+arr);//删除元素arr.remove("java01");sop("删除"+arr);arr.clear();sop("清空"+arr);//判断sop(arr.isEmpty());sop(arr.contains("java02"));//获取sop(arr.size());//取交集:retainAll();}//封装打印功能public static void sop(Object obj){System.out.println(obj);}}
2、Iterator
/* * Iterator是取出集合元素的方式。 * 取出集合元素的功能一个函数无法完成,需要几个函数才能实现,将集合元素的取出 * 方式封装成对象,定义在集合内部,可以直接访问集合内部成员。取出方式就定义 * 成了集合类的内部类。 * 而集合中存储元素数据结构不同,那么取出动作细节也不同,但都有共性内容: * 判断和取出。将共性内容抽象出来,就有了Iterator接口。collection接口实现了 * Iterator接口,提供了获取迭代器对象的方法,iterator();所以collection接口的 * 子类都有迭代器。 * 迭代器中的方法: * hasNext();判断是否有下一个元素,有就返回真 * next();获取元素。每一次获取之前都要先判断 * remove();移除元素 * 迭代器的使用:取出集合ArrayList中元素 */public class IteratorDemo {public static void main(String[] args) {ArrayList arr = new ArrayList();arr.add("java01");arr.add("java02");arr.add("java03");//迭代方式一//Iterator iter = arr.iterator();//while(iter.hasNext())//迭代方式二//for(Iterator iter = arr.iterator();iter.hasNext();)//sop(iter.next());//List特有取出方式int x = 0;while(x<arr.size())sop(arr.get(x++));}public static void sop(Object obj){System.out.println(obj);}}
第三节--List接口
List中的元素有序的,可重复的,因为元素有脚标
List接口常用子类
List
|——ArrayList:底层是数组结构,线程不同步,查询快,增删慢
|——LinkedList:底层是链表结构,线程不同步,增删快,查询慢
|——Vector:底层是数组结构,线程同步,效率低,被ArrayList取代
1、List中特有的方法
增
add(index,element);在指定位置添加元素
addAll(index,Collection);在指定位置添加另一个集合的元素
删
remove(index);删除指定脚标的元素
改
set(index,element);更改指定脚标的元素
查
get(index);根据指定脚标获取元素
subList(from,to);获取脚标从from到to的子集合
listIterator();List特有的迭代器
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();获取listIterator
与操作脚标相关的方法都是List特有的方法
2、listItrator
/* * ListIterator是Iterator的子接口,List实现了这个接口。 * 在集合中使用迭代器取出元素时,不能同时用集合的方法对元素进行操作,因为会 * 发生并发操作异常。但Iterator中的方法只有判断获取和移除,没有添加,修改等 * 操作,ListIterator继承并扩展了Iterator接口的,提供了添加,修改等操作, * List实现了ListIterator接口。 * ListIterator特有的方法: * add(Object obj);添加 * set(Object obj):修改,将obj替换为next()或previous()获取的最后一个元素 * hasPrevious():判断前一个元素是否存在 * previous():获取前一个元素 * 演示ListIterator特有的方法 */public class ListIteratorDemo {public static void main(String[] args) {ArrayList<String> arr = new ArrayList();arr.add("java01");arr.add("java02");arr.add("java03");arr.add("java04");for(ListIterator<String> liter = arr.listIterator();liter.hasNext();){String s = liter.next();//next()默认方法返回值类型是Objectif(s.equals("java04")){liter.set("Hello World");liter.add("I Love You!");}}sop(arr);}public static void sop(Object obj){System.out.println(obj);}}
3、LinkedList特有的方法
添加
addFirst();
addLast();
获取
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
删除
removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
添加
offerFirst();
offerLast();
获取
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
删除
pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。
/* *练习:使用LinkedList模拟堆栈和队列: * 堆栈:后进先出,进出为同一个口,像杯子 * 队列:先进先出,有进出两个口,像一个水管 */public class LinkedListDemo {public static void main(String[] args) {LinkedList link = new LinkedList();//从首位开始添加link.addFirst("java01");link.addFirst("java02");link.addFirst("java03");link.addFirst("java04");//stack(link);duilie(link);}//模拟队列,从末位开始移除public static void stack(LinkedList link){while(!link.isEmpty())sop(link.removeLast());}//模拟堆栈,从首位开始移除public static void duilie(LinkedList link){while(!link.isEmpty())sop(link.removeFirst());}public static void sop(Object obj){System.out.println(obj);}}
第四节--Set接口
Set中的元素是无序的(添加和取出的顺序不一定一致),不可以重复的
Set
|——HashSet
|——TreeSet
HashSet:
底层为哈希表存储结构,线程不同步,按哈希值的大小排序。保证集合中元素
唯一依据的是hashCode和equals()方法。先判断hashCode是否相等,若不等,则元素不同,若相等,再
使用equals方法判断对象是否相同。
<pre name="code" class="java">/* *练习:使用HashSet存储自定义对象 *思路:HashSet判断元素是否相同的依据是hashCode和equals方法 * 定义Person类,有姓名和年龄属性,姓名和年龄都一样视为同一人,复写Object * 的hashCode和equals方法,姓名的哈希值与年龄的和相等则元素的哈希值相等 * 姓名和年龄都相同,则为同一对象,即equals()方法为true,取出元素并打印 * */public class HashSetDemo {public static void main(String[] args) {HashSet<Person> hset = new HashSet<Person>();//HashSet集合判断元素是否相同,底层依据的是hashCoad()和equals()hset.add(new Person("zhangsan",20));hset.add(new Person("wangsan",22));hset.add(new Person("lili",18));hset.add(new Person("zhangsan",20));getOut(hset);}//迭代式一定记得next()方法的返回值类型是Object!!!如果没使用泛型,一定记得转型!!!public static void getOut(HashSet<Person> hset){for(Iterator<Person> iter = hset.iterator();iter.hasNext();){Person p = iter.next();System.out.println("姓名:"+p.getName()+'\t'+"年龄:"+p.getAge());}}}class Person{private String name;private int age;Person(String name,int age){this.name = name;this.age = age;}//public void setName(String name){//this.name = name;//}//public void setAge(int age){//this.age = age;//}public String getName(){return name;}public int getAge(){return age;}public int hashCode(){return this.name.hashCode()+this.age;}public boolean equals(Object obj){if(!(obj instanceof Person))//equals方法参数是Object类型,所以先判断return false;Person p = (Person)obj;return this.name.equals(p.name)&&this.age==p.age;}}
TreeSet:
底层为二叉树存储结构,默认按字母排序,即自然顺序。保证集合中元素唯一的
依据是compareTo和return 0;
set集合的功能和collection一致
/* * TreeSet集合可以对元素进行排序,底层数据结构是二叉树 * 第一种排序方式:让元素自身具备比较性:元素自身实现comparable接口,复写comparaTo方法, * 定义比较规则,首要条件相同,比较次要条件。很多类实现了comparable接口,自身具备 * 比较性,例如String类。这种排序方式的结果叫自然顺序,或默认排序 * 练习:使用TreeSet存储自定义对象。 * 思路:定义Person类,有name和age属性。实现comparable接口,复写comparaTo方法,年龄为首要 * 比较条件,姓名为次要比较条件,姓名和年龄相同视为同一人。 */public class TreeSetDemo {public static void main(String[] args) {//TreeSet hs = new TreeSet(new myComparator());TreeSet hs = new TreeSet();hs.add(new Person01("xiaoming01",12));hs.add(new Person01("xiaoming02",23));hs.add(new Person01("xiaoming03",29));hs.add(new Person01("xiaoming04",19));hs.add(new Person01("xiaoming05",29));getOut(hs);}public static void getOut(TreeSet hs){for(Iterator iter = hs.iterator();iter.hasNext();){Person01 p = (Person01)iter.next();System.out.println("name:"+p.getName()+'\t'+"age:"+p.getAge());}}}class Person01 implements Comparable{private String name;private int age;Person01(String name,int age){this.name = name;this.age = age;}public String getName(){return name;}public int getAge(){return age;}@Overridepublic int compareTo(Object obj) {if(!(obj instanceof Person01))throw new RuntimeException("非人类对象");Person01 p = (Person01)obj;if(this.age > p.age)return 1;if(this.age == p.age){return (this.name).compareTo(p.name);}else return -1;}}/* * 第二种排序方式:让集合自身具备比较性。当元素自身不具备比较性,或者是元素自身的比较性 * 不是所需要的时候,可以让集合初始化时具备比较功能。具体做法是:定义一个类(比较器)实现 * comparator接口,复写其compara(o1,o2),创建比较器对象,作为实际参数传递给集合构造函数, * 是集合对象创建时具备比较器.o1,o2是集合中的元素 * 练习:将Person01类按姓名排序,姓名相同再按年龄排序 */class myComparator implements Comparator{@Overridepublic int compare(Object o1, Object o2) {Person01 p1 = (Person01)o1;Person01 p2 = (Person01)o2;int num = p1.getName().compareTo(p2.getName());if(num == 0){return (new Integer(p1.getAge()).compareTo(new Integer(p2.getAge())));//if(p1.getAge()>p2.getAge())//return 1;//else if(p1.getAge()<p2.getAge())//return -1;//else return 0;}return num;}}
- 黑马程序员--集合框架(collection)
- 黑马程序员--集合框架、Collection集合
- 黑马程序员--集合框架(Collection集合)
- 黑马程序员五、集合框架Collection
- 黑马程序员_集合框架 Collection
- 黑马程序员——集合框架-Collection
- 黑马程序员_集合框架Collection
- 黑马程序员_集合框架(Collection,Iterator)
- 黑马程序员-集合框架之Collection
- 黑马程序员-集合框架之Collection
- 【黑马程序员】java中----------Collection集合框架
- 黑马程序员 Java集合框架Collection
- 黑马程序员_集合框架Collection
- 黑马程序员-------集合框架Collection List
- 黑马程序员【Java集合框架(上)Collection】
- 黑马程序员_集合框架Collection
- 黑马程序员——集合框架Collection
- 黑马程序员——集合框架-Collection
- JAVA : reference
- Eclipse调试Bug的七种常用技巧
- Spring data JPA中使用Specifications动态构建查询
- 【web++_第三阶段_SpringMVC初级进阶(第一篇:必看)】SpringMVC初级进阶(第一篇:必看)_2
- 【阅读】《head first jquery》(第十章)——jquery UI
- 黑马程序员--集合框架、Collection集合
- 一个简单的网页布局HTML+CSS
- 分享一下嵌入式产品安全保护的措施
- NYOJ 无主之地 845
- xcode armv6 armv7 armv7s arm64
- 利用XRDP远程登陆linux系统
- 端口
- linux下vim中文乱码的解决方法以及vim多字节编码机制的工作流程
- 关于_ATL_MIN_CRT引出的问题