网站交互主要做什么/广告推广方案
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
发一下最近的笔记
集合类的由来:
对象用于封装特有数据,对象多了需要进行存储,如果对象的个数不确定
就使用集合容器进行存储
集合特点:
用于存储对象的容器
集合的长度是可变的
▲集合中不可以存储基本数据类型值
java.util:java的工具包
集合容器因为内部的数据结构不同,有多种具体容器
不断的向上抽取,就形成了集合框架
框架的顶层Collection接口
Collection的常见方法
1.添加
boolean add(Object obj);
boolean addAll(Collection coll);
2.删除
boolean remove(Object obj);
boolean removeAll(Collection coll);
void clear();
3.判断
boolean contains(Object obj);
boolean containsAll(Collection coll);
boolean isEmpty();
4.获取
int size();
Iterator iterator(); //取出元素的方法:迭代器
该对象必须依赖于具体容器,因为每一个容器的数据结构都不同
所以该迭代器对象是在容器中进行内部实现的
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可
即iterator方法
Iterator接口就是对所有的Collection容器进行元素取出的公共接口
5.其他
boolean returnAll(Collection); //取交集
Object[] toArray();
-------------------------------------------------------
Collection
List:有序(存入和取出的顺序一致),元素都有索引,可重复
Set:元素不能重复,无序
-------------------------------------------------------
List特有的常见方法:有一个共性特点,操作角标
1.添加:
void add(index, element);
void add(index, collection);
2.删除:
Object remove(index);
3.修改
Object set(index, element);
4.获取:
Object get(index);
int indexOf(object);
int lastIndexOf(object);
List subList(firstIndex, endIndex);
List
Vector:内部是数组数据结构,是同步的(几乎不用了),增删查询都慢
ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询速度快
LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快
LinkedList:
addFirst();
addLast();
getFirst(); //若链表为空会抛出NoSuchElementException
getLast();
jdk1.6后
peekFirst(); //若链表为空返回null
peekLast();
-------------------------------------------------------
Set:元素不可重复,无序
Set接口中的方法和Collection一致
HashSet:内部数据结构是哈希表,不同步
如何保证集合元素的唯一性?
是通过对象的hashCode值和equals方法来完成对象唯一性的
如果对象要存储到HashSet集合中,必须覆盖hashCode方法和equals方法
一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖
无序:是通过hash表将数值放到按照其规则规定的某个固定位置,其位置是不变的
TreeSet:可以堆Set集合中的元素进行指定顺序的排序,不同步
TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,需要实现Comparable接口,覆盖compareTo
如果不要按照对象中具备的自然顺序进行排序或者对象中不具备自然顺序,怎么办?
可使用TreeSet集合第二种排序方式二【常用】:
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法
将该类对象作为参数传递给TreeSet集合的构造方法
-------------------------------------------------------
泛型:
参数化类型,jdk1.5以后出现的安全机制
泛型命名规范:
E — Element,常用在Java Collection里,如:List,Iterator,Set
K,V — Key,Value,代表Map的键值对
N — Number,数字
T — Type,类型,如String,Integer等等
S,U,V etc. - 2nd, 3rd, 4th 类型,和T的用法一样
好处:
1.将运行时期的问题ClassCastException转到了编译时期
2.避免了强制转换的麻烦
<>:什么时候用?
当错做的引用的数据类型不确定的时候,就使用<>,将要操作的的引用数据类型传入即可
其实<>就是一个用于接收具体引用数据类型的参数范围
在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型
泛型技术是给编译器使用的技术,用于编译时期,确保了编译时的安全
运行时,会将泛型去掉。生产的class文件不带泛型,这个称为泛型的擦除
为什么擦除? 为了兼容运行的加载器(用的还是1.5以前的) //此时已向上转型
泛型的补偿:在运行时,通过获取元素的类型进行转换动作。不用使用者再强制转换 //向下转型
补偿机制通过(示例:a1.get(0).getClass().getName())获取类型而后转换
泛型的统配符:?
【此处’?’是类型实参,而不是类型形参!】
此处的?和Number、String、Integer一样都是一种实际的类型,可以把?看成所有类型的父类。是一种真实的类型。
泛型限定:对类型进行限定
? extends E
上限:接收E类型或者E的子类型对象
? super E
下限:接收E类型或者E的父类型
-------------------------------------------------------
集合的一些技巧:
需要唯一吗?
需要: Set
需要指定顺序吗?
需要:TreeSet
不需要:HashSet
但需要一个和存储顺序一致:LinkedHashSet
不需要:List
需要频繁增删吗?
需要:Linked List
不需要:ArrayList
如何记录每一个容器的结构和所属体系?
看名字!
List
ArrayList
LinkedList
Set
HashSet
TreeSet
看到array,就要想到数组,有角标,查询快
看到link,就要想到链表,增删快,add,get,remove + first last
看到hash,就要想到哈希表,想到唯一性,需要覆盖hashCode(),equals方法
看到tree,就要想到二叉树,想到两个接口,Comparable (重写compareTo),Comparator(重写compare)