黑马程序员——java 集合

 ——- android培训java培训、期待与您交流! ———-

Collection接口:

Collection 接口是List和Set的父接口
List 接口存储一组允许重复,有序(插入顺序)的对象
Set 接口存储一组唯一,无序的对象 

List接口:

List 接口存储一组允许重复,有序(插入顺序)的对象(包括null),可以通过索引(下标)来进行访问

存储(添加)
boolean add(Object o)   继承自Collection
void add (int index,Object o)     加塞儿专用
替换
set(int index,Object o)
删除
remove(Object o)  继承自Collection
remove(int index)
void clear()  继承自Collection
判断
boolean contains(Object o)   继承自Collection    思考:内部怎么实现?
boolean isEmpty()   继承自Collection
int indexOf(Object o)
int lastIndexOf(Object o)
获取
int size()   继承自Collection    集合中存了多少个数据    相当于数组.length
Object get(int index)    相当于arr[i]
Object[] toArray()    继承自Collection

List接口常用实现类:

Vector(向量列表):底层数据结构是动态的数组结构,线程安全,无论增删还是查询都非常慢。默认初始容量为10,增量为10。

ArrayList(线性列表):底层数据结构是动态的数组结构,线程不安全,增删的效率很慢(因为要移动数据),但是随机查询的效率很高。默认初始容量为10,增量未指定(经调试发现:原容量的50%)。

LinkedList(链式列表):底层是链表数据结构,线程不安全,对元素的增删的操作效率很高,随机查询的效率低(因为要移动指针寻址)。默认初始容量为0,增量不明确。

Vector:

构造方法:
public Vector()
public Vector(int initialCapacity)
public Vector(int initialCapacity,int capacityIncrement)

其他常用方法来自List接口

ArrayList:

构造方法:
public ArrayList()
public ArrayList(int initialCapacity)

其他常用方法来自List接口

LinkedList:

构造方法
public LinkedList()

独有方法:
public void addFirst(Object e)   相当于add(0, e)
public void addLast(Object e)   相当于add(e)
public Object getFirst()  相当于get(0)
public Object getLast()  相当于get(al.size()-1)
public Object removeFirst()   相当于remove(0)
public Object removeLast()   相当于remove(al.size()-1) 
//--------------测试效率(加塞操作)-----------------
ArrayList al=new ArrayList();
long begin=System.currentTimeMillis();
for (int i = 0; i < 200000; i++) {
              al.add(0,"1");
}
long end=System.currentTimeMillis();
System.out.println(end-begin);

泛型:

集合可以存储任意类型的对象,因此在从集合中取出这些对象时需要强转,但如果存储的不是同一种类型,取出对象时怎么强转?这就是类型安全问题

泛型即(Generic type),是Java 5新加入的特性,它只能用于引用数据类型(基本数据类型使用包装类),用来解决类型安全问题,怎么解决?

泛型的本质是类型参数化,即让类型“任意化”,就是在定义(类型的定义,方法的定义,参数的定义,成员变量的定义等等)的时候,设置它的类型可变,也就是数据类型可以是任意的类型
public class FanxingLei<T> {

    private T name1;
    private Object name2;

    public void  setName1(T name) {

    }
    public T getName1(){
           return name1;
    }
    public void  setName2(Object name) {

    }
    public Object getName2(){
            return name2;
    }
}
FanxingLei fLei=new FanxingLei();
fLei.setName2(new Student("a", 20));
fLei.setName2("abc");
Student temp=(Student)fLei.getName2();


FanxingLei<Student> fLei2=new FanxingLei<Student>();
fLei2.setName1(new Student("a", 20));
//fLei2.setName1("abc");
temp=fLei2.getName1();

Set接口:

Set 接口存储一组唯一,无序的对象
唯一:Set集合中不允许出现重复的元素,如果向Set集合中存储重复的元素是无效的,但不会报错

无序:Set集合不会维护集合中元素的插入顺序,也不存在下标或索引

Set接口中没有自有方法,全部继承自Collection接口,可查阅帮助文档进行使用

Set接口常用实现类:

