java的框架和集合

来源:互联网 发布:圣剑网络 奥特曼 编辑:程序博客网 时间:2024/05/22 20:57

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一:java框架集合的由来:</span>

对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。

就使用集合容器进行存储。java集合可以保存具有映射关系的关联数组,集合容器因为内部的数据结构不同,有多种具体容器。
不断的向上抽取,就形成了集合框架。所有的集合都位于java.util包下

二:java集合的特点:

集合特点:
1,用于存储对象的容器。
2,集合的长度是可变的,这一点是与数组不同的
3,集合中不可以存储基本数据类型值。 、

4,集合可以存储具有映射关系的数据

三:java集合可以分为三大体系

Collection(List 、Set)、Map

List:代表有序、重复的集合

Set:代表无序、不重复的集合

Map:代表有映射关系的集合

3.比较

  是否有序是否允许元素重复Collection否是List是是SetAbstractSet否否 HashSet TreeSet是(用二叉排序树)MapAbstractMap否使用key-value来映射和存储数据,key必须唯一,value可以重复 HashMap TreeMap是(用二叉排序树)

 



说明:实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。

四:Collection

4.1 Collection接口的基本方法

Collection接口是List、Set、Queue的父接口,所以Collection里面定义的方法在List、Set里面都是使用的;

对于学习Collection接口的基本方法,查API还是特别的重要

Collection的基本方法包括:

1:添加

boolean add(Object obj)添加一个类元素到集合对象中去

boolean addAll(Collection coll);把一个集合添加到集合中去;

2:删除

boolean remove(Object obj);删除指定的元素

boolean removeAll(Collection coll); 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

void clear()删除集合中的所有的元素;

3:判断:

boolean contains(object obj);判断集合中是否包含某元素;

boolean containsAll(Collection coll);判断此集合中是否包含指定集合中的元素;

boolean retainAll(Collection coll);仅保留与指定集合中相同的元素;

boolean isEmpty(Collection coll);判断集合中的元素是否为空;

boolean equals(Object obj):判断此对象是否与指定的对象相同;

int 

4:获取:

Iterator iterator();:取出元素的方式:迭代器。

返回在此Collection集合上进行迭代的迭代器,用于遍历集合中的元素;

int hashCode()返回此Collection的哈希值码

该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。
所以该迭代器对象是在容器中进行内部实现的。
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,
也就是iterator方法。

5:其他

Object[] toArray():将集合转成数组。 


4.2List集合

1:List是有序的,而且允许集合中的元素重复

2:list集合是可以完成对元素的增删改查。

List:特有的常见方法:有一个共性特点就是都可以操作角标。

1,添加
void add(index,element);
void add(index,collection);
2,删除;
Object remove(index):
3,修改:
Object set(index,element);
4,获取:
Object get(index);
int indexOf(object);返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
int lastIndexOf(object);返回此列表中最后一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
List subList(from,to); 返回列表中指定的fromIndex(包括 )和 toIndex(不包括)之间的部分视图
list集合是可以完成对元素的增删改查。

