java集合概述
与数组的区别:
1、数组长度是固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)
2、集合:JAVA集合可以存储数量不等的多个对象,还可用于保存具有映射关系的关联数组
3、)若程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,数组则不适用。
Collection接口的方法
Java集合可分为List Set Map Queue四大体系。
1、List接口
有序,可重复的集合,list接口是以数组为底层实现,是有序的
List往下还有个AbstractList它的具体实现类:
一、ArrayList 连续的可变长度的数组(有序,可重复)
ArrayList list = new ArrayList();//容纳性不强,这里可以用多态
//比如
List list = new ArrayList();
//泛型 指定容器类型 Integer String...
List<Integer> intlist = new ArrayList<Integer>();//可变长度数组(Integer)
常用方法:
二、LinkedList 链表存储(非连续的,非顺序的)
List<Integer> intlist = new LinkedList<Integer>();
常用方法:
ArrayList执行查询操作效率比较高。
LinkedList插入、删除操作效率比较高。
三、遍历方法:
List<person> personList = new ArrayList<persion>();
//获取迭代器
Iterator<person> iterator = personList.iterator()
hasNext():判断是否存在另一个可访问的元素
next():返回要访问的下一个元素
增强for循环
2、Set接口 操作数据的方法与List类似,Set接口不存在get()方法。
无序、不可重复的集合,set又是以map为底层实现
Set下也有一个AbstractSet它的实现类
一、HashSet(HashSet允许集合元素值为null)
1、怎样判断元素是否重复?
重写实体类的equals()方法,和hashcode方法(就是比较的地址)
2、什么是hashcode方法
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
二、TreeSet(二叉树)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
迭代器:Iterator接口表示对集合进行迭代的迭代器,专门实现集合的遍历。
三、Set容器的遍历
hasNext():判断是否存在另一个可访问的元素
next():返回要访问的下一个元素
注意一点:set 没有get位置(方法)
Map接口
具有映射关系的集合,key-value(键值对),map接口底层是hash函数,无顺序(不是随机)
HashMap是Map接口中最常见的实现类
存储一组成对的键-值对象,提供key(键)到value(值)的映射,通过key来索引。
特点:
1、key不允许重复(底层使用的set)
2、value允许重复 (底层使用的collection)
3、添加的对象将转换成Object类型
还有实现类:
LinkedHashMap
TreeMap
HashTable(不在使用)线程安全的容器
properties子类,做键值对文件读取
常用方法:
遍历方式:
1、keyset方法
Set<Integer> keySet = map.keySet();//取出所有key
for(Integer tmp : keySet){
Object value = map.get(tmp) //tmp map容器的key
}
2、map特性(通常用的方法)
Person p1 = new Person();//person类有age 和 name 属性
p1.getAge(20);
p1.getName("zhangsan");
//实体类---->map容器
Map<String,Object> perMap = new HashMap<String,Object>();
perMap.put("age",20); //key="age"
perMap.put("name","zahngsan"); //key2="name"
//遍历(已知key且数量少)
int age = perMap.get("age");
String name = perMap.get("name");
3、values()方法。
Collection<Object> value = perMap.getValues();//获取所有的value
//Collection接口继承了迭代器
Iterator<Object> iterator = values.Iterator();
while(iterator.hasNext){
Object v = iterator.next;
}
4、entrySet方法把map中的每个键值对封装到set容器
//返回Entry类型的键值对
Set<Map.Entry<String,Object>> entrySet = perMap.entrySet();
Iterator<perMap.Entry<String,Object>> iterator = entrySet.iterator();
while(iterator.hasNext){
Map.Entry<String,Object> map = iterator.next;
Object tmpobject = map.getValue();
String key = map.getKey();
}
TreeMap
TreeMap存储Key-Value 对时,需要根据Key 对key-value 对进行排序。TreeMap可以保证所有的Key-Value 对处于有序状态。
key排序:
1、自然排序
2、定制排序
//创建一个TreeMap
new TreeMap();
Map<Integer,Object> treemap = new TreeMap<Integer,Object>();
treemap.put(3,"a");
treemap.put(7,"b");
treemap.put(1,"c");
for(Integer key:treemap.keySet()){
System.out.println(treemap.get(key));
}
/*输出结果 自然排序
* c
* a
* b
*/
操作集合的工具类:Collections
泛型
一、作用
1、解决元素存储的安全性问题
2、解决获取数据元素时,需要类型强转的问题
在集合中没有泛型时,你存储的是一个String类型,但是集合就把它当成Object类型
二、泛型的声明
interface List 和 class Test<K,V>其中T,K,V不代表值,而是代表类型,这里使用任意字母都可以,常用T表示,是Type的缩写。
三、泛型的实例化
一定要在类名后面指定类型参数的值(类型)如:
List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();
三、在集合中使用泛型
List i = new ArrayList();
四、泛型类
/*泛型类
*格式:
*class 类名<字母列表“T”“K”>{
* 修饰符 字母 属性;
* 修饰符 字母T 方法(字母T t)}
*
*/
public class Order<T>{
//构造
public Order(T xxxx){ //T是传递的类型 变量xxxx
}
public Order(){ //无参构造
}
//属性
private T t;
public T getT(){
return t;
}
public void setT(T t){
this.t = t;
}
//泛型方法 不在使用T,另外一个
public <E> E getOrder<E e>{
return e;
}
}
//数组E 到集合 List<E> 的复制
//返回 List<E>类型
//<E>泛型声明
public <E> List<E> copyArrayToList(E[] e,List<E> list){
for(E temp:e){
list.add(temp);
}
return list;
}
//泛型接口 模拟dao层接口:处理业务的业务的增删改查。add(Person) del(int) get(person)
//add(Student) del(int) get(Student)
public interface Dao<T>{
void add(T t);
int del(int id);
List<T> getList();
}
//通配符 泛型中的使用
//
public void show(list<?> list){}
//list中放置的必须是number或者number的子类
public void show1(list<? extends Number> list){}
//list中放置的是Integer或者它的父类
public void show2(list<? super Integer> list){}