1.List集合
①List集合的特点:
1,是有顺序,可重复的,因此可以根据索引查最值,和排序.,它的长度是可以改变的.它的元素可以是多种的.
2,它继承了Collection接口,所以也有了父类的功能.它特有的方法有:
1,add(int index,object obj);将一个元素添加到指定的索引前面.
2,get(int index);根据索引的位置取出该索引上的元素.
3,set(int index object obj);使用给定的集合的索引,然后去替换.自己所给定的元素.
*练习:
做一个List集合,集合中装入10个100以内不重复的数,
要求,对集合中的元素进行操作:
1.得到集合中元素的最大值,最小值。
2.对集合中的元素进行排序输出.
3.输出时,要求使用两种方式
*关于List集合的遍历.
List是Collection的子接口,所以也可以用它的迭代器来获取元素.然而他有自己特有的迭代器,ListIterator();它获取的是ListIterator对象,它和Collection的迭代器的用法一样..
*ListIterator的特性:
传统的迭代器不能在遍历中经行添加元素和交换元素的动作,会发生交换异常,但是它可以,而且它还可以对元素经行双向遍历.注意在遍历的过程添加元素只能调用迭代器的方法,不能用集合的方法添加.
*List常用的方法:
Indexof(object obj)返回该元素第一次在集合中出现的索引.
Remove( int intdex); 根据索引删除该元素!返回被删除的元素
Remove(object obj);根据给定的元素删除该元素第一次出现的位置.
*subList
public List subList(int fromIndex,int lastIndex);从指定的集合fromIndex开始,截取到lastIndex,包含开始不包含结束.返回的是一个List对象.
-------------------------------------------------------------------------------------------------------------
* List接口的具体实现类.
1.ArrayList(最重要)
1.它的底层实现是通过数组来实现的。
2.通过查看源代码,发现每一次执行add操作,它的底层数组会增长50%;
3.ArrayList集合它不是线程安全的。
2.LinkedList
3.Vector(了解)
Vector它底层也是使用数组实现的。
它每次增长100%
它是线程安全的。
了解
Enumeration---它功能相当于Iterator
Enum------它是java.util.Enum类
enum------它是一个关键字,用来声明枚举类型的。
*LinkedList
LinkedList它的底层实现是通过链表。
与ArrayList集合的区别:
1.ArrayList它的底层是使用数组实现
LinkedList底层是使用链表实现。
2.ArrayList在做遍历时效率高.
LinkedList在做删除或插入操作时效率高。
关于LinkedList它的特性方法。
它的实现是通过链表实现,所有它可以方便的对头尾元素操作。
* 开发中如何选用那个集合:
ArrayList:它是线程不安全。 如果对集合进行频繁的遍历与追加操作这时就使用ArrayList.
LinkedList 它是线程不安全。 如果对集合进行频繁的删除与插入操作,并且,常常要操作头尾元素这时使用它。
一般来说就选ArrayList就行
2,Set集合:
特点:无顺序不可重复.
研究Set集合,主要研究是它的具体实现类的特点。
1.HashSet
1.HashSet它的底层是使用hash表实现的。
2.HashSet中可以有null值。
3.HashSet是线程不安全的。
2.HashSet的使用
它所使用的方法都来自于Collection接口中的方法。
3.HashSet是怎样保证集合中的元素唯一的。(不重复)
HashSet集合它是通过equals来判断集合中的元素是否重复.(在重写equals时,要重写hashCode)
对于HashSet集合,它在装入元素时,首先会拿集合中所有元素的hashCode与要装入的新元素的hashCode对比。
如果不同,直接认为不重复,将新元素添加到集合中。
如果hashCode相同了,这时会拿新元素的equals方法与集合中的元素对比,如果equals也返回true,
这时才认为集合中的元素与新添加的元素重复。
简单说:HashSet它是通过集合中的元素的equals与hashCode方法来维护集合中元素的唯一性。
*总结:
1.List集合的常用方法。
1.add(int index,Object obj)//想具体的索引位置添加元素
2.get(int index);//获取指定索引的元素
3.int indexOf(Object obj) lastIndexOf//获取该元素在集合中第一次出现的索引
4.set(int index,Object obj)//用给定的元素去和给定的索引上的元素替换.
5.Object remove(int index); //删除具体的索引上的元素.
6.List subList(int start,int end)//从某个索引到下个索引的元素.
7.ListIterator listIterator();//它特有迭代器
2.以于List集合的遍历。
传统的迭代器不能在遍历中经行添加元素和交换元素的动作,会发生交换异常,但是它可以,而且它还可以对元素经行双向遍历.注意在遍历的过程添加元素只能调用迭代器的方法,不能用集合的方法添加.,起它的方法和普通的迭代器的方法一样.
3.对于ArrayList,LinkedList,Vector的区别。
ArrayList:底层是通过数组实现的,该集合是有序的可重复的,线程是不安全的.可以适合的场合是排序,查最值,.遍历.效率高
LinkedList;底层是同过链结构实现的,该集合也是有序的可重复的,线程也是不安全的,使用的场合,删除,对首位元素的操作效率较高.效率高.
Vector:该集合线程是安全的效率不高.Vector它底层也是使用数组实现的。
它是线程安全的,它每次增长100%
4.HashSet集合是怎样保证元素的唯一性的。
简单的一句换就是,利用重写哈希值,和equls的方法,经行比较集合中的元素如果相同就不能添加,两者缺一不可! 重写了equls的方法,就比较的是属性了,不重写就相当==一样了,比较的是地址.
TreeSet
TreeSet也是Set接口的一个实现类.具有Set接口的特点元素不重复,,无顺序的.
但是它里面的集合可以自动排序.也叫自然排序..
什么叫元素的自然顺序?
实现了Comparable接口的类它的对象就具有了自然顺序.
使用TreeSet集合,装入自定义对象:操作步骤:
1.让自定义对象的类去实现Comparable接口。
2.重写compareTo方法。
注意:
如果要从小到大: this.属性-o.属性
如果是从大到小:o.属性-this.属性
如果属性是数值类型可以按上面的操作。
如果不是数值类型,可以直接调用属性的comparTo方法。
如果要从小到大: this.属性.comparTo(o.属性)
如果是从大到小:o.属性.compareTo(this.属性)
---------------------------------------------------------------------
TreeSet集合总结:
TreeSet它是一个Set,它的特点:无顺序不可重复。
TreeSet集合中的元素是可以排序的。
TreeSet集合是怎样对元素进行排序:
1.根据元素的自然顺序Comparable接口
2.通过指定的比较器Comparator接口.
TreeSet集合怎样保证集合元素的唯一性:
1.通过Comparable接口的方法comparTo的返回值为0来保证
2.通过Comparator接口的方法compar的返回值为0来保证.
TreeSet底层是使用二叉树来实现的。
TreeSet集合它的效率很低。
关于集合在开发中的应用:
1,如果只想要一个容器就用:AraayList.
2,如果想要一个可以保存不同类型的集合就用:HashSet
3,如果想要一个可以排序的集合就用:ArrayList.
4,如果对一个集合的首位元素操作过多就用LinkedList.
5,如果想要一个不重复的容器,并且存入元素与取出元素顺序一样就可以使用LinkedList..
jdk1.5特性------泛型
它是是什么?
答: 它是用来约束我们的类型.
它的特性:
提高了程序的安全性,把运行期的代码问题,转移到编译时期.省去了类型转换的麻烦.优化了程序的设计.
泛型可以在类上使用,也可以在接口中使用.
注意:
该方法不能在静态的类上修饰,因为静态的不需要创建对象,那么这时泛型就没有了意义!
泛型声明的位置:
一般声明在修饰符和返回值中间.方法上声明泛型有什么用?
1.当我们一个方法,它所在的类上已经有了泛型,但是,这个方法上不使用类上声明的泛型。
还想要在参数与返回值之间建立起关联。这时就可以在我们的方法上声明泛型。
2.static方法不能使用类上声明的泛型,但是方法上还想要使用泛型来限定,这时,只能在方法上定义泛型了。