public class ListDemo {/** * @param args */public static void main(String[] args) {List list = new ArrayList();show(list);}public static void show(List list) {//添加元素list.add("abc1");list.add("abc2");list.add("abc3");System.out.println(list);//插入元素。//list.add(1,"abc9");//删除元素。//System.out.println("remove:"+list.remove(2));//修改元素。//System.out.println("set:"+list.set(1, "abc8"));//获取元素。//System.out.println("get:"+list.get(0));//获取子列表。//System.out.println("sublist:"+list.subList(1, 2));System.out.println(list);}}

List:
|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!
|--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。
|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。
Vector中特有的:

Enumeration<E>elements()
          返回此向量的组件的枚举。

这方法相当于是iterator

Vector是jdk1.0版本就已经存在了了,但是由于增删,查询的速度很慢所以现在一般都不用

ArrayList允许有重复的元素,而且在用ArrayList进行输出的时候sys0(会自动的)进行Tostring()类型的转化;

p<span style="font-size:18px;">ackage cn.itcast.p4.ArrayList;import java.util.ArrayList;import java.util.Iterator;import cn.itcast.pb.bean.Person;public class ArrayListTest {public static void main(String[] args) {// TODO Auto-generated method stubArrayList a1=new ArrayList();a1.add(new Person("zhangsan",24));a1.add(new Person("lisi",23));a1.add(new Person("wangwu",26));a1.add(new Person("zhaoliu",28));a1.add(new Person("xiaoqiang",29));Iterator it = a1.iterator();while(it.hasNext()){//System.out.println(((Person) it.next()).getName()+"::"+((Person) it.next()).getAge());Person p = (Person) it.next();System.out.println(p.getName()+"--"+p.getAge());}}}</span>

4.2Set集合

4.2.1:hashSet集合是无序的,但是不允许有重复的元素;

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null 元素。 

4.2.2LinkedhashSet

此类实现的是有序的set集合;

4.2.3hashSet集合中添加的自定义类型的变量时候需要复写hashcode和equals方法;

HashSet: 内部数据结构是哈希表 ,是不同步的。
如何保证该集合的元素唯一性呢?
是通过对象的hashCode和equals方法来完成对象唯一性的。
如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 
如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

package cn.itcast.p4.hashset.test;import java.util.HashSet;import java.util.Iterator;import cn.itcast.p.bean.Person;/* * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 */public class HashSetTest {/** * @param args */public static void main(String[] args) {HashSet hs = new HashSet();/* * HashSet集合数据结构是哈希表,所以存储元素的时候, * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。 *  */hs.add(new Person("lisi4",24));hs.add(new Person("lisi7",27));hs.add(new Person("lisi1",21));hs.add(new Person("lisi9",29));hs.add(new Person("lisi7",27));Iterator it = hs.iterator();while(it.hasNext()){Person p = (Person)it.next();System.out.println(p);//System.out.println(p.getName()+"...."+p.getAge());}}}

package cn.itcast.pb.bean;public class Person {private String name;private int age;public Person() {super();// TODO Auto-generated constructor stub}<span style="color:#ff0000;"><strong>public int hashCode() {//System.out.println(this+".......hashCode");return name.hashCode()+age*27;//return 100;}</strong></span>@Override<span style="color:#ff0000;"><strong>public boolean equals(Object obj) {if(this == obj)return true;if(!(obj instanceof Person))throw new ClassCastException("类型错误");//System.out.println(this+"....equals....."+obj);Person p = (Person)obj;return this.name.equals(p.name) && this.age == p.age;}</strong></span>public Person(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;}// TODO Auto-generated method stub}

4.2.4TreeSet

使用元素的自然顺序对元素进行排序,可以对set集合中的集合按照指定的顺序进行排序;不同步的

如果添加自定义的元素需要复写CompareTo方法:

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

TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。

如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
可以使用TreeSet集合第二种排序方式二:
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
将该类对象作为参数传递给TreeSet集合的构造函数。

TreeSet ts = new TreeSet(new ComparatorByName());
自定义的比较器,根据自己定义的方式进行定义;

public int compareTo(Object o) {Person p = (Person)o;int  temp = this.age-p.age;return temp==0?this.name.compareTo(p.name):temp;//int  temp = this.name.compareTo(p.name);//return temp==0?this.age-p.age:temp;/*if(this.age>p.age)return 1;if(this.age<p.age)return -1;else{return this.name.compareTo(p.name);}*/}

package cn.itcast.p5.comparator;import java.util.Comparator;import cn.itcast.pb.bean.Person;public class ComparatorByName implements Comparator {@Overridepublic int compare(Object o1, Object o2) {Person p1 = (Person)o1;Person p2 = (Person)o2;int temp = p1.getName().compareTo(p2.getName());return temp==0?p1.getAge()-p2.getAge(): temp;//return 1;//有序。}}

用元素的自然顺序对元素进行排序,使用的是二叉树的结构进行的排序的。












0 0