Java容器类

容器(collection)
Collection表示一组对象,它是集中,手机的意思,就是把一些数据收集起来。
Collection函数库是在java.util包下的一些接口和类,类是用来产生对象存放数据用的,而接口是访问数据的方式。
Collection函数库与数组的的两点不同:
1.数组的容量是有限制的,而Collection库没有这样的限制,他容量可以自动的调节。
2.Collection函数库只能用来存放对象,而数组没有这样的限制
Collection接口是Collection层次结构中的接口,它定义了一些最基本的访问方法,让我们能用统一的方式通过它或它的子接口来访问数据。
区别:Collection代表一组对象,Collection函数库就是java中的集合框架,Collection接口,是这个集合框架中的根接口。
存放在Collection库中的数据,被称为元素(element)
list子类
ArrayList:底层实现是数组,线程不安全
LinkedList:底层实现是链表,线程不安全
Vector:线程安全,效率低
实现Map接口的类用来存储键(key)-值(value)对。
Map接口的实现类有HashMap和TreeMap等
Map类中存储的键-值对通过键来标识,所以键值不能重复。
HashMap中底层所使用的算法是哈希码
Map底层结构是数组+列表
HashCode 两个内容相同的对象应该具有相等的hashcode
equals
Set接口是Collection接口的子接口,Set接口没有提供额外的方法,Set接口的特性是容器类中的元素是没有顺序的,而且不可以重复。
Set容器可以与数学中“集合”的概念相对应。
J2SDK API所提供的容器类有HashSet,TreeSet等。
set底层是用Map实现的
retainAll()取交集
迭代器遍历
所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
Iterator接口定义了如下方法:
Boolean hasNext();//判断是否有元素没有被遍历
Object next();//返回游标当前位置的元素并将游标移动到下一个位置
void remove();//删除游标左面的元素,在执行完next之后,该操作只能执行一次
void remove();
map 利用key进行迭代
增强for,必须实现java.lang.Iterable接口,重写iterator方法
泛型:泛型就是参数化类型,使用广泛的类型
起因:数据类型不明确:
—装入数据的类型都被当做Object对待,从而丢失自己的实际类型。
-获取数据时往往需要转型,效率低,容易产生错误。
作用:
-安全:在编译时检查类型安全
-省心:所有的强制转换都是自动和隐式的,提高代码的重用率
泛型类:定义类时使用泛型
1)格式:<>
class 类名 <字母列表>{
        修饰符 字母 属性;
        修饰符 构造器(字母){
        }
        修饰符 返回类型 方法(字母){
        }
}
-不能使用在静态属性、静态方法上,更不能用在全局常量上
2)使用时指定具体类型
1.编译时会进行类型检查
2.获取数据时不需要强制类型转换
-泛型使用时不能指定基本类型
泛型常见字母
-T Type表示类型
-K V 分别表示键值中的Key,Value
-E 代表Element
-? 表示不确定类型
泛型接口:定义接口时使用泛型
1.格式:<>
interface 接口名<字母列表>{
        修饰符 返回类型 方法(字母);
}
接口中泛型字母只能使用在方法中,不能使用在全局常量中
泛型方法
定义使用:<字母>
修饰符<字母>返回类型 方法名(字母){
        
}
要定义泛型方法,只需将于泛型参数列表置返回值前。
只能访问对象的信息,不能修改信息
注意:泛型还可以定义在方法中,是否拥有泛型方法,与其所在的类是否泛型没有关系。
子类与父类|接口一样使用泛型
子类声明时指定具体的类型
子类为泛型类,类型在使用时确定
子类与父类|接口 同时擦除类型
子类泛型,父类|接口擦除
—错误:不能子类擦除,父类|接口泛型
擦除用Object对待
要么同时擦除,要么子类大于父类的类型
1.属性类型
父类中,随父类而定
子类中,随子类而定
2.方法重写:
随父类而定
1.继承|实现声明时不指定类型
2.使用时不指定类型
*统一Object对待
1.编译器警告(消除警告使用<Object>)
2.不完全等同于Object,编译(擦除)时不会类型检查
泛型没有多态
-直接使用A<Object>a=new A<String>();错误
-方法形参与返回类型也不存在泛型多态
3.不能使用intanceOf判断是否为泛型实例
通配符:? extends super
1.可以用在声明类型及声明方法参数上,不能用在声明类上或使用它
2.?可以接受泛型的任意类型,只能接收和输出,不能修改
**方法声明时参数无法知道具体的类型,因此不能修改**
3.?extends 泛型上限 <= 指定类型 子类或自身
4.? super 泛型下限   >= 指定类型 自身或父类
泛型嵌套
1.声明:嵌套的使用
A<B<C>> a=new A<B<C>>();
2.使用:从外到内,一层层拆分
与调用没有热河关系,只是确定了类型而已
泛型与数组,不能创建泛型数组
可以声明,可以使用'?'
A<String>[]a1=null;
A<?>[]a2=new A<?>[10];
jdk7改进:声明时指定泛型即可,创建对象不用再次编写类型
如:A<String>a=new A<>();
HashMap存储
“分拣思路”
1.为所有的key创建容器
  之后容器中存放对应的value
