集合框架
1、java集合概述
在编程的时候,我们常常需要将许多对象存在一个容器当中,并且想要其实现常用的数据结构,如栈、队列等。 除此之外也想要将具有映射关系的关联数组存储其中。由此,就产生了java的集合。
在java中,总共定义了两大类集合就是collection和map具体的子类及其特点如下:
在集合的框架中,collection和map是并列的,他们各自产生了很多的子类,现就总结一下,常用的。
Collection
--list 此集合是有序的,存入其中的元素是可以重复的
--ArrayList 底层是数组数据结构,查询速度较快,增删速度慢 线程是不同步的
--LinkedList 底层的数据结构是链表数据结构,查询速度较慢,增删较快,线程是不同步的
--Vector 底层数据结构是数组结构,线程是同步的 效率太慢
--set 此集合是无顺序的,存入其中的元素是不可以重复的
--HashSet 底层数据结构式哈希表,对于类似于String的元素,存入其中会自动调用
hashCode()方法和equals()方法,这两个方法都是Object的方法 来确保
存入元素的唯一性。当自定义元素的时候,我们一般都要复写Object的这
两个方法。
--TreeSet 底层是二叉树结构,可以对存入的元素进行排序。但是,对于存入的自定义
元素必须implements Coparable 接口、复写compareTo()方法,其目的就是
为了让存入的元素具有比较性。
这就是TreeSet集合的特点。
Map: 此集合石键值对出现的。
--HashTable 底层数据结构是哈希表结构,线程是同步的,jdk1.0版本出现的 效率低
键。值不可以为null 元素是无序的 不可重复的
--HashMap 底层数据结构是哈希表 线程是不同步的 jdk1.4版本出现的 效率较高
键。值可以为null 元素是无序的 不可重复的
--TreeMap 底层数据结构是二叉树结构 集合可以对存入元素进行排序的
2、java集合作用及为什么要定义集合
2.1 集合的作用:
既然java中已经出现了数组,为什么还是要出现集合呢?数组虽然也可以是存贮对象,但是其长度是固定的,集合的长度是可变的;数组中可以存贮基本数 据类型,集合中只能存贮对象。他会将基本 数据类型转换成引用数据类型,如:int——Integer,short——Short,long——Long,float——Float。
注意:集合里面存贮的不是对象的实体,而是对象的引用。2.2 为什么要出现集合:
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作, 就对对象进行存贮,集合就是存贮对象的最常用的一种方式。
3、对集合的常见操作
3.1 list集合的常见操作
List集合作为Collection集合的子类,除了继承其全部的方法之外,还提供了自己的特有的方法。add(int index,Object obj):将指定的obj添加到集合的指定位置处index。
get(int index):获取指定位置上的元素,返回值类型为object ,一般使用的时候我们需要进行强转。
indexOf(Object obj):索引对象在集合中的位置。返回的是int
remove(int index):删除指定位置上的元素,返回值是这个位置上元素
remove(Object obj):判断是否删除这个指定位置上元素,返回值是boolean。
当然,最主要的是List增加了自己特有的迭代器这个可以在遍历集合的时候,进行元素的增删操作。
3.2 Set集合的主要特点
前面已经总结过,Set就像是一个罐子,一旦将其扔进其中,集合中的元素没有明显的顺序。他和Collection 一样,继承了其全部的方法,并没有提供额外的方法。Set集合不允许有重复的元素,如果试图将两个相同的元素加入其中,则操作失败并且add方法返回为false,且新元素不会被添加其中。set集合判断元素重复的方法,并不是依据"==",而是通过equals方法,就是说只要元素的equals方法返回true添加元素就会失败。
HashSetshi是set集合的一个重要的实现类,我们一般使用的时候就是使用它。现在总结一下,HashSet集合的主要特点:
不能保证存入元素的排列顺序,顺序有可能发生变化,HashSet是不同步的,如果多个线程同时访问一个HashSet,有两个或者两个以上的线程修改了集合时候,就必须通过同步代码来保证其步,集合元素的值可以使null当向HashSet集合存入元素的时候,他首先会调用元素的HashCode()方法来保证该对象的哈希值,然后根据其哈希值来判断出该元素在集合中的位置,在调用其equals方法在进行判断一次。
所以,一般我们在自定义存入集合的元素的时候,就有了一下的操作:
class Person//往HashSet集合中存入自定元素的时候,应该有的复写方法
{
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 name.hashCode()+age;}//复写object的hashcode()方法
public boolean equals(Object obj)//复写object的equals方法
{
if(!(obj instanceof Person))
return false;
Person p=(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
}
TreeSet集合也是Set集合的一个实现类,他相比于HashSet不同之处在于:并不是更具元素的插入顺序进行排序,而是根据元素的实际值来进行排序的。
他的底层是通过二叉树的原理啦判断元素是否相同。TreeSet集合支持两种排序:自然排序和定制排序。
自然排序:就是根据元素的自然顺进行排序,我们常用的一般元素都是实现了Comparable接口,并且复写其compareTo方法来实现自然排序的。
定制排序:就是我们根据自己的需要,自定义一个比较器,将其作为一个参数,传递TreeSet集合的构造参数。具体就是定义一个类实现Comparator接口,复写他的compare方法。
所以,现在我们想要往仁义一个集合中存入元素的时候,该干的事就多了,例如:
class Person implements Comparable
{
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 name.hashCode()+age;}
public int compareTo(Object obj)//按照年龄的大小排序
{
Person p=(Person)obj;
int num=new Integer(this.age).compareTo(new Integer(p.age));
if(num==0)
{return this.name.compareTo(p.name);}
return num;
}
}
//自定义比较器,传入集合的构造函数中
class myComparator implements Comparator
{
public int compare(Object obj1,Object obj2)//按照年龄的大小,如果相同再按照姓名
{
Person p1=(Person)obj1;
Person p2=(Person)obj2;
int num=new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
if(num==0)
{return p1.getName().compare(p2.getName());}
return num;
}
}
以上就是我们自定义了集合中元素的方法,并且自定了一个比较器。
3.3 Map集合的特点
Map集合石用于保存具有映射关系的数据,因此Map集合里面保存着两组值,一组值用于保key,一组用于保存value,一个集合里面不允许有两个相同的key。因为,通过一个key只能相应的取出器固定的value。HashMap和HashTable的区别上面已经总结,现在有一个比较重要的类就是properties,它连接着IO流和集合,通过气自身的load(InPutStream in),和list(PrintStream ps)所以这是我们应该掌握的内容。往集合中添加元素的方法以及原理和Set集合大同小异,我们就没必要在重新阐述了。现在重点说一下对于map集合的遍历方法。
//Map集合中没有迭代器,所有就是两种方法。keySet()和entrySet正两种
//第一种方法 keySet()
import java.util.*;
class MapQc
{
public static void main(String[] args)
{
Map<String,Integer> map=new HashMap<String,Integer>();//创建Map集合子类对象
map.put("zhangsan0",55);
map.put("zhangsan1",56);
map.put("zhangsan2",58);
map.put("zhangsan0",55);
QC(map);
QC_1(map);
}
public static void QC(Map<String,Integer> map)
{
Set<String> keyset=map.keySet();
Iterator<String> it=keyset.iterator();
while(it.hasNext())
{
String key=it.next();
//System.out.println(key);
Integer value=map.get(key);
System.out.println(key+"=="+value);
}
}
public static void QC_1(Map<String,Integer> map)//第二种方法 取出键值关系
{
Set<Map.Entry<String,Integer>> entryset=map.entrySet();
Iterator<Map.Entry<String,Integer>> it=entryset.iterator();
while(it.hasNext())
{
Map.Entry<String,Integer> hs=it.next();
String key=hs.getKey();
Integer value=hs.getValue();
System.out.println(key+"::"+value);
}
}
}
4.总结
阐述了上面那么的内容,总而言之,我们一般在操作集合的时候,无非就是常见的四种操作—crud。分别就 是create raed update delete。在list集合中,我们一般情况下首选的是ArrayList,在Set集合中我们一般首选的就是HashSet,在map集合 中我们首选的HashMap。当然,其余的集合我们也肯定会遇到的。最后在总结一点:就是Set集合底层调用的就是Map集合 (当Map集合的value值全为null的时候就是set集合)