Java集合框架
1.集合和数组的区别:
集合存储的是对象,数组存储的是基本数据类型
2.集合结构图
3.集合框架分类:
Collection接口
|----List接口
|---ArrayList
|---LinkedList
|---Vector
|---Set接口
|---HashSet
|---TreeSet
Map接口
|---HashTable
|---HashMap
|---TreeMap
4.集合框架共性方法
boolean add(Object o):该方法用于向集合里面添加一个元素,若集合对象被添加操作改变了,返回true.
addAll(Collection c):把集合c里面的所有元素添加到指定集合里面去,如果集合对象被添加操作改变了返回true.
void clear():清除集合里面的所有元素,将集合长度变为0。
boolean contains(Object o):返回集合里是否包含指定的元素。
boolean containsAll(Collection c):返回集合里是否包含集合c内所有的元素。
boolean isEmpty():返回集合是否为空(长度是否为0)。
Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。
boolean remove(Object o):删除集合中指定元素o。
boolean removeAll(Collection c):从集合中删除集合c里面的元素。若删除一个或以上返回true。
boolean retainAll(Collection c):从集合中删除集合c里不包含的元素。
int size():得到集合元素的个数。
Object[] toArray():把集合转成一个数组,所有集合元素编程数组元素。
5.集合遍历元素共性方法
Iterator主要遍历Collection集合中的元素,也有称为迭代器或迭代精灵。
boolean hasNext():若被迭代的集合元素还没有被遍历,返回true.
Object next():返回集合的下一个元素.
void remove():删除集合上一次next()方法返回的元素。(若集合中有多个相同的元素,都可以删掉)
iterator对于集合才能用,for不同,只要是循环都可用。
如:
Iterator iter = l.iterator();
while(iter.hasNext())
{
System.out.println(iter.next());
}
6.List接口
List接口中元素特点:有序(输入顺序和输出顺序一致),可重复
List接口下有三个主要类
ArrayList:底层数据结构是数组,因此,查询很快,增删稍慢
LinkedList:底层数据结构是链表,增删很快,但查询稍慢
Vector:集合中的重量级组件,底层数据结构和ArrayList一样是数组,但Vector是线程同步的,使用时速度较慢,因此一般不用,被ArrayList替代
7.List接口共性方法:
void add(int index,Object e):将元素e添加到List集合中的index处;
boolean addAll(int index,Collection c):将集合c所包含的所有元素都插入在List集合的index处;
Object get(int index):返回集合index索引处的元素;
int indexOf(Object o):返回对象o在List集合中第一次出现位置的索引;
int lastIndexOf(object o):返回对象o在List集合中最后一次出现的位置索引;
Object remove(int index):删除并返回index索引处的元素;
Object set(int index,Object e):把集合index处的元素替换为e对象,返回以前在指定位置的元素;
List接口还有一个特殊的接口ListIterator
Iterator可以遍历集合中元素,但是在遍历时无法对元素进行查找,添加等,因此,引入ListIterator,是List接口特有方法
如:
<span style="font-size:18px;"> ListIterator<Integer> it = l.listIterator();
while(it.hasNext()){
System.out.println(it.next());
}</span>
8.Set接口
Set接口中元素特点:无序,不可重复
Set接口下有两个主要类:
HashSet:底层数据结构是哈希表,线程非同步
TreeSet:底层数据结构是二叉树,可对元素排序
9.Set接口判断元素唯一性的标准
HashSet:底层数据结构是哈希表,因此,在比较集合中的对象是否相同时,需要覆盖hashCode()方法和equals()方法
如:
<span style="font-size:18px;">public class jihe10 {
public static void main(String[] args){
HashSet s = new HashSet();
s.add(new person1(11,"java11"));
s.add(new person1(12,"java12"));
s.add(new person1(13,"java13"));
s.add(new person1(12,"java12"));
s.add(new person1(14,"java12"));
s.add(new person1(11,"java1"));
s.add(new person1(111,"java1"));
s.add(new person1(11,"java1"));
HashSet h = new HashSet();
Iterator i = s.iterator();
while(i.hasNext()){
person1 p =(person1)i.next();
if(!h.contains(p))
System.out.println(p.getAge()+p.getName());
}
}
}
class person1{
private int age;
private String name;
person1(int age,String name){
this.age=age;
this.name=name;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public boolean equals(Object obj)
{
if(!(obj instanceof person1))
return false;
else{
person1 p = (person1)obj;
System.out.println(this.age+"---equals---"+p.age);
return this.age==p.age && this.name.equals(p.name);
}
}
public int hashCode(){//先比较hashCode值
return this.name.hashCode()+age*37;//哈希值相同,则比较equals方法 hashCode值不同才会用equals方法比较
}
}</span>
TreeSet底层数据结构是二叉树,其判断元素唯一性的标准有两种方法:
1.让元素自身具备比较性,需实现Comparable接口,重写CompareTo()方法
如:
<span style="font-size:18px;">public class jihe11 {
public static void main(String[] args){
TreeSet t= new TreeSet();
t.add(new student1(12,"zs1"));
t.add(new student1(12,"java2"));
t.add(new student1(12,"java2"));
t.add(new student1(13,"java1"));
t.add(new student1(12,"java2"));
Iterator i = t.iterator();
while(i.hasNext()){
student1 s = (student1)i.next();
System.out.println(s.getAge()+s.getName());
}
}
}
class student1 implements Comparable{
private int age;
private String name;
student1(int age,String name){
this.age=age;
this.name=name;
}
public int getAge(){
return age;
}
public String getName(){
return name;
}
public int compareTo(Object obj) {
if(!(obj instanceof student1))
throw new RuntimeException("不是本类对象!");
student1 s = (student1)obj;
System.out.println("age比较"+"...."+this.age+this.name+"...."+s.age+s.name); if(this.age>s.age)
return 1;
if(this.age==s.age)
return this.name.compareTo(s.name);
return -1;
}
}</span>
2.让容器具备比较性,即构建一个比较器(类),实现Comparator接口,重写Compare()方法,然后将比较器对象传给集合
如:
<span style="font-size:18px;">public class jihe12 {
public static void main(String[] args){
TreeSet t = new TreeSet(new myComparator1());
t.add(new student2(11,"java"));
t.add(new student2(11,"java1"));
t.add(new student2(12,"java"));
t.add(new student2(13,"java"));
t.add(new student2(11,"java"));
System.out.println(t);//输出容器在内存中的地址值
Iterator i= t.iterator();
while(i.hasNext()){
student2 s =(student2)i.next();
System.out.println(s.getAge()+",,,,,,,"+s.getName());
}
}
}
class student2{
private int age;
private String name;
student2(int age,String name){
this.age=age;
this.name=name;
}
public int getAge(){
return age;
}
public String getName(){
return name;
}
}
class myComparator1 implements Comparator{
public int compare(Object o1, Object o2) {
student2 s1 = (student2)o1;
student2 s2 =(student2)o2;
System.out.println("比较"+s1.getAge()+s1.getName()+"....."+s2.getAge()+s2.getName());
int num = s1.getAge()-s2.getAge();
if(num>0)
return 1;
if(num==0)
return s1.getName().compareTo(s2.getName());//不用equals方法,因为equals方法返回值为boolean
return -1;
}
}</span>
当两种方法都可以时,以比较器为主!
10.Map集合
Map集合存入的是键值对,是成对存在的
共性方法:
1. 添加
put(K key,V value)
putAll(Map<? extends k,? extends V>m)
2.删除
clear()
remove(Object key)
3.获取
get(object key)
size()
values()
实现其的三个类
---HashMap:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的,效率低
---Hashtable:底层是哈希表数据结构,允许使用null键null值,该集合是线程不同步,效率高
---TreeMap:底层是二叉树结构,咸亨不同步,可以用于给集合中的键进行排序
Map集合获取元素方法:
1.通过.KeySet()方法返回Set集合,内存HashMap的键 ,通过迭代器,调用get()方法,返回键对应的值
如:
public class jihe21 {
public static void main(String[] args){ HashMap<Integer,String> h= new HashMap<Integer,String>();
h.put(1, "01");
h.put(2, "02");
h.put(3, "03");
h.put(4, "04");
Set s=h.keySet();//将Map集合的键获取到集合s中
Iterator<Integer> i = s.iterator();//遍历集合s的值,传递到迭代器中
while(i.hasNext()){
int a=i.next();
String j = h.get(a);//键
System.out.println("键"+a+"...."+"值"+j);
}
}
}
2.通过Map.Entry<T,T>
如:
<span style="font-size:18px;">public class jihe23 {
public static void main(String[] args){
HashMap<String,String> s = new HashMap<String,String>();
s.put("1","java1");
s.put("2","java2");
s.put("3","java3");
s.put("4","java4");
Set<Map.Entry<String, String>> entrySet =s.entrySet();
Iterator<Map.Entry<String,String>> i = entrySet.iterator();
while(i.hasNext()){
Map.Entry<String, String> g=i.next();
String k = g.getKey();
String v = g.getValue();
System.out.println("key"+"..."+k+"..."+"value"+"..."+v);
}
}</span>