JAVA集合

JAVA集合框架(Java Collection Framework[JCF])
有Oracle公司提供的一组操作数据集合的API
由一系列的接口和实现类,工具类所组成,
它是作为一种"容器"对象而存在的,我们可以理解为是数组的拓展.

包:java.util

JCF结构
Collection(I)
|- List(I)
-ArrayList©
-LinkedList©
-Vector©

|- Set(I)
	\-HashSet(C)
	\-SortedSet(I)
		\-TreeSet(C)

List的特点:有序,可重复
Set的特点:无序,不可重复
SortedSet是Set的一个分支,它的特点:,有序,但是不可重复

Map(I)
-HashMap©
-HashTable©
-SortedMap(I)
-TreeMap©

Map的特点:只针对KEY值无序,不可重复
SortedMap是Map的一个分支,它的特点是针对KEY值排序,但是不可重复

注:
Collection中存放的是值本身,而Map中是以KEY-VALUE的形式存在的
(键-值对)

Collection中的公共方法:

add(Object obj);//添加对象到集合中
remove(Object obj);//从集合中移除对象
size();//得到集合中的元素个数
isEmpty();//判断集合是否为空
clear();//清空集合元素
toArray();//得到集合元素数组

Iterator iterator();//返回集合的迭代器

List(有序,可重复)
实现类:
1)ArrayList
底层实现是动态数组,查询效率高,因为数组可以通过下标去访问,
但是,删除和插入的效率低下,因为要做数组元素的移动.

2)LinkdedList
底层实现是双向链表,它的插入和删除元素的效率高,因为只需要
对相关的两个节点进行操作即可,不影响其他节点.
但是,查询效率低下,因为都需要从根节点依次向下去查询.

3)Vector
Vector是重量级集合框架,线程安全,效率低
ArrayList是轻量级集合框架,线程非安全,效率高

由于LinkedList的特点,非常适合用来做堆栈和队列的这种数据结构
堆栈特点:先进后出(FILO)
队列特点:先进先出(FIFO)

Set(无序,不可重复)
实现类:
1.HashSet
常用方法与Collection一样

HashSet的底层实现是:散列表(Hash表)
与HashMap一样,其本质上,在HashSet中,就只组合了HashMap
使用HashMap的Key,而Value是null.

HashSet是如何来实现元素无序且不可重复的?
答:当你把一个对象添加到HashSet容器中,首先,系统会调用
这个对象的hashCode方法,得到一个散列码,然后,根据这个
散列码来决定把这个元素放到什么位置.
第二个元素加入时,如果它的散列码与之前的相同,就这个
位置被占用了,这时还不能确定两个对象是同一个.那就会
调用这个对象的equals方法,如果equals方法也返回true,
那么表示这个对象已近存在了,就不再加入.

2.SortedSet接口
特点:排序,不可重复
实现类:TreeSet
底层是采用平衡树(二叉树)算法来实现的

 要实现排序,必须要依赖排序接口
 JCF中提供了两种方式:
方式一:java.lang.Comparable接口
方法:
public int compareTo(Object other)
//比较当前对象和other

方式二:java.util.Comparator接口
方法:
public int compare(Object o1,Object o2)
//比较o1和o2对象

3.TreeSet的原理
1)如果不是Comparator做为参数来构造,
则此类将利用Comparable接口来实现排序和不重复

会要求你添加到TreeSet中的元素必须实现Comparable接口,
从第二个元素开始,就会回调添加入元素的compareTo方法,
以之前加入的元素作为参数,来决定大小.

2)如果是以Comparator为参数来构造,则就会利用Comparator来
实现排序和不重复.
此时,就不再需要元素实现Comparable接口,而是通过
Comparator比较器比较排序.
从第二个元素开始,就会回调Comparator的compare方法,
传入两个对象,从而决定大小.

Map特性:
Map是采用键-值对来存储数据的集合

常用方法:
put(Object key,Object value);//把key/value加入map中
get(Object key)//根据key来得到value值
isEmpty();
size();
clear();
containsKey(Object key);//判断当前map是否含有key
containsValue(Object value);//判断当前map是否含有value

//迭代方法(把Map转换成Set,再迭代)
public Set keySet();//把Map中的key拿出来放入Set,并且返回
public Collection values();
//把Map中的全部的value拿出来放入Collection,并且返回
public Set<Map.Entry> entrySet();
//把Map中的key和value封装成一个Map.Entry对象,并且放入Set,
并返回

实现类:
1)HashMap
构造方法:
public HashMap(){} //构造空的HashMap对象
public HashMap(Map map){} //根据另一个Map的内容来构 造新的Map

