【学习笔记】java集合框架1

内容:

/********************

数组与集合
集合框架体系
SET接口
LIST接口
迭代器接口
Map接口
老集合类的使用
内部比较器与外部比较器
集合类的综合使用

********************/

一. 数组

int[] aryInt = new int[100]
用于容纳一组数据
数组的特点:
在Java中,数组是被当做对象处理的
数组长度在数组初始化时必须固定
长度在固定之后,要改变数组长度大小的话,必须对数组进行长度大小变化的控制

package com.fjnu.study2;

public class Array {
    public static void main(String[] args){
        String[] strs = new String[10]; //当作对象, 定义一个数组长度为10
        String[] strs1 = { "1", "2" };
        String[] strs2 = null;
        String[] strs3;
        String[] strs4 = new String[] {};
        System.out.println(strs.length);
        System.out.println(strs1.length);
        //System.out.println(strs2.length); //运行期间出错, 因为对象没有实例化
        //System.out.println(strs3.length); //编译期间错误,因为没有赋初值
        System.out.println(strs4.length);
    }
}
10
2
0

数组的优缺点:

数组存取效率高,使用时要求容量大小固定;适合基本数据类型的存取;

而集合存取效率上有一定的牺牲,集合容量大小可以根据实际需要改变,提供丰富的存取方法,适合成为对象的“容器”;

集合用来存储对象。

两个对象的equals相等,那么他们的哈希码一定相等

两个对象的哈希码相等,那么他们的equal不一定相等。

Collection接口

集合框架的根
通用方法
 boolean contains(Object a)
 boolean equals(Object a)
 Iterator iterator() //遍历
 int size()
 void clear()
 boolean add(Object a)
 Boolean remove(Object a)

Set接口以及特点

扩展Collection接口 不允许重复元素 允许一个null值 对 add()、equals() 和 hashcode() 方法添加了限制

set接口的实现类

HashSet
LinkedHashSet
CopyOnWriteArraySet
TreeSet

HashSet的特点

底层是以哈希表的算法实现的。
不是线程同步的一个集合类
探讨HashSet中的重复概念?
探讨HashSet中的元素到底是不是无序的?

什么是重复

public boolean equals(Object obj)
    指示某个其他对象是否与此对象“相等”。
    注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
public int hashCode()
生成对象的哈希码。返回对象存储的物理地址(实际上可能并不是),但是是用来标识对象的一个标记号。

LinkedHashSet特点

LinkedHashSet的特点
底层是以链表实现的
LinkedHashSet是有序的(插入顺序有序)
不是线程同步的一个集合类

CopyOnWriteArraySet

CopyOnWriteArraySet的特点
底层是以数组实现的
线程安全的集合类。
元素之间是有序的.(插入有序)

copyOnWriteArraySet 是用数组实现了, 而LinkHashSet是用链表实现的,会更快

TreeSet的特点

TreeSet的特点
底层是以TreeMap实现的红黑树结构
不是线程安全的类
元素之间是有序的(不是插入顺序,而是指元素之间有序)。

迭代器Iterator

对集合进行迭代的迭代器。迭代器代替了 Java Collections Framework 中的 Enumeration。
包含如下方法:
boolean hasNext()
    如果仍有元素可以迭代,则返回 true。
Object next()
    返回迭代的下一个元素。
boolean  remove(Object o)
    从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法

迭代器会出现快速失败异常

什么叫快速失败异常
出现快速失败异常的原因
如何解决快速失败异常
A:使用迭代器删除
B:使用线程安全的集合

快速失败异常的原因举例:如果在迭代的过程中,有其他线程在修改这个迭代的数据,那么迭代的数据就会具有不定性,所以会出现错误。

package com.fjnu.study2;
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;

public class interg {
    public static void main(String[] args){
        Set set = new HashSet();
        set.add("aa");
        set.add("bb");
        set.add("cc");
        System.out.println(set);
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            String str = (String)iterator.next();
            if (str.equals("bb")){
                //set.remove(str);//出现快速失败异常
                iterator.remove();
            }
        }
        System.out.println(set);
    }
}

List接口以及特点

扩展了Collection接口
具有顺序的集合(插入的顺序)
元素可以通过其整型下标访问
可以包含重复元素
方法分类
定位方法:get()、set()、add()、remove()、addAll()
搜索方法:indexOf() 和 lastIndexOf()
ListIterator方法:listIterator() 和 subList() 

List接口的实现类

ArrayList类:
      由一个数组后推而成,适合查询频繁的列表
LinkedList类:
      由一个双向链表后推而成,适合插入删除频繁的列表

ArrayList的特点

ArrayList的特点
底层是以数组实现的
元素是有序的(插入顺序)
不是线程安全的集合类
适合查找频繁的操作

LinkedList

LinkedList的特点
底层是以链表实现的数组
元素是有序的(插入顺序)
不是线程安全的集合类
适合增删改比较频繁的操作

CopyOnWriteArrayList

CopyOnWriteArrayList的特点
底层是以数组实现的
元素是有序的(插入顺序)
线程安全的集合类
查找速度比较快,增删改速度比较慢。

注意List中的sublist的用法

Map接口

关键字唯一
将键映射至值的对象
每个键最多都只能映射至一个值
键值重复的话,后面添加的后覆盖前面元素的值。

重要方法
基本操作
 put()、get()、remove()、containsKey()、containsValue()、size() 和 isEmpty()
 批操作
 putAll() 和 clear()
 集合视图
 keySet()、values() 和 entrySet()