2.第一次创建容器,并存放value
  第二次之后直接使用容器存放值
排序:将一组数据按相应的规则排列顺序
1.规则:
—基本数据类型:如数据,就是日常的大小排序
—引用数据类型:
a)内置类(String,Integer等),内部已经指定规则,直接使用即可
b)自定义类,需要按业务规则排序
2.顺序:
—升序 从小到大
—降序 从大到小
3.排序:算法 如冒泡、选择、插入 shell 堆等等

"排序"的实体类都实现了java.lang.Comparable接口,Comparable接口中只有一个方法
public int compareTo(Object obj);
该方法:
返回 0 表示 this==obj
返回正数 表示 this>obj
返回负数 表示this<obj
实现Comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式

引用数据类型
内置类
1.整数、小数Integer Float Double直接比较基本数据类型的大小
2.字符:比较unicode码之差
3.字符串:
1)如果其中一个是另外一个开始的字串,返回长度之差
2)否则返回第一个不相等的unicode之差
4.Date:将日期长整形数进行比较
自定义类
1.实体类java.lang.Comparable +compareTo
2.业务排序类 java.util.Comparator+compare

Comparator
—提供排序的比较器,业务比较器
—重写public int compare(T o1,T o2);
作用:
—解耦:独立与实体类
—方便:便于应对各种排序规则

Collections工具类,提供了大量便于处理容器的方法(默认升序)
关于:排序方法
-1.public static<T extends Comparable<? super T>>void sort(List<T>list)
-2.public static <T>void sort(List<T>list,Comparator<?super T>c)
排序容器(只是不用自己排序而已!!)
TreeSet在添加数据时排序,数据更改不会影响原来的顺序
不要修改数据,否则可能重复(可以加final修饰,使数据不能被修改)
TreeSet:数据元素可以排序且不重复 比较等于0即重复
对比:Set接口:HashSet元素必须重写HashCode和equals方法
1)元素可以排序 java.lang.Comparable+compareTo
new TreeSet()
2)排序业务类:java.util.Comparator+compare
new TreeSet(Comparator<? super E> comparator)
TreeMap:要求键可以排序,与TreeSet同理
Collections 常用方法举例
binarySearch(List<? extends Comparable<? super T>> list, T key)
使用二分搜索法搜索指定列表,以获得指定对象(必须容器有序)
sort(List<T>list);
sort(List<T>list,Comparator<? super T>c)
reverse(List<?>list)
反转指定列表中元素的顺序
shuffle(List<?>list)
使用默认随即圆对指定列表进行置换
shuffle(List<?>list,Random rnd)
使用指定的随即源对指定列表进行置换
swap(List<?>list,int i,int j)
在指定列表的指定位置处交换元素
队列Queue与Deque
Queue:单向
-队列通常FIFO
-优先级队列和堆栈LIFO(后进先出)
Deque:双向
全名double-ended Queue,是一种具有队列和栈的性质的数据结构,双端队列中的元素可