HashMap的底层也是散列表(Hash表),但是它只针对做为Key的对象
采用散列算法,从而决定存放位置以及是否重复.
所以对于HashMap来说,Key相同,则代表对象是重复的,因此,我们
只要保证key不同就可以了.

一般而已,我们可以直接采用String类型或者包装类型做为Map的
Key类型,而自定义类型做为Value类型.

HashMap的特点(和HashSet是一样的)
a.无序
b.不可重复(key不可重复)

2)TreeMap与TreeSet的关系
TreeSet中组合了TreeMap,使用它key来存放值,而value全部
使用一个对象(Object)填充.

工具类:java.util.Collections
本类提供了JCF中常见的操作,都是静态方法

Collections的常用方法:
public static void sort(List list);//排序
public static void sort(List list,Comparator c);
public static void shuffle(List list);//随机打乱顺序
public static void fill(List list,Object obj);//填充
public static void reverse(List list);//反转顺序

对象做比较实用的接口
1.java.lang.Comparable,可比较的接口
直接调用Collections.sort(List list)方法时,要求加入此
List集合中的元素要实现Comparable接口,并且重写compareTo
(Object o)方法.

2.java.util.Comparator,比较器接口
调用Collections.sort(List list,Comparator c)方法时使用,
重写compare(Object o1,Object o2);

Collection和Collections的区别

Collection是一个接口,有List和Set两个接口,分别有各自的实现类.
Collecitons是一个工具类,提供集合框架操作的一些方法
如:排序,打乱等.


删除集合元素问题:

错误1:
要删除的图书如果是相邻时,则第二本书删除不成功

原因:
当前一本书删除时,后一本书自动向前移动一个位置,
而此时下标已经向后移动一个位置了,所以,正好错位.

改正:
1.删除完元素过后添加i–
2.把i++的位置移动到删除判断的else语句块中
3.反向遍历删除

错误2:
并发异常,ConcurrentModificationException

原因:
集合迭代器是只读的,不能同时进行查询(遍历)和修改操作

改正:
不使用的删除方法,改用迭代器自身的删除方法.


属性类:
java.util.Properties

此类也是Map的一个实现类,它继承于HashTable.
但是,与Map不同的是,Properties的KEY和VALUE只能是String类型的

在Java中,有一个类的文本文件称之为属性文件,它的格式如下:
#注释(以#开头,不属于属性文件的内容)
key1 = value1
key2 = value2
key3 = value3

常用方法:
public Properties();//空构造
String getProperty(String key);//通过key值来获取value
void load(InputStream in);//把属性文件加载进Properties中

加载属性文件:
String filepath = “file/config.properties”
Properties pros = new Properties();
//获取属性文件的输入流
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(filepath);

//InputStream in = new FileInputStream(filepath);
pros.load(in);

应用:
写一个属性文件,如下
ui.prompt = please enter your name
ui.file = File
ui.edit = Edit

我们可以通过System.getProperties()方法来获取当前系统的信息
这些信息属性都是以key-value形式来存放的.


枚举(Enum)
定义:是一种类型安全的常量类,所以,也是一种数据类型
在JVM规范中,所有的枚举都自动继承于java.lang.Enum类
要定义一个枚举,使用关键字:enum

定义枚举的语法:
public enum 枚举名{
//枚举常量

//方法[可选]

}

如:
public enum Gender{
FEMALE
,MALE;
}
//使用
public class Student{
private String stuno;
private Gender gender;//性别

public void setGender(Gender g){
this.gender = g;
}
}
//创建学员对象
Student s = new Student(“1000”,Gender.MALE);

枚举的原理
在JDK5.0之前,要定义一个类型安全的常量:
public class Season{
public static final Season SPRING = new Season();
public static final Season SUMMER = new Season();
public static final Season AUTUMN = new Season();
public static final Season WINTER = new Season();

public Season(){...}

}
//使用者:
public class Test{
public static void test(Season season){

}
}
//调用者:
Test.test(Season.SPRING);

在JDK5.0之后,使用枚举
public enum Season{
SPRING
//相当于public static final Season SPRING = new Season();
,SUMMER
,AUTUMN
,WINTER;
}

java.lang.Enum类
常用方法:
public String name();//返回此枚举的常量名称

通过调用枚举的values()方法,可以得到这个枚举中所有常量的一个数组

枚举的特点:
1.每一个枚举常量都是枚举类的一个实例
2.枚举的构造方法一定是私有的
3.枚举可以有属性,方法和构造方法
4.也可以有抽象方法,如果有抽象方法,则每个枚举常量都必须实
现这个抽象方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值