----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
Blog5_1集合基本概念
在存储元素的过程中很多时候并不知道要存储的元素个数,此时用数组的话,就显得很难操作,鉴于此种情况,java就提供了一种新的数据存储容器集合。
集合与数组的区别:
数组:长度固定、存储可以是基本类型,也可以是引用类型、同一个数组只能存储同一类型的元素。
集合:长度不定、存储的元素只能是引用类型、可以存储任意类型的元素。
Blog5_2 Collection集合
(1) Collection集合的功能
Collection是集合的顶层接口,下面来学习Collection集合
添加功能:
booleanadd(Object e)----添加一个元素
boolean addAll(Collectionc) ----添加一个集合(如果原集合中有元素,后添加的元素不覆盖不修改原集合中的元素,只是追加在原集合元素的后面)。
删除功能:
voidclear()----删除所有元素
remove(Objecte)---- 删除指定的一个元素
判断功能:
booleancontains(Object e)----判断集合中是否有指定的元素(当包含的含义是:内容相同的对象时~~要重写equals()方法)
booleanisEmpty()----判断集合是否为空
遍历功能:
Iteratoriterator()----迭代器(接口)
其中有两个方法很重要:boolean hasNext(),Object next();
长度功能:
Intsize()----返回集合的长度值,注意要和array中的length,和String中的length()区别;
转换功能:
Object[]toArray()----把集合转换成数组的功能。
Blog5_3 List集合(接口)
(1)list集合的特点
元素存储和取出有序,元素可以重复。
(2)List集合常用的三个子类及特点
ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高。
Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低。
LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高。
(3)ArrayList集合
ArrayList集合的三种遍历方法:
ArrayList<String>arr = new ArrayList<String>();
arr.add("hello");
arr.add("world");
arr.add("java");
//迭代器遍历的方法
Iterator<String>it = arr.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
//增强for遍历集合
for (String str : arr) {
System.out.println(str);
}
// 使用get()和size()的配合遍历集合
//ArrayList、Vector、LinkedList都有 get()方法
for (int i = 0; i <arr.size(); i++) {
String str = arr.get(i);
System.out.println(str);
}
(4)Vector集合及其子类
Vector集合的特殊方法如下:
1:添加功能
public void addElement(Object obj)
2:遍历方法
public Object elementAt(intindex)
3:迭代器的功能
publicEnumeration elements()
booleanhasMoreElements()
Object nextElement()
Vector的三种遍历方法如下:
//迭代器进行遍历
//Vector的迭代器实质和ArrayList的没有区别,只是书写不一样而已。
Enumeration<String>en=v.elements();
while(en.hasMoreElements()){
System.out.println(en.nextElement());
}
//怎强for进行遍历
for(String str:v){
System.out.println(str);
}
//使用普通for
for(int i=0;i<v.size();i++){
String str=v.elementAt(i);
System.out.println(str);
}
(4)LinkedList集合
LinkedList的一些特殊方法:
A:添加功能
public void addFirst(Object e)
public void addLast(Object e)
B:删除功能
public Object removeFirst()
public Object removeLast()
C:获取功能
public Object getFirst()
public Object getLast()
LinkedList的三种遍历方法:
//增强for遍历
for(String str:link){
System.out.println(str);
}
//普通for遍历
for(inti=0;i<link.size();i++){
String str=link.get(i);
System.out.println(str);
}
//迭代器遍历
Iterator<String>it=link.iterator();
while(it.hasNext()){
String str=it.next();
System.out.println(str);
}
总结:由于Collection中有size()方法,list中有get()方法,故list的所有子类都能用普通for遍历,又由于Collection中有iterator()方法,故所有属于Collection的子类都能使用迭代器方法进行迭代遍历。Jdk5后增加了,增强for来遍历集合,使得遍历大大方便了。
Blog5_4 Set集合及其子类
(1)Set集合的特点
Set集合存储元素无序、唯一
(2)HashSet集合
HashSet由于Set表中没有get(index)方法故,遍历方式只有增强for和迭代器方式两种。遍历方式和list集合的完全一样,这儿就不在累赘。下面着重学习一下HashSet集合元素保持唯一性的原因。
(3)HashSet集合元素保持唯一性的原因
通过查看add的源码,我们最终发现了判断条件:
if (e.hash == hash && ((k =e.key) == key || key.equals(k)))
&&的左边和右边
1:e.hash == hash
这个hash值跟hashCode()方法相关。而我们都知道,hashCode()返回的是对象的哈希值。
2:((k = e.key) == key || key.equals(k))
||的左边和右边(k = e.key) == key比较对象的地址值。
key.equals(k)
小结:通过查看add的源码我们可分析出HashSet集合通过底层的HasCode()和equals()方法保持集合元素的唯一性。
(4)TreeSet集合
①TreeSet的自然排序
TreeSet<String>ts = new TreeSet<String>();
ts.add("hello");
ts.add("world");
ts.add("java");
ts.add("abc");
ts.add("zero");
for (String s : ts) {
System.out.println(s);
}
打印出的结果是:abc、hello、java、world、zero
是按照单词的首字母进行排序,类似的这种排序方法叫做自然排序方法。
上面例子能进行排序的实质是String类中实现了一个Comparable<String>排序的接口。
②TreeSet存储自定义对象使用自然排序方法的步骤:
A. 是要进行排序的类实现Comparable接口如:
public class Teacher implementsComparable<Teacher> {
B.重写compareTo方法,如下实例代码:
public intcompareTo(Teacher t) {
intnum1=this.name.length()-t.name.length();
intnum2=(num1==0)?this.name.compareTo(t.name):num1;
intnum3=(num2==0)?(this.age-t.age):num2;
returnnum3;
}
③TreeSet存储自定义对象使用比较器排序的方法步骤:
A.创建TreeSet集合,使用TreeSet(Comparator<?superE>comparator)构造方法;
B.用匿名内部类的方法重写compare方法
如代码:
TreeSet<Teacher> ts=new TreeSet<Teacher>(newComparator<Teacher>() {
@Override
public int compare(Teacher t1,Teacher t2) {
intnum1=t1.getName().length()-t2.getName().length();
intnum2=(num1==0)?t1.getName().compareTo(t2.getName()):num1;
intnum3=(num2==0)?(t1.getAge()-t2.getAge()):num2;
return num3;
}
});
当然上面的过程也可以通过新建立一个类,让其实现Comparator接口,然后再向TreeSet的构造方法传递一个新建类的对象来实现。但匿名内部类使用起来会使代码更简洁,明了提倡使用匿名内部类。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
详情请查看: