------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:集合概述:
二:Collection接口:
Collection是集合框架中的常用接口。其下有两个子接口:List(列表),Set(集)。
Collection关系表
|-List:内部元素是有序的,元素可以重复。因为该集合体系有索引。
| |-ArrayList:底层的数据结构使用的是数组结构。
| | 特点:查询速度很快,但是增删很慢,线程不同步。
| |-LinkedLIst:底层使用的是链表数据结构。
| | 特点,增删速很度快,但是查询稍慢。
| └-votcor:底层是数组数据结构,线程同步,被ArrayList代替了。
|
|-Set集合:内部元素是无序的(存入和取出的顺序不一定一致)。不可以重复,线程不同步。
| |-HashSet:是如何保证元素唯一性的呢?
| | 答:是通过判断元素的两个方法hashCode()和equals()来完成。
| | 如果元素的HashCode值相同,才会判断epuals()是否为true。
| | 如果元素的HashCode值不同,不会调用epuals()。
| |
| | 注意:对于判断元素是否存在,以及增删等操作,依赖的方法是元素的
| | hashCode()和epuals()方法。
| |
| └-TreeSet:-可以对Set集合中的元素进行排序。
| -底层数据结果是二叉树。
| -保证元素唯一性的依据:compareTo方法return 0。
| -TerrSet排序的第一种方式:让元素自身具备比较性。
| 元素需要实现Comparable接口,覆盖compareTo方法。
|
└-Map:内部元素是无序的,该集合存储键值对,一对一对存储的,保证键的唯一性。
|-HashTable:底层是哈希表数据结构,不能存入null键null值,此集合线程同步。JDK1.0 效率低。
|-HashMap:底层是哈希表数据结构,可以存入null键null值,此集合线程不同步。JDK1.2 效率高。
└-TreeMap:底层是二叉树数据结构,此集合线程不同步,可以用于给map集合中的键进行排序。
。
Collection接口中的常见操作
1、添加元素
add(Objectobj); //add方法的参数类型是Object。以便于接收任意类型对象。
2、删除元素
remove(Objectobj);
removeAll(另一集合);//调用者只保留另一集合中没有的元素。
clear();//清空集合
3、判断元素
contains(Objectobj);//判断是否存在obj这个元素
isEmpty();//是否为空
4、获取个数,集合长度
size();
5、取交集
retainAll(另一集合);//调用者只保留两集合的共性元素。
注:集合中存储的都是对象的引用(地址)。
三、认识list接口
List的方法
(1)增add(index,element);在指定位置上添加元素,如果没有指定位置,则在当前集合中依次添加元素
addAll(index,Collection);在指定位置上添加指定集合中的所有元素
(2)删
remove(index);删除指定位置上的元素
(3)改
set(index,element);修改指定位置上的元素
(4)查
get(index):获取指定位置上的元素
subList(from,to);//获取一个子集合,子集合中的元素是原集合根据两个指定位置截取的
(5)迭代
listIterator();List集合特有的迭代器。ListIterator是Iterator的子接口。
int indexOf(obj):获取指定元素的位置。
List增删改查实例如下:
public class ListDemo {
public static void main(String[]args)
{
List list=new ArrayList();
show(list);
}
public static void show (List list)
{
//添加元素
list.add("abc");
list.add("b");
list.add("c");
System.out.println(list);
//插入元素
list.add(1,"dd");
System.out.println(list);
//删除元素
System.out.println(list.remove(2));
System.out.println(list);
//获取元素
System.out.println(list.get(2));
System.out.println(list);
//获取子列表
System.out.println(list.subList(1, 2));//包含头不包含尾部
System.out.println(list);
}
}
3.1、数组列表类:Arraylist
package string练习;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[]args)
{
Collection <String>collection =new ArrayList<String>();//
List<String> list =new ArrayList<String>();//
//添加元素
collection.add("abc1");
collection.add("abc2");
list.add("abc");
list.add("b");
list.add("c");
System.out.println(list);
//截取子集合角标在1和2之间的元素集合
List <String> sublist=list.subList(1,2);
System.out.println(sublist);
//将集合转换成字符串数组
String []stringlist=list.toArray(new String[]{});
System.out.println(Arrays.toString(stringlist));
for(String str :stringlist)
{
System.out.println("str="+str);
}
//判断list集合是否为空
System.out.println(list.isEmpty());
}
3.2、链表类 LinkedList:
Linkedlist的特有方法
package string练习;
import java.util.LinkedList;
import java.util.List;
/*
* 请用linklist来模拟一个堆栈或者队列数据结构
* 堆栈:先进后出
* 队列:先进先出:
* */
public class LinkList {
public static void main(String[]args)
{
DuiLie d=new DuiLie();
d.myAdd("abc1");
d.myAdd("abc2");
d.myAdd("abc3");
d.myAdd("abc4");
while(!d.isNull())
{
System.out.println(d.myGet());
}
}
}
class DuiLie
{
private LinkedList link;
DuiLie(){
link =new LinkedList();//对link进行初始化
}
public void myAdd(Object obj)
{
link.addLast(obj);
}
public Object myGet(){
return link.removeFirst();
}
public boolean isNull(){
return link.isEmpty();
}
}
四:set接口
4.1散列集HashSet:
package String2;
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Set<Person> set=new HashSet<Person>();//通过hashset实例化set
set.add(new Person("小强",21));//添加元素
set.add(new Person("小刚",21));//添加元素
set.add(new Person("小明",22));//添加元素
set.add(new Person("小强",21));//添加重复元素
System.out.println(set);
}
}
class Person
{
private String name;//定义name属性
private int age;//定义age属性
public Person()//无参构造方法
{}
public Person(String name,int age)//有参的构造方法,初始化成员
{
this.name=name;
this.age=age;
}
public String toString(){//重写tostring方法
return ("姓名:"+name+"年龄:"+age+"\n");
}
}
输出结果:
, 姓名:小刚年龄:21
, 姓名:小强年龄:21
, 姓名:小强年龄:21
]
package String2;
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Set<Person> set=new HashSet<Person>();//通过hashset实例化set
set.add(new Person("小强",21));//添加元素
set.add(new Person("小刚",21));//添加元素
set.add(new Person("小明",22));//添加元素
set.add(new Person("小强",21));//添加重复元素
System.out.println(set);
}
}
class Person
{
private String name;//定义name属性
private int age;//定义age属性
public Person()//无参构造方法
{}
public Person(String name,int age)//有参的构造方法,初始化成员
{
this.name=name;
this.age=age;
}
public boolean equals(Object o){
if(this==o)
{
return true;
}
if(o==null)
{
return false;
}
if(!(o instanceof Person))
{
return false;
}
Person per =(Person) o;
if(this.name.equals(per.name)&&this.age==per.age)
{
return true;
}
else
{
return false;
}
/*public int hashCode(){
final int prime =13;
int result=13;
result=prime*result+((name==null)?0:name.hashCode());
result =prime*result+age;
return result;
}*/
}
public String toString(){//重写tostring方法
return ("姓名:"+name+"年龄:"+age+"\n");
}
}
4.2、树集TreeSet
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Set<Person>set=new TreeSet<Person>();
set.add(new Person1("小强",21));
set.add(new Person1("小刚",21));
set.add(new Person1("小强",21));
System.out.println(set);
}
}
class Person1
{
private String name;
private int age;
public Person1()
{}
public Person1(String name,int age)
{
this.name=name;
this.age=age;
}
public String toString(){//重写tostring方法
return ("姓名:"+name+"年龄:"+age+"\n");
}
}
代码分析:以上代码会编译出错:产生了类转换异常,这是因为TReeset只要实现了comparable接口才能对对象进行排序。
package String2;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Set<Person>set=new TreeSet<Person>();
set.add(new Person("小强",21));
set.add(new Person("小刚",21));
set.add(new Person("小强",21));
System.out.println(set);
}
}
class Person implements Comparable<Person>
{
private String name;
private int age;
public Person()
{}
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Person per)
{
if(this.age>per.age)
{
return 1;
}
if(this.age<per.age)
{
return -1;
}else
{
return this.name.compareTo(per.name);
}
}
public String toString(){//重写tostring方法
return ("姓名:"+name+"年龄:"+age+"\n");
}
}
五:迭代输出:iterator接口:
package string练习;
import java.util.HashSet;
import java.util.Iterator;
//import java.util.LinkedHashSet;
/*添加数组并进行排序
*
* 思路:使用hashset添加元素,并使用linkedhashset子类让他排序。
* */
public class LinkedHashSet {
public static void main(String[]args)
{
HashSet hs= new HashSet();//无序的输出
//HashSet hs= new LinkedHashSet();//有序的输出
hs.add("abc1");
hs.add("abc2");
hs.add("abc3");
hs.add("abc4");
Iterator it=hs.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
六:Map接口:
6.1、hashmap:哈希映射类:
实例(1):获取map中的key和value:
package string练习;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[]args)
{
Map<Integer,String> map =new HashMap<Integer,String>();//通过hashmap实例化map
method(map);
map.put(1, "清华大学");//添加元素
map.put(2, "北京大学");
map.put(3, "南京大学");
map.put(4, "复旦大学");
Set <Integer>set=map.keySet();//
Iterator<Integer> it=set.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
Collection<String>set1=map.values();//
Iterator<String> it1=set1.iterator();
while(it1.hasNext())
{
System.out.println(it1.next());
}
}