以从两端弹出,其限定插入和删除操作在表的两端进行。
1.此接口扩展了Queue接口,在将双端队列用作对列时,双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
2.可用作LIFO(后进先出)堆栈         
Enumeration(比较古老的接口)
枚举Enumeration,作用和Iterator类似,都是输出数据
方法:
—hasMoreElements();
—nextElement();
应用:
Vector:vector.elements();
Hashtable 与 Properties
Hashtable:Map实现类,与HashMap操作相同
区别     HashMap              Hashtable
         线程不安全           线程安全
         
         键最多一个null       键与值都不能为null
         值可以为多个null
父类     AbstractMap           Dictionary 

Properties (HashTable的子类) 键与值只能为字符串
1.作用:读写资源文件
常用方法
-getProperty(String key)
-setProperty(String key,String value)
-store(OutputStream out,String commments)  后缀:.properties
-storeToXML(outputStream os,String comments) 后缀:.xml 默认utf-8
-storeToXML(OutputStream os, String comment, String encoding)
-load(InputStream inStream)
-loadFromXML(InputStream in)

类加载资源文件**
1.类.class.getResourceAsStream("/")
2.Thread.currentThread().getContextClassLosder().getResourceAsStream("")
引用类型(强 ,软 ,弱 ,虚)与WeakHashMap
引用分类:
-强引用StrongReference:引用指向对象,gc(Garbage Collection)运行时不回收
-软引用SoftReference:gc运行时可能回收
-弱引用WeakReference:gc运行时立即回收
常量池对象,不会被回收
-虚引用PhantomReference类似于无引用,主要跟踪对象被回收的状态,不能单独使用,
必须与引用队列(ReferenceQueue)联合使用
目的:避免对象长期驻留在内存中,解决垃圾回收机制回收时机问题
WeakHashMap:
键为弱引用
回收键后自动删除key-value对象
IdentityHashMap:
键比较以地址去重,而不是比较hashcode与equals
注意:键只是常量池中的字符串
EnumMap:
键必须为枚举的值
构造器:public EnumMap(指定枚举class对象)

同步控制:多线程并发访问集合的线程安全
1.常用容器ArrayList HashSet HashMap等都是线程不安全的
2.Collections提供了synchroizedXxx(),将指定容器包装成同步
synchronizedList();
synchronizedSet();
synchronizedMap();
不可变设置:“只读”访问,Collections提供了三种方法
1.emptyXxx() 空的不可变集合
2.singletonXxx() 一个元素不可变的集合
3.unmodifiableXxx()  不可变容器
开源工具包:
—Guava:Google Collection
Google的工程师开发的集合库,它是对jdk提供的扩展,提供了很多实用的类来简化代码
—Apache Commons Collection
容器重点总结
一.       <interface>Collection                   <interface>Map
<interface>Set       <interface>List        
HashSet            LinkedList     ArrayList    HashMap
Set没有顺序,不可重复
List有顺序,可以重复
二.
1.迭代器
1)java.util.Iterator+hasNext()  next()  remove()
2)foreach:java.lang.Iterable+iterator()
2.比较器
1)实体类可以排序 java.alng.Comparable+compareTo()
2)排序比较器(可以解耦)java.util.Comparator+compare
List+Collection.sort()
TreeSet
TreeMap
3.泛型;<>
泛型类、泛型方法、泛型擦除、通配符?extends super泛型嵌套
三.六个接口
Collection Set List Map Iterator Comparable

四.九个常用类
ArrayList  HashMap  Properties等
1.ArrayList:数组 查看多于修改
方法:add(Element e)   add(Index i,Element e)
remove(Index i)  remove(Element e)
set(Index i,Element e)  get(Index i)
遍历:for+get    foreach   Iterator ListIterator
2.Linkedlist:链表,修改多于查看,多了些链头与链尾的方法
3.HashSet:重写hashcode+equals
方法:add  remove
遍历:foreach   Iterator
4.TreeSet:元素可以排序,或者提供排序的业务类
5.HashMap:键不能重复,必须重写hashcode+equals,值可以重复
方法:put(K,V) remove(K) get(K) containsKey  containsValue
6.Properties:资源配置文件 相对路径获取文件(是HashTable的子类)
7.键和值都不能为null
8.Stack:栈
9.Collections:工具类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值