黑马程序员------- 集合-------

来源:互联网 发布:腾讯云主机绑定域名 编辑:程序博客网 时间:2024/06/07 05:37
集合类
集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

Collection层次结构 中的根接口。集合只能用于存储对象,长度可变.

每一个容器对数据的存储方式不同,这种存储方式叫做:数据结构!

 

Collection:层次结构 中的根接口

List  :序列,有序的 collection(也称为),列表通常允许重复的元素。

Set :一个不包含重复元素的 collection

 

Collection

List:元素是有序的,元素可以重复。因为该集合体系有索引。

ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。

LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。

Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。

Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、

HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

HashSet是如何保证元素唯一性的呢?

是通过元素的两个方法,hashCodeequals来完成。

如果元素的HashCode值相同,才会判断equals是否为true

如果元素的hashcode值不同,不会调用equals

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcodeequals方法。

 

保证元素唯一性的原理:判断元素的hashCode值是否相同。

如果相同,还会继续判断元素的equals方法,是否为true

 

TreeSet:可以对Set集合中的元素进行排序。使用元素的自然顺序对元素进行排序

底层数据结构是二叉树。

保证元素唯一性的依据: compareTo方法return 0.

 

TreeSet排序的第一种方式:让元素自身具备比较性。

元素需要实现Comparable接口,覆盖compareTo方法。

也种方式也成为元素的自然顺序,或者叫做默认顺序。

 

TreeSet的第二种排序方式。

当元素自身不具备比较性时,或者具备的比较性不是所需要的。

这时就需要让集合自身具备比较性。

在集合初始化时,就有了比较方式。

Set集合的功能和Collection是一致的。

迭代器:.

迭代器获取信息格式

Iterator<String> it = ts.iterator();

while(it.hasNext())

{

Person p = (Person)it.next();

sop(p.getName()+"::"+p.getAge());

}

迭代器获取信息格式

 

技巧小代码

public static void sop(Object obj)

{

System.out.println(obj);

}

一.List 有序, 可重复  1.ArrayList 数组结构, 查找快, 增删慢  2.LinkedList 链表结构, 增删快, 查找慢  3.Vector原理和ArrayList相同, 线程安全, 效率低, 已被淘汰 4.List集合的迭代 a.普通for循环 由于List是有序的, 我们可以通过索引逐个获取, 定义for循环从0循环到length-1, 逐个获取元素 b.迭代器Iterator 使用List的iterator()获取迭代器对象 使用hasNext()判断是否有下一个 使用next()获取下一个 c.枚举Enumeration使用Vector的elements()获取枚举 使用hasMoreElements()判断是否有下一个使用nextElement()获取下一个 d.增强for循环 for(类型 变量名 : 容器) 每次循环的时候, 会获取容器中的一个元素用变量引用实现了Iterable接口的类都可以使用b和d两种方式, 增强for循环是JDK5新增的方法, 其内部就是使用Iterator来完成的 5.循环中删除元素使用普通for循环迭代时, 删除元素后要将循环变量减1 使用迭代器迭代时, 要用迭代器的remove()而不是List的remove() 增强for循环迭代时, 不能修改  二.Set 1.HashSet 存储原理 每次存储对象的时候, 调用该对象的hashCode()方法得到哈希值, 在集合中查找是否有哈希值相同的对象. 如果没有哈希值相同的对象, 直接存入. 如果有哈希值相同的对象, 则和哈希值相同的对象逐个进行equals()比较.比较结果为false直接存入, 结果为true则不存. 过滤属性相同元素 如果我们希望HashSet能够过滤属性重复的元素, 那么就需要重写hashCode()和equals(). 属性相同的对象hashCode()方法要返回同一个哈希值, 属性相同的对象equals()方法要返回true. 为了提高效率, hashCode()方法在属性不同的时候尽量返回不同的哈希值. 2.LinedHashSet HashSet的子类, 保留了存储顺序 3.迭代Set集合 a.迭代器Iterator b.增强for循环 4.TreeSet 使用二叉树算法进行存储, 需要指定比较算法 自然顺序: 在要存储的对象的类上实现Comparable接口, 重写Comparable接口中的compareTo()方法 比较器顺序: 在构造函数中传入一个Comparator接口的子类对象, 那么TreeSet在存储对象的时候就会调用这个对象的compare方法 如果两种方式都存在, 那么优先比较器  三.Map 1.HashMap:  在每次存储键值对的时候, 调用Key对象的hashCode()方法计算一个哈希值. 在集合中查找是否有哈希值相同的Key对象. 如果没有哈希值相同的Key对象就直接存入键值对. 如果有哈希值相同的Key对象, 那么和这些相同的Key对象进行equals()比较. 比较结果为false就直接存入, 比较结果为true则将Value对象覆盖. 2.TreeMap: 使用二叉树算法对Key对象排序. 和TreeSet原理相同, 有两种指定算法的方式. 3.Hashtable: 原理和HashMap相同, 线程安全, 效率低. 不允许null键和null值 HashMap的子类, 可以保留存储顺序 5.Properties: Hashtable的子类, 通常用来操作配置文件, Key和Value都是String.   学习集合的同时,可以应用JDK5新特性对其进行操作:1.泛型 在集合指定泛型之后, 只能存储同一类型的对象, 获取对象时得到的也是该类型对象, 无序强转. 2.增强for循环 for(类型 变量名 : 容器) 3.可变参数 在参数列表中使用"类型... 变量名"形式定义一个形参, 该参数可以接收同一类型的0个,1个,多个或者一个数组.该参数只能放在参数列表的最后一个
interface Inter<T>{
public void show(T t);
}
class InterImpl<T> implements Inter<T>{
public void show(T t){
System.out.println("show :"+t);
}
}//类在实现接口的时候没有指定引用数据类型
class InterImpl implements Inter<String>{
public void show(String s){
System.out.println(s);
}
}类在实现接口的时候指定了引用数据类型

0 0
原创粉丝点击