JAVA容器

集合框架

▪ Java集合框架提供了一套性能优良、使用方便的接口和类,它们 位于java.util包中 接口、具体类、算法。

Collection接口的常用方法

▪ 集合作为容器应该具有的功能(增,删,改,查),
▪ 不一定全有。
▪ 集合的基本操作:增加,删除,判断,取出
1.add(Object obj) 添加 , 存储的是对象的引用
2.size() 容器中元素的实际个数
3. remove(Object obj)   删除
  clear()
  removeAll(Collection<?> c)
  retainAll(Collection<?> c)
4. contains(Object obj) 判断元素
  isEmpty()
5. iterator()遍历元素

List与Set接口

▪ Collection 接口存储一组不唯一,无序的对象
▪ List 接口存储一组不唯一,有序(插入顺序)的对象
▪ Set 接口存储一组唯一,无序的对象
▪ Map接口存储一组键值对象,提供 key value 的映射

List接口的实现类

▪ List特点:有序,不唯一(可重复)
▪ ArrayList实现了长度可变的数组,在内存中分配连续的空间。
– 优点:遍历元素和随机访问元素的效率比较高
– 缺点:添加和删除需要大量移动元素效率低,按照内容查询效率低
▪ LinkedList采用链表存储方式。
– 优点:插入、删除元素时效率比较高
– 缺点:遍历和随机访问元素效率低下

List接口特有的方法

▪ 凡是可以操作索引的方法都是该体系特有方法

1 (增) add(index,element) 在指定索引的位置上插入元素
addAll(index,Collection) 在指定的引的位置上插入整个集合的元素
addAll(Collection) 在结束插入整个集合的元素
2 (删) remove(index) 根据索引删除指定的元素
3 (改) set(index,element) 使用element 替换指定索引位置上的元素
4 (查) get(index)获取元素
     subList(from,to)
     listIterator();

Iterator 接口

▪ 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
▪ Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历 操作。
▪ Iterator接口定义了如下方法:
boolean hasNext(); //判断是否有元素没有被遍历
Object next(); //返回游标当前位置的元素并将游标移动到下一个位置
void remove();//删除游标左面的元素,在执行完next之后该
                      //操作只能执行一次
▪ 所有的集合类均未提供相应的遍历方法,而是把遍历交给迭代器
完成。迭代器为集合而生,与门实现集合遍历
▪ Iterator是迭代器设计模式的具体实现
▪ Iterator方法
     – boolean hasNext():判断是否存在另一个可访问的元素
     – Object next():返回要访问的下一个元素
– void remove():删除上次访问返回的对象
▪ 可以使用Iterator遍历的本质是什么?
– 实现Iterable接口
Iterator
▪For-each循环
     –增强的for循环,遍历array或Collection的时候相当简便
     –无需获得集合和数组的长度,无需使用索引访问元素,无需循环条件
     –遍历集合时底层调用Iterator完成操作
▪For-each缺陷
    –数组:
              ▪不能方便的访问下标值
              ▪不要在for-each中尝试对变量赋值,只是一个临时变量
   –集合:
              ▪不使用Iterator相比,不能方便 的删除集合中的内容
▪For-each总结
   –除了简单的遍历并读出其中的内容外,不建议使用增强for

ListIterator的作用解决并发操作异常

▪ 在迭代时,不可能通过集合对象的方法(al.add(?))操作集合中的元素,
▪ 会发生并发修改异常。
▪ 所以,在迭代时只能通过迭代器的方法操作元素,但是Iterator的方法
▪ 是有限的,只能进行判断(hasNext),取出(next),删除(remove)的操作,
▪ 如果想要在迭代的过程中进行向集合中添加,修改元素等就需要使用
▪ ListIterator接口中的方法
ListIterator li=al.listIterator();
while(li.hasNext()){
Object obj=li.next();
if ("java2".equals(obj)) {
li.add("java9994");
li.set("java002");
} }

List接口的实现类LinkedList

▪ linkedList特有的方法

序号方法名作用
1 (增)
addFirst(Object obj)
addLast(Object obj)
offerFirst(Object obj)
offerLast(Object obj)
添加头
添加尾
1.6 版本之后的加头,尾巴
2 (删)
removeFirst()
removeLast();
pollFirst()
pollLast()
删除头      获取元素并删除元素
删除尾
1.6 版本之后的删头,删尾
3 (查)
getFirst()
getLast()
peekFirst()
peekLast()
获取头        获取元素但不删除
获取尾
1.6 版本之后的获取头,获取尾