HashSet
是无序的吗?
是唯一的吗?
往Set集合中存储对象时,Java如何判断集合中是否已存在该对象?遍历集合、逐个用equals比较?可行吗?效率怎么样?

    先判断hashCode,不相等就添加;如果相等则判断equals,不相等就添加


HashSet采用哈希(散列)数据结构来存储对象,大大提高查询效率。

不保证线程安全

Set接口常用实现类:

TreeSet
无序、唯一

以树形结构(平衡二叉树)存储,访问或遍历的速度快,默认按自然顺序进行存储

是自然顺序作为遍历顺序吗?

不保证线程安全

自有方法:
public Object ceiling(Object e)
public Object floor(Object e)
public Object first()
public Object last()
public Object higher(Object e)
public Object lower(Object e)

Java集合迭代器:

ArrayList<String> al=new ArrayList<>();

Iterator<String> it=al.iterator();
while(it.hasNext()){
    String temp=it.next();
    System.out.println(temp);
}

HashSet<String> hs=new HashSet<>();
Iterator<String> itt=hs.iterator();
while(itt.hasNext()){
    System.out.println(itt.next());
}

迭代器设计模式:

迭代器是一种设计模式,可以遍历某容器(集合)。

自定义一个集合类通过数组模拟迭代器设计模式(画结构图)

Java集合中的迭代器如何设计?
java.lang.Iterable接口
Iterator<T> iterator()       返回一个迭代器,相当于一个导游

java.util.Iterator接口
boolean hasNext()     还有没有下一个
E next()    获得下一个
void remove()   用来解决ConcurrentModificationException(并发修改异常)

可以查阅ArrayList和HashSet的源码进行了解

迭代器也支持泛型

Map接口:

Map是比较特殊的集合,也叫映射,它一次存储两个数据(一个键值对,Entry)。键(key)和值(value)可以是任何类型,键不允许重复,值允许重复。一个键有且只能对应一个值。

存储
V put(K key, V value)       键如果重复会覆盖值
删除
void clear()
V remove(Object key)      根据键删除键值对儿
判断
boolean containsKey(Object key)   先判断hashCode  然后判断equals
boolean containsValue(Object value)    判断equals
boolean isEmpty()
获取
V get(Object key)  根据键得到对应的值
int size()
Set<K>  keySet()
Collection<V>  values()
Set<Map.Entry<K,V>> entrySet()   

Map接口常用实现类:

HashMap,基于哈希表结构的Map实现,允许使用null值和null键,不保证顺序,不保证线程安全。
构造方法
    public HashMap(),构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空HashMap对象。
其他方法来自Map接口




LinkedHashMap,基于哈希表和链表结构的Map实现,允许使用null值和null键,维护插入顺序做为遍历顺序,不保证线程安全。
构造方法
    public LinkedHashMap(),构造一个带默认初始容量 (16) 和加载因子 (0.75) 的空LinkedHashMap对象。
其他方法来自Map接口

Map接口常用实现类:

TreeMap,基于平衡二叉树结构的Map实现,不允许null键,允许null值。根据其键的自然顺序进行排序。不保证线程安全。

构造方法:
    public TreeMap(),使用键的自然顺序构造一个空的对象。

自有方法:
    public Map.Entry<K,V> ceilingEntry(K key)
    public K ceilingKey(K key)
    public Map.Entry<K,V> firstEntry()
    public K firstKey()
    public Map.Entry<K,V> lastEntry()
    public K lastKey()
    public Map.Entry<K,V> higherEntry(K key)
    public K higherKey(K key)
    public Map.Entry<K,V> lowerEntry(K key)
    public K lowerKey(K key)

Map的迭代器:

如果只遍历所有的键,Set<K> keySet()
如果只遍历所有的值,Collection<V> values()
如果想成对儿遍历,能用foreach或昨天的迭代器直接对Map集合进行遍历吗?
如果想成对儿遍历,有如下两种方式:
方式一:获得所有的key,然后根据key找到value (上午已讲)
方式二:Map.Entry接口,用于获取键值对的集合
K getKey()返回与此项对应的键。
V getValue()返回与此项对应的值。

 ——- android培训java培训、期待与您交流! ———-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值