HashMap

底层是以哈希算法实现
允许一个NULL键,允许多个NULL值
元素之间是无序的
不是线程安全的集合类

LinkedHashMap

底层是以链表实现
允许一个NULL键,允许多个NULL值
元素之间是有序的(插入顺序有序)
不是线程安全的集合类

TreeMap

底层是以红黑树算法实现
元素之间是有序的(是对象之间有序)
不是线程安全的集合类

迭代Map

通过KeySet来迭代
通过Values来迭代
通过Map.Entry来迭代

老的集合类

Vector
HashTable
Enumeration

HashTable

HashTable的特点
不允许空键
不允许空值
其它的特点与用法与HashMap相同。

Enumeration

包含下列方法:
boolean hasMoreElements()
    当且仅当此枚举对象至少还包含一个可提供的元素时,才返回 true;否则返回 false。
Object nextElement()
    得到此枚举的下一个元素。
与Iterator的区别:
        迭代器允许调用方利用定义良好的语义在迭代期间从迭代器所指向的集合移除元素。
思考Enumeration中为什么不提供remove方法?
时间: 2024-10-27 09:48:25

【学习笔记】java集合框架1的相关文章

【Java学习笔记】集合框架Ⅱ

迭代 ●迭代是取出集合中元素的一种方式. ●因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器. ●用法: 第一种 for (iterator iter=iterator(); iter.hasNext();) //老外比较喜欢用这种,省内存(iter的内存),开发时用这个 { System.out.println(iter.next()); } 第二种 Iterator iter = l.iterator(); while(iter.hasNext()) {

【Java学习笔记】集合框架Ⅰ

集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定. 就使用集合容器进行存储. 集合特点: 1.用于存储对象的容器. 2.集合的长度是可变的. 3.集合中不可以存储基本数据类型值. 集合容器因为内部的数据结构不同,有多种具体容器,不断向上抽取,就形成了集合框架. 框架的顶层是Collection接口. Collection的常见方法: 1.添加 boolean  add(Object obj); boolean  addAll(Collection coll); 2.删

学习笔记-java 集合

背景: 看的是<java核心技术 第8版>,覆盖jdk1.6.主要是对集合全局和细节进行全面掌握,较深入的理解集合.本人对java比较熟悉,但是对于细节的理解不深,知识点还不全,这是知识的查缺不漏. 一.集合接口 接口和实现分离 当程序中使用集合时,一旦构建了集合就不需要知道究竟使用的哪种实现,因此,只有构建集合对象时,使用具体的类才有意义.可以使用接口类型存放集合的引用. 2.  集合接口和迭代接口 java迭代器应该认为是位于两个元素中间,当调用next时,迭代器就越过下一个元素. Ite

Java基础学习笔记十七 集合框架(三)之Map

Map接口 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储. Map中的集合,元素是成对存在的(理解为夫妻).每个元素由键与值两部分组成,通过键可以找对所对应的值. Collection中的集合称为单列集合,Map中的集合称为双列集合. 需要注意的是,Map中的集合不能包含重复的键,值可以重复:每个键只能对应一个值. Map中

【Java学习笔记】&lt;集合框架&gt;Iterator的子接口ListIterator

1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.List; 4 5 public class Test3 { 6 7 public static void main(String[] args) { 8 List list = new ArrayList(); 9 10 list.add("abc1"); 11 list.add("abc2"); 12 lis

【Java学习笔记】&lt;集合框架&gt;对字符串进行长度排序

1 package 测试; 2 3 import java.util.Comparator; 4 5 public class ComparatorByLength implements Comparator { //定义比较器 6 7 @Override 8 public int compare(Object o1, Object o2) { 9 String s1 = (String)o1; 10 String s2 = (String)o2; 11 12 int temp = s1.len

【Java学习笔记】&lt;集合框架&gt;TreeSet,Comparable,Comparator

1 public class Person implements Comparable{ 2 private String name; 3 private int age; 4 5 public Person(){ 6 super(); 7 } 8 public Person(String name, int age) 9 { 10 super(); 11 this.name = name; 12 this.age = age; 13 } 14 15 16 @Override 17 public

【Java学习笔记】&lt;集合框架&gt;使用LinkedList来模拟一个堆栈或者队列的数据结构

1 import java.util.LinkedList; 2 3 public class Test5 { 4 5 public static void main(String[] args) { 6 7 Duilie dl = new Duilie(); 8 9 dl.myAdd("abc1"); 10 dl.myAdd("abc2"); 11 dl.myAdd("abc3"); 12 dl.myAdd("abc4");

Java集合框架学习笔记之集合与Collection API

一.CollectionAPI 集合是一系列对象的聚集(Collection).集合在程序设计中是一种重要的数据接口.Java中提供了有关集合的类库称为CollectionAPI. 集合实际上是用一个对象代表一组对象,在集合中的每个对象称为一个元素.在集合中的各个元素的具体类型可以不同,但一般说来,它们都是由相同的类派生出来的(而这一点并不难做到,因为Java中的所有类都是Object的子类).在从集合中检索出各个元素是,常常要根据其具体类型不同而进行相应的强制类型转换. Collection

黑马程序员——JAVA集合框架学习总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- www.itheima.com 要学好java的集合框架,必须掌握此图: Java集合框架很全面,从大的来说.它包括两种类型: 1.一种是以collection为根接口的集合. 2.另一种是由map为根接口的<key,value>的“图”. 而collection之下的set接口和list接口又有不同: 1.Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制.