黑马程序员_集合框架

来源:互联网 发布:python 泛型编程 编辑:程序博客网 时间:2024/06/05 12:48
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

集合框架

(一)概述

  当我们存储多个基本数据时,我们会用到数组,当我们存储对象时该用什么呢?用的是集合,其实集合就是一种存放数据的容器类似数组,他和数组的不同之处在于,集合存放对象的引用并且长度是可变的,数组用来存放基本数据类型长度是固定的。

  集合可以看做是一个容器,如有一个人类,有一个书类,这两种类型完全不同,要把他们组织到一块怎么办呢,那就是利用集合中的对象,把他们放到集合中。Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法以方便用户对集合进行遍历、添加、删除以及查找指定对象,集合在java中时一个非常重要的概念。

 

(二)集合的分类

常用的集合有list集合、set集合、map集合,其中list集合和set集合继承了collection接口,集合类的关系如图

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

 

(三)List集合

特点:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。

List集合实现的方式有ArrayListLinkedList,那么这两种实现方式有什么区别呢?

ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。

LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。

arraylist代码演示:

数据先进先出

import java.util.ArrayList;import java.util.Iterator;import java.util.List; class People{private String name;private int age;public People(String name, int age) {//构造函数赋默认值super();this.name = name;this.age = age;}//以下为外部name 和age的方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}public class ListDemo {         public static void main(String[] args)  {        List list=new ArrayList();//可以改成LinkedList//list添加新元素        list.add(new People("name1", 18));        list.add(new People("name2", 50));        list.add(new People("name3", 15));        list.add(new People("name4", 29));        list.add(new People("name5", 28));        Iterator it=list.iterator();        while (it.hasNext()) {         People p=(People)it.next();System.out.println(p.getName()+"::"+p.getAge());//输出后发现与添加时候顺序一致}        }} 


(四)Set集合

特点:

Set:元素不可以重复,是无序,接口中的方法和Collection一致。

HashSet: 内部数据结构是哈希表 ,是不同步的。 如何保证该集合的元素唯一性呢?

是通过对象的hashCodeequals方法来完成对象唯一性的。

如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 

如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true

如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

注意:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。

一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equalshashCode方法。

建立对象判断是否相同的依据。

TreeSet:可以对Set集合中的元素进行排序。是不同步的。判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。

TreeSet对元素进行排序的方式一:

让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?可以使用TreeSet集合第二种排序方式二:

让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。将该类对象作为参数传递给TreeSet集合的构造函数。

 

覆盖hashcode方法代码:

 

import java.util.HashSet;import java.util.Iterator;import java.util.Set; class People {private String name;private int age;public People(String name, int age) {//构造函数super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//一下代码覆盖了people父类方法,填上之前与之后效果是不同的;@Overridepublic int hashCode() {return this.name.hashCode()+this.age*27;}}public class SetDemo {         public static void main(String[] args)  {        Set s=new HashSet();        s.add(new People("zhang3", 33));        s.add(new People("li4", 19));        s.add(new People("wang5", 31));        s.add(new People("xiao1", 30));        s.add(new People("ahua", 18));                //添加完元素之后利用迭代器输出                Iterator it=s.iterator();        while (it.hasNext()) {         People p=(People)it.next();System.out.println(p.getName()+"::"+p.getAge());}        }}  

 

 

 

 

 

 

 

继承comparable接口实现对treeset 排序的改变

 

 

import java.util.Iterator;import java.util.Set;import java.util.TreeSet; class People implements Comparable {//peopeo继承comparable接口并实现其方法private String name;private int age;public People(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int compareTo(Object o) {People p=(People) o;//return this.name.compareTo(p.name)==0?this.age-p.age:this.name.compareTo(p.name);//按照name进行比较//这次先比较年龄return this.age==p.age?this.name.compareTo(p.name):this.age-p.age;}}public class SetDemo {         public static void main(String[] args)  {        Set s=new TreeSet();        s.add(new People("zhang3", 33));        s.add(new People("li4", 19));        s.add(new People("zhang3", 31));        s.add(new People("xiao1", 30));        s.add(new People("ahua", 19));                //添加元素                Iterator it=s.iterator();        while (it.hasNext()) {         People p=(People)it.next();System.out.println(p.getName()+"::"+p.getAge());//发现元素与comparable接口内函数有关}        }} 

 

(五)Map集合

特点:

  一次添加一对元素,Collection 一次添加一个元素,Map也称为双列集合,Collection集合称为单列集合,其实map集合中存储的就是键值对,map集合中必须保证键的唯一性。 

Hashtable :内部结构是哈希表,是同步的。不允许null作为键,null作为值。

Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。 

HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。

TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。

 

 

Hashmap基本用法

import java.util.HashMap;import java.util.Iterator; class Student {private String name;private int age;public Student(String name, int age) {this.name=name;this.age=age;} public String getName() {return this.name;} public int getAge() {return this.age;} } public class MapDemo {     public static void main(String[] args)  {          HashMap<Student,String> hm = new HashMap<Student,String>();     //添加元素     hm.put(new Student("lisi",38),"北京");     hm.put(new Student("zhaoliu",24),"上海");     hm.put(new Student("xiaoqiang",31),"沈阳");     hm.put(new Student("wangcai",28),"大连");     hm.put(new Student("zhaoliu",24),"铁岭");      Iterator<Student> it = hm.keySet().iterator();    //迭代器输出     while(it.hasNext()){     Student key = it.next();     String value = hm.get(key);     System.out.println(key.getName()+":"+key.getAge()+"---"+value);     }            } } 


 

Treemap特性演示

 

 

import java.util.Comparator;import java.util.Iterator;import java.util.Map;import java.util.TreeMap; class Student {private String name;private int age;public Student(String name, int age) {this.name=name;this.age=age;} public String getName() {return this.name;} public int getAge() {return this.age;} }  class ComparatorByName implements Comparator<Student> { @Overridepublic int compare(Student o1, Student o2) {int temp = o1.getName().compareTo(o2.getName());return temp==0? o1.getAge()-o2.getAge(): temp;} }   public class MapDemo {     public static void main(String[] args)  {      TreeMap<Student,String> tm = new TreeMap<Student,String>(new ComparatorByName());tm.put(new Student("lisi",38),"北京");tm.put(new Student("zhaoliu",24),"上海");tm.put(new Student("xiaoqiang",31),"沈阳");tm.put(new Student("wangcai",28),"大连");tm.put(new Student("zhaoliu",24),"铁岭");//相同的值会被覆盖掉Iterator<Map.Entry<Student, String>> it = tm.entrySet().iterator();while(it.hasNext()){Map.Entry<Student,String> me = it.next();Student key = me.getKey();String value = me.getValue();System.out.println(key.getName()+":"+key.getAge()+"---"+value);}} } 

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -----
0 0
原创粉丝点击