集合框架(用到集合类 首先要导包)
面向对象语言对事物的体现都是以对象形式,所以为了方便对多个对象的操作
就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合类同事容器的区别。
数组虽然可以存储对象,但长度是固定的集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
集合框架的构成和分类
Collection
List
ArrayList
LinkedList
Vector
Set
HashSet
TreeSet
集合和对象都存的是地址
add方法的参数类型是Object,以便于接收任意类型对象
集合中存储的都是对象的引用(地址)
添加元素:
x.add("aa");
删除元素:
x.remove("aa");
x.vlear();清空集合
判断元素:
x.contains("aa"); 是否存在该元素
x.isEmpty();元素是否为空
x.size();元素和数
交集:
x.retainAll(y);x集合和y集合都拥有
迭代器:
就是集合的取出元素的方式。
就是把取出方式定义在集合内部
这样取出方式就可以直接访问集合内容的元素
那么取出方式就被定义成了内部类
而每一个容易的数据结构不同
所取出的动作细节也不一样,但是都有共性内容判断和取出,那么可以将写共性抽取
Iterator 接口
那么这些内部类都符合一个规则,该规则是Iterater.
Collection
List 元素是有序的,元素可以重复,因为该集合体系有索引
Set 元素是无序,元素不可以重复
List:特有方法:凡是可以操作角标的方法都是该体系特有的方法
增:add(index,element)
addAll(index,collection)
删:
remove(index)
改:
set(index,element);
查:
get(index)
subList(from,to)
ListIterator();
List集合特有的迭代器,ListIterator是Iterator的子接口
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生异常
所以在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的
只能对元素进行判断,取出,删除操作。
如果想要其他的操作如添加,修改等。就需要使用其子接口。(ListIterator)
该接口只能通过List集合的ListIterator方法获取
ListIterator元素都有角标
List:常见的三个子类对象
ArrayList 底层的数据结构使用的是数组结构 (查询速度快,但增删稍慢)(线程不同步)
LinkedList 底层是链表数据结构(增删速度快,查询慢)(线程同步)
Vector 底层是数组数据结构,被Array替代(增删慢,查询慢)
Vector:
枚举就是Vector的特有取出方式。和迭代器的方法一样,因为名称过长,被迭代器取代。
LinkedList特有方法
addFirst() 增加到头部
addLast() 增加到尾部
getFirst() 取头不删
getLast() 取尾不删
removeFirst() 取头删除
removeLast()取尾删除
如果集合中没有元素会出现异常
Set:元素是无序的,元素不可以重复(存入和取出的顺序不一定一致。)
HashSet:数据结构是哈希表,线程是非同步的
保证元素唯一性原理,判断元素的HashCode值是否相同
如果相同,还会继续判断元素的equals方法,是否为true
TreeSet 可以对Set集中的元素进行排序。(底层元素唯一的依据)
底层数据结构是二叉树
TreeSet 排序的第一种方式:让元素自身具备比较性。(元素需要实现Comparable接口)
这种方式也称为元素的自然顺序,或者叫做默认顺序
TreeSet 的第二种排序方法
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性,在集合初始化时,就有了比较方式
这时需要让容器自身具备比较性,定义了比较器,将比较器对象作为参数传递。
当两种排序都存在时,以比较器为主
泛型:用于解决安全问题,是一种安全机制
好处:将运行时期出现问题classCastException转移到了编译时期
方便于程序员,解决问题,让运行时期问题减少
避免了强制转换的麻烦
泛型的格式:通过<>来定义要操作的引用数据类型
使用泛型:
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可
定义泛型类
当类中要操作的引用数据类型不确定的时候早起定义object来完成扩展
现在定义泛型来完成扩展
泛型方法
泛型类定义的泛型,在整个类中有效,如果被方法使用。
那么泛型类的对象明确要操作的具体类型后,所以要操作的类型就已经固定了。
为了让不同方法可以操作不同类型而且类型还不确定:那么可以就爱那个泛型定义在方法上
静态泛型
静态方法不可以访问类上定义的泛型
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
Map:该集合存储值对,一对一对往里存。而且要保证数据的唯一性
添加: put(k key,v value)
putAll()
删除 clear()
remove(object key)
判断 containsValue(object Value)
containskey(object key)
获取 get(object key)
size()
values()
entrySet()
keySet()
Map子类的特点(和Set很像,Set底层用的Map集合)
Hashtable 底层是哈希表数据结构,不可以存储null键,null值,该集合是线程同步的
HashMap 底层是哈希表数据结构,继续是用null值和null键该集合是不同步的
TreeMap 底层是二叉树数据结构,线程不同步,可以用于给map集合中键进行排序
Map-keySet
map集合的两种取出方式
1.keySet:将map中所有的键存入到Set集合,因为Set具备迭代器
所有可以迭代当时取出所有的键,在根据get方法,获取每一个键对 应的值
map集合的取出原理,将map集合转成set集合,在通过迭代器取出。
Map-entrySet:将map集合中的映射关系存入到了Set集合中
而这个关系的数据类型就是Map.Entry
Map扩展:被使用是因为具备映射关系。
数组变集合:
Arrays:用于操作数组的工具类,里面都是静态方法
asList:将数组变成List集合
好处:可以用集合的思想和方法来操作数组中的元素。
注意:将数组变集合,不可以使用集合的增删方法,因为数组的长度是固定的
集合变数组:
Collection接口中的toArray方法
当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的 数组,长度为集合的size
当指定类型的数组长度大于了集合的size,就不会新创建了数组,而是使用 传递来的数组,所以创建一个刚刚好的数组最优。
集合变数组的好处:限定对元素的操作,不需要进行增删了
增强for循环
格式:for(数据类型 变量名:被遍历的集合式数组){}
对集合进行遍历:只能获取集合元素,但不能对集合进行操作
迭代器除了遍历,还可以进行remove集合中元素的动作,如 果使用ListIterator,还可以在遍历过程中进行增删改查的 动作。
传统for和增强for的区别
高级for有一个局限性,必须有被遍历的目标
建议:在遍历数组的时候,还是希望使用传统for因为传统for可以定义角标。
Runntime对象
该类并没有提供构造函数
说明不可以new对象,那么会直接想到该类中的方法都是静态的
发现该类中还有非静态方法
说明了该类肯定会提供了方法获取本类对象,而且该方法是静态的,并返回值类型是本类类型。
该方法是:staicRunntime.getRunntime()
(由这个特点可以看出该类使用了单例设计模式)
destroy() 杀掉子进程。
Math.Random
Math.Cell方法:返回最大于指定数据的最小整数。
Math.floor:返回小于指定数据的最小整数
Math.round 四舍五入
Math.random 返回0和1之间的随机数(和nextInt(10)相同) |
|