Set接口中的实现类

▪ Set接口
   – Set接口存储一组唯一,无序的对象
   – (存入和取出的顺序不一定一致)
   – 操作数据的方法不List类似,Set接口不存在get()方法
▪HashSet:采用Hashtable哈希表存储结构
   –优点:添加速度快,查询速度快,删除速度快
   –缺点:无序
–LinkedHashSet
      ▪ 采用哈希表存储结构,同时使用链表维护次序
      ▪有序(添加顺序)
 ▪TreeSet
   –采用二叉树(红黑树)的存储结构
   –优点:有序(排序后的升序)查询速度比List快
   –缺点:查询速度没有HashSet快

Hash

▪ 代码验证HashSet的无序性不唯一性
▪ 使用HashSet存储自定义对象,重写hashCode方法不equals方

HashSet

▪ 关键代码          
    HashSet hs=new HashSet();//创建HashSet对象
    hs.add(new Person("张三",20));
    hs.add(new Person("李四",22));
    hs.add(new Person("王五",23));
    hs.add(new Person("李四",22));
▪ HashSet存储进了相同的对象,不符合实际情况
▪ 解决方案:
▪ 重写equals方法不hashCode方法

HashSet操作

▪ hashCode都相同,不符合实际情况,继续升级
▪ 修改hashCode方法
@Override
public int hashCode() {
System.out.println(this.name+".....hashCode");
return this.name.hashCode()+age;
}
总结:
▪ HashSet是如何保证元素的唯一性的呢?
▪ 答:是通过元素的两个方法,hashCode和equals方法来完成
▪ 如果元素的HashCode值相同,才会判断equals是否为true
▪ 如果元素的hashCode值不同,不会调用equals方法

TreeSet

▪ TreeSet
– 采用二叉树(红黑树)的存储结构
– 优点:有序(排序后的升序)查询速度比List快
– 缺点:查询速度没有HashSet快

Comparable 接口

 
问题:上面的算法根据什么确定集合中对象的“大小”顺序?
• 所有可以“排序”的类都实现了java.lang.Comparable 接口,
Comparable接口中只有一个方法
     public int compareTo(Object obj);
该方法:
. 返回 0 表示 this == obj
. 返回正数 表示 this > obj
. 返回负数 表示 this < obj
实现了Comparable 接口的类通过实现 comparaTo 方法从而确定
该类对象的排序方式。  

sort排序

public class StrLenComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
if (o1.length()>o2.length()) {
return 1;
}
if (o1.length()<o2.length()) {
return -1;
}
return o1.compareTo(o2);//长度相同,按字母
}
}
public static void sortDemo(){
List<String> list=new ArrayList<String>();
..添加元素
sop(list);
Collections.sort(list);//按字母排序
sop(list);
//按照字符串长度排序
Collections.sort(list,new StrLenComparator());
sop(list);
}

泛型

▪ 为什么需要泛型
▪ 解决数据类型操作不统一产生的异常
▪ 使用泛型可以更好的去保护数据类型
▪ 泛型类的定义

泛型类的定义

…..
public class Notepad<K,V> {// 此处指定了两个泛型
private K key;//此变量的类型由外部决定
private V value;//此变量的类型由外部决定
…..
}
…..
Notepad<String,Integer>t=null;//指定两个泛型类型的对象
//Key为String,Value为Integer
t=new Notepad<String,Integer>();
t.setKey("张三");
t.setValue(30);
System.out.println("姓名:"+t.getKey()+"\t年龄:"+t.getValue());
使用泛型集合解决实际问题
▪ 声明员工类Employee包含如下属性:id,name,age,gender(枚举类型)
▪ 声明程序员类SE,含有属性popularity人气值
▪ 声明项目经理类PM,含有属性workOfYear工作年限
▪ 程序员不项目前经理都继承自Employee
需求说明:
▪ 使用泛型集合ArrayList,LinkedList,HashSet,TreeSet完成员工的添加, 删除,
▪ 判断,集合中元素个数的判断
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值