集合

来源:互联网 发布:仙剑奇侠传3mac版 编辑:程序博客网 时间:2024/05/18 03:28

数组:存储同一种数据类型的集合容器

数组特点:

  • 1.只能存储同一种数据类型的数据
  • 2.一旦初始化,长度固定
  • 3.数组中的元素与元素之间的内存地址是连续的
    注意:Object类型的数组可以存储任意类型的数据

集合:集合是存储对象数据的集合容器

集合对比数组的优势:

  • 1.集合可以存储任意类型的对象数据,数组只能存同一类型的数据(Object类型数组除外)
  • 2.集合的长度是会发生变化的,数组的长度是固定的。

  • Collection //单例集合的根接口

    • List
    • Set 

【List集合】如果是实现了List接口的集合类,具备的特点:有序的,可重复的(有序的:指的是添加的顺序和出来的顺序是一致的)
【Set集合】如果实现了Set接口的集合类,具备特点:无序的,不可重复的

Collection中的方法:

增加    add(E e)  //添加成功返回true,添加 失败返回false.【e->element元素:指的是要添加进集合的元素】    addAll(Collection c)  //把一个集合 的元素添加到另外一个集合中去。删除    clear() //清空集合    remove(Object o)  //删除指定的元素o,删除成功返回true,否则返回false    removeAll(Collection  c)  //删除两个集合的交集元素【只删除集合的,用于运算的集合的元素不改变】    retainAll(Collection  c)  //保留两个集合的交集元素 查看    size()  //查看集合长度判断    isEmpty()  //判断是否为空集合    contains(Object o)  //判断集合中是否存在指定元素    containsAll(Collection<?> c)  //判断是否包含c集合中的所有元素迭代    toArray()  //把集合中的元素全部存储到一个Object类型的数组中返回    iterator() 

List接口

  • List //List list=new arrayList();【arrayList();是List的实现类,List是接口,不能直接创建对象】

List接口中特有方法:

添加    add(int index, E element)     addAll(int index, Collection<? extends E> c) 获取:    get(int index)     indexOf(Object o)     lastIndexOf(Object o)     subList(int fromIndex, int toIndex) 修改:    set(int index, E element) 迭代    listIterator() 

List接口中特有的方法具备的特点:操作方法都存在索引值

List接口下的实现类:

—-| List
——–| ArrayList

——–| LinkedList

——–| Vector(了解即可)

===ArrayList底层维护了一个Object类型的数组实现的,特点:查询快,增删慢[一般用于查询比较多的数据存储]

ArrayList 特有的方法:
ensureCapacity(int minCapaci上ty)
trimToSize()

===LinkedList底层使用了链表数据结构实现的[链表结构:元素=数据内容+下一个元素的内存地址],特点:查询慢,增删快

Linkedlist特有的方法:
1:方法介绍
addFirst(E e)
addLast(E e)

    getFirst()     getLast()     removeFirst()     removeLast() 2:数据结构    1:栈 (1.6)  : 主要是用于实现堆栈数据结构的存储方式。        先进后出        push()         pop()    2:队列(双端队列1.5): 主要是为了让你们可以使用LinkedList模拟队列数据结构的存储方式。        先进先出        offer()        poll()3:返回逆序的迭代器对象          descendingIterator()   返回逆序的迭代器对象

===Vector(了解即可):底层也是维护了一个Object数组实现的,实现月ArrayList一样的,但是Vector是线程安全的,但操作效率低

笔试题目:

使用ArrayList无参的构造函数创建一个对象时,默认的容量为多少?如果不够用自动增加多少

——–ArrayList底层是维护了一个Object数组实现的,使用无参构造函数时,Object数组默认容量为10,当不够用的时候自动增加0.5倍。

说出ArrayList与Vector的区别?

——–相同点:ArrayList与Vector底层都是使用了Object对象实现的
不同点:
1.ArrayList是线程不同步的,操作效率高。
2.

===迭代===

【迭代】listIterator()具备Iterator接口的所有方法

ListIterator it=list.listIterator(); //获取迭代器

ListIterator特有的方法:

添加:    hasPrevious()  判断是否存在上一个元素。    previous()    当前指针先向上移动一个单位,然后再取出当前指针指向的元素。    next();  先取出当前指针指向的元素,然后指针向下移动一个单位。

    add(E e)   把当前有元素插入到当前指针指向的位置上。    set(E e)   替换迭代器最后一次返回的元素。

【注意】迭代器在迭代元素的过程中不能使用集合对象的方法,改变集合元素中的个数,如果需要添加或删除只能使用迭加器的方法进行操作。如果使用了集合对象改变集合中元素个数就会出现ConcurrentModificationException异常。

[迭代元素的过程]:迭代器创建到使用结束的过程

====Set接口===

——–| Collection

————| List

————| Set

Collection //单例集合的根接口
List //如果是实现了List接口的集合类,具备的特点:有序的,可重复的
Set //如果实现了Set接口的集合类,具备特点:无序的,不可重复的【无序:添加或输出的元素是无序的】

set接口特有的方法:没有
set接口的重要实现类:HasHset | TreeSet

===hashSet===

实现原理:底层是使用了哈希表来支持的,特点: 存取速度快. 往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值,然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置。情况1: 如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行 添加。

===treeSet===

TreeSet->如果元素具备自然顺序 的特性,那么就按照元素自然顺序的特性进行排序存储。

TreeSet的存储原理:
底层使用红黑树(二叉树)数据结构实现。
存储规则:左小右大
treeSet要注意的事项:
1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o)方法上。
3. 如果比较元素的时候,compareTo()方法返回的是0,那么该元素将被视为重复元素。不允许添加。注意(TreeSet与HashCode.equals方法没有任何关系)
4. 往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而且元素所属的类也没实现Comparable接口,那必须要创建TreeSet的时候传入一个比较器:[推荐使用]
比较器: 自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在compare方法内即可。

    class 类名 implements Comparator{    }5.  往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口, 在创建TreeSet对象的时候也传入了比较器,那么是以比较器的比较规则优先使用。

TreeSet是可以对字符串进行排序 的, 因为字符串已经实现了Comparable接口。

字符串的比较规则:
情况一: 对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。
情况 二:对应位置上 的字符都一样,比较的就是字符串的长度。

========泛型========
[泛型]JDK1.5使用的新特性

好处:
1.将运行时的异常提前至编译时。
2.避免了无谓的强制类型转换。

泛型在集合中的常见应用:
ArrayList list = new ArrayList(); //注意: 泛型没有多态的概念,左右两边的数据 类型必须 要一致,或者只是写一边的泛型类型。

[以下两种写法主要是为了兼顾新老系统的兼用性问题。]    ArrayList<String>  list = new ArrayList();     ArrayList    list = new ArrayList<String>();

自定义泛型:自定义泛型就是一个数据类型的占位符或者是一个数据类型的变量。

方法上自定义泛型:================

修饰符  <声明自定义的泛型>返回值类型    函数名(参数数据类型(自定义的泛型),形参){---方法体----}eg. public static <T>T getData(T o){--方法体--};

【在泛型中不能使用基本数据类型,如果需要使用基本数据类型,那么就使用基本数据类型对应的包装类型。】
byte——> Byte
short—–> Short
int——-> Integer
long——> Long
double—-> Double
float —-> Float
boolean—> Boolean
char——> Character
方法泛型注意的事项:
1. 在方法上自定义泛型,这个自定义泛型的具体数据类型是在调用该方法的时候传入实参时确定具体的数据类型的。
2. 自定义泛型只要符合标识符 的命名规则即可, 但是自定义泛型我们一般都习惯使用一个大写字母表示。[T Type] [E Element]

泛型接口==============

泛型接口的定义格式:
interface 接口名<声明自定义泛型>{ }

泛型接口的实现:
public class Demo4 implements Dao{ }

泛型接口要注意的事项:
1. 接口上自定义的泛型的具体数据类型是在实现一个接口的时候指定 的。
2. 在接口上自定义的泛型如果在实现接口的时候没有指定具体的数据类型,那么默认为Object类型。

需求: 目前我实现一个接口的时候,我还不明确我目前要操作的数据类型,我要等待创建接口实现类 对象的时候我才能指定泛型的具体数据类型。

泛型的上下限:==============

需求1: 定义一个函数可以接收接收任意类型的集合对象, 要求接收的集合对象只能存储Integer或者是Integer的父类类型数据。
需求2: 定义一个函数可以接收接收任意类型的集合对象, 要求接收的集合对象只能存储Number或者是Number的子类类型数据。

泛型中通配符: ?
泛型的下限:
? super Integer : 只能存储Integer或者是Integer父类元素。
public static void getData(Collection

0 0
原创粉丝点击