什么是集合?
集合和数组非常类似,都是存储数据的一个容器。
数组和集合的区别:
数组是定长,且只能存储相同类型的数据。
集合是变长,不仅可以存储相同数据而且可以存储不同类型的数据的容器。
备注:
和集合相关的类都需要导包。注意都是java.util下。
集合分为两大类:
1.单列集合(类似数组,只需要存值,通过下标访问值)
2.双列集合(类似对象,不仅需要存值,还要存与之对应的属性名,通过属性名访问属性值)
单列集合:
Collection就是所有单列集合的父接口
所有单列集合都实现了该接口,所以:所有单列集合都拥有共同的方法,学会了一种单列集合,其他的都可以依葫芦画瓢。
Collection又分为:
List子接口(内部元素:有序且可以重复)
Set子接口(内部元素:无序且无法重复)
List接口:
主要分为以下两个实现类:
ArrayList 集合:采用数组结构,元素增删慢,查找快,由于日常开发中使用最多的功能就是查询,所以 ArrayList 是最常用的集合之一。没有保证线程安全,但是效率高。
Vector集合:保证了线程安全,但是效率较低。除此和ArrayList都一样。
LinkedList 集合:采用链表结构。元素增删快,但是查找慢。
Ps:
线程安全:保证多个用户共同使用它也不会出错
数组结构:元素增删慢,查找快
链表结构:元素增删快,查找慢
Set接口:
特点1:单列集合 父类依然是Collection
特点2:无序无法重复。
该接口下有一个常见类:HashSet
双列集合:
Map集合
分别存储 键 和 值 键理解为属性名 value属性值
键绝对是独一无二的 一般来说键:String 值:Object
如何创建一个map:
Map<String,Object> map = new HashMap<String,Object>();
map的一些方法:
1.添加元素
map.put("1001", "张三1");
2.获取指定键 对应的值
System.out.println(map.get("1001"));//值为:张三1
3.获取长度
System.out.println(map.size());
4.如何遍历一个map集合
//1.将其转成Set集合
Set<String> set = map.keySet();//将map集合中的键 全部转成set集合
System.out.println(set);
for(String s :set) {
System.out.println(map.get(s));
}
常见的集合:
1.ArrayList:
特点1:采用了数组结构:查询快。增删慢
特点2:线程非安全所以效率快
特点3:有序且可以重复
特点4:父类是List 祖父类:Collection
如何创建一个ArrayList :类似于多态:左边放父类 右边放子类
List list = new ArrayList( );
2.Vector:
特点1:单列集合 父类是List 祖父类Collection
特点2:数组结构
特点3:有序可重复 线程安全效率低
如何创建一个Vector :
List list = new Vector( );
3.LinkedList:
特点1:父类都是List祖父类都是Collection有序 可重复
特点2:链表结构 增删快。查询慢
如何创建一个LinkedList :
List list = new LinkedList( );
4.HashSet:
如何创建一个HashSet :
Set<Object> set = new HashSet<Object>( );
注意:
无序:如果存放的实体类,会出现一个BUG当某个实体类的属性完全一致,按理来说应该视为相同的值。但是set不会这么做。
解决办法:重写hashCode方法即可
hash:哈希 ,一种编码 , 每个对象都有一个独一无二的hash值 ,你就理解为键盘上的26个字母
Integer a = 123; String b = "Nihao"; System.out.println(a.hashCode()); System.out.println(b.hashCode());
存在的意义: 判断对象是否相等
一般来说判断对象是否相等都是通过== 但是==获取的内存地址 效率较低
所以hashCode效率较高、 hashCode相等,则进一步判断内存地址 如果hashCode都不能则内存地址肯定不等。
一些常见的方法:
1.往集合尾部添加元素,一般不需要返回值
boolean add(Object o);
2.往集合指定位置添加元素
void add(int index, Object o );
//例:
list.add(指定位置,值);
3.返回集合的长度
int size();
4.判断集合的内部是否为null 注意:并不是判断集合为空
boolean isEmpty();
5.判断集合内部是否存在该值
boolean contains(Object o);
6.删除集合指定的元素值
boolean remove(Object o);
//例:
System.out.println(list.remove(0));//根据下标删除
System.out.println(list.remove("jakc"));//根据指定内容删除
7.返回指定元素首次出现的位置。-1表示不存在
int indexOf(Object o);
8.判断两个集合是否 值和顺序都相等
boolean equals(Object o);
//注意:重写Object的equals方法
9.获取指定位置的元素
Object get(index);
如何遍历集合?
如果是List集合用普通for循环即可完成遍历
for(int i = 0;i < list.size();i++){
}
但如果是set集合由于没有下标,用增强for循环
for(Object o :set ) {
System.out.println(o);
}
任何集合都可以通过额外一个知识点: Iterator(迭代器)
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {//是否还有下一个元素
if(it.next()==9999999) {
}
}
泛型:
概念:就是每个集合后面跟着的 <E> E表示这个集合应该存储什么类型的数据
集合:可以存放不同类型的。但是即使这样,你也要声明