集合
array:用来存储数据类型的容器; (数组接受的是对象object[] arr ;
数组中可以存放任意的对象)
问题:比较浪费内存,数组的容量是固定的,无法变化;
存放数据类型不同意
集合:存储对象的容器,对象类型是任意的,长度可变
集合的结构:collection 接口跟接口,集合的公共方法都在接口(单列集合)
集合的优势:集合中可以存放任意类型的对象,长度可变;
数组只能同一种类型变量,长度固定
集合只能存对象
Collection coll = new Array();
使用集合的目的:可以使数据的增删改查更容易
1添加元素:add( ) coll.add();
2讲一个数组中的元素添加到另外数组中addAll(collection c);
Collection coll1= new ArrayList<>();
coll1.add(李四);
coll1.add(coll);//将集合元素添加到打元素后面
3 remove(object);a.removwall(b),删除a中含有的b元素
4 清空所有的元素
coll1.clear();
5isEmpty;判断集合是否为空;
6查找是否存在指定元素
7collection 超接口
list
----------->ArrayList 是存在一个数组,添加元素很慢,
维护的是一个object[],删查找很快 默认长度是10,当长度不够使增加0.5倍
特有的方法:
ensureCapcity(int minCapacity)手动增加容量
trimTosize 调整集合容量刚好符合元素个数0
-----------------》添加元素比较快,删查找慢,元素在内存中是无序的
8
collection 根接口
* ---> List : 元素是有序 ,可以重复的
* ---> Set : 元素是无序,不可重复的
* List: 接口 (提供公有地方法)
* --->ArrayList
* ---> LinkList
*
List 中特有的方法:(list特有方法通过下标操作元素)
1.增加 :
add(int index, E element);
addAll(int index, Collection<? extends E> c)
将指定的位置保留为另外一个集合。
List<E> subList(int fromIndex, int toIndex)
2.获取:
get(int index)
3.查找:
indexOf(Object o)
lastIndexOf(Object o)
//迭代器
listIterator()
4.删除
remove(int index)
5.更新:
set(int index, E element)
//List 集合中特有的方法 都是通过下标来操作的。
contain(object);判断集合中是否含有某一对象,实际上还是以equals,如果比较的自定义的对象这个时候可能需要重写equals 和hashcode方法
a.containsAll(b)判断a中shifou包含b集合;
isEmp,判断集合是否为空。。。
将集合转换为数组,toArrray();
9
迭代器 :
* 用来操作集合中的元素,增删 , 获取集合中的对象。
*
* Iterator : 迭代器的超级接口 : 所有的迭代器接口都是继承Iterator
*
* 迭代器中常用的方法:
* hasNext(); //判断当前指针指向的位置是否存在元素
* next(); // 获取当前指针指向元素的。 当这个方法被调用一次后指针就会下一次。
* remove(); // 删除最后一次出现对象
迭代器使用的注意事项: 当你用迭代器来操作集合中的元素时,不要再用集合来操作元素
* java.util.ConcurrentModificationException : 原因:用迭代器操作了属性后又用集合操作属性。
*/
10LinkList
1 集合对象
LinkedList list = new LinkedList();
list.add("小明");
System.out。println(list);
如果集合中没有找到元素,就会抛出异常
2数据结构:
list.push("狗蛋");向集合的锥站中推入一个值
pop ,与push(先进先出)
list.offer();poll();
3返回逆序迭代器对象
descendingIterator
11 Vector :描述的是一个线程安全的ArrayList使用和ArayList一样
Vector 和ArrayList 的区别
相同点:都是通过object 数组来实现的
不同点:1ArrayList 是线程不同步的,操作效率高,Vector 线程是同步的,效率低
2ArrayList 实在jdk1.2 出现,vect 实在1.0的时候出现的
12
Set集合接口:继承Collection接口 ,特点:无序的不能用索引来取值
13 哈希表:(表以桶式结构存放数据)
如果我计算的位置上没有任何元素,将对象放在位置上;
如果我计算的位置上已经存在对象,这个时候就将姚村的对象作比较 ;如果equals返回的是true,对象就是重复 的,false就把对象添加到该位置
14 TreeSet:使用元素的自然顺序进行排序,底层使用二差数实现;
注意点 1你存进去的对象需要具备自然排序的特性,那么存入的元素就会通过自然排序进行排序
2如果添加元素,不具备自然排序的特性,那么这个时候就必须实现comparable接口,将元素比较规则定义到comparTo方法中, comparable比较规则:返回一个零,负数或者整数,分别表示相等,小与和大于
2往Treeset里添加对象的时候,如果对象有这个自然排序的特性,就按照自然排序进行排序
3添加对象的时候,如果对象本身不具备自然排序,运行就会报错,如果要储存对象,那么对象的类就必须实现comparable接口把元素比较的规则定义写在compareTo中
4添加元素,如果对象本身不具备自然排序的特性,并且没有实现Comparable接口,那么这个时候就需要创造,一个TreeSet的时候传入一个比较器
比较器的定义方式:
class 类名 implements Compartor{
}
5 如果类中实现了cpmparable 接口,又创建treeSet时传入了一个比较器,这个时候比较器为标准
字符串的字符中第一个值进行比较,通过自然排序比较,知道无法比较,
这个时候就比较字符串的长度 ;
15 泛型:
java jdk 1.5新推出来的特性,好处:1将运行时的错误提前到编译时
2避免了我们无谓的强制类型的转换
自定义方法泛型:自定义类型就是一个数据类型的占位或一个数据类型的变量,一般T和E来做 段位符号
格式:
<占位符>:定义了一个泛型
如果你传进去的是基本数据类型:接受的时候已改用他的包装来接收
泛型方法的注意点:
1泛型方法自定义一个泛型数据实在实际参数传递时被确定的;
2泛型所用标识符需要符合标识符规范,一般大写字母
16 自定义数组的泛型类
泛型类使用注意点:
1泛型类定义的自定义泛型的类型是在创建这个类对象时确定的
2如果一个自定义泛型的类,在创建对象时,默认为object类型
3静态方法不能够使用这个类伤自定的泛型
类上定义泛型:
格式:class 类名<声明自定义类型>{}
泛型接口:泛型接口定义方式
interface 接口名《声明自定义泛型》{
}
接口泛型的使用注意点:
1.接口上自定义泛型实在接口的时候被指定的
2如果实现接口没有被指定接口,就会默认为object
3如果需要在创建接口实现类对象是指定对象,那么需要格式:
class 类名《声明自定义泛型》implement 接口《声明自定义泛型》