-----------------------------------------------个人初学,如有错误,欢迎指正-----------------------------------------------
Java学习笔记之集合
一、简介
Java的集合包含两部分Collection和Map两部分。其中Map是以键—值对的映射关系实现数据存储的。常用的集合类有,Collection中已经实现的接口List,Set以及相应实现的子类。Map中的HashMap和TreeMap。下面是一张简单的集合框架体系图:
二、集合中常用的基本方法
2.1Collection
2.1.1Collection之Set
Set最大的特点就是存储的元素不重复。你可以把Set理解为过滤器,它会主动帮你过滤掉数据中的重复元素,对于相同的数据,存储仅且存储一次。
1>子类HashMap,它根据Hash算法随机生成数据的地址,实现无序的存储,如果你遍历HashMap中的元素,元素的输出顺序很可能与录入的顺序不同。
2>子类TreeSet,与HashMap不同的是,TreeSet对存入的数据进行了排序,排序的方法可以由用户实现Comparable接口后自定义,因此外部可以有序的遍历成员,成员的输出顺序与用户实现Comparable接口后自定义的排序方法一致。
2.1.2Collection之List
List可以理解为加强版的数组,它可以基于索引(下标)对成员实现随机访问。与数组不同的是List的大小会根据你存入的元素多少自动分配,你可以理解为,List是“按需非配”,而且List还提供了比数组更多的功能。
1>子类ArrayList,可以根据索引快速的操作元素(同数组一样)。
2>子类LinkList,可以对任意位置的元素进行操作,但是对基于索引的成员访问比较耗时。
2.2Map
Map是以键-值对映射存储数据的,存储的每个键—值对中,键必须具有唯一性,根据给定的键获取成员的值。
2.2.1Map之HashMap
HashMap满足通用的Map需求,内部无序。
2.2.2Map之TreeMap
TreeMap可以按键值对元素进行有序遍历,遍历的顺序与用户实现Comparable接口对Map的键自定义排序的顺序一致。
三、使用方法
下面是一些程序示例,以便帮助大家更好的理解集合
3.1HashSet
//---------------HashSet存储的数据不重复------------------------
private static void MyHashSet(Set mySet){
//向mySet中存入50以内不重复的8个数
Random rd = new Random();
int num,count = 0;
while(mySet.size() < 8){
num = rd.nextInt(50);
mySet.add(num);
count++;
}
System.out.println("生成五个不重复的数,while循环共执行了【 "+count+"】次");
//使用迭代器遍历mySet
System.out.println("mySet数据:");
Iterator it = mySet.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
System.out.println("\n");
mySet.clear();//清空mySet
//使用remove方法删除mySet的数据
int k = 0;
while(k<count){//重新添加数据
mySet.add(k*3);
k++;
}
System.out.println("mySet数据更新后:");
it = mySet.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
mySet.remove(5);
System.out.println("\n执行mySet.remove(5)后,mySet数据:");
it = mySet.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
//使用remove方法删除mySet的数据
mySet.clear();
while(count > 0){//重新添加数据
mySet.add(count--);
}
System.out.println("\n\nmySet数据更新后:");
it = mySet.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
mySet.remove(5);
System.out.println("\n执行mySet.remove(5)后,mySet数据:");
it = mySet.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
}
运行结果:
3.2HashMap
/*
* HashMap操作
*
*/
private static void MyHashMap(Map myMap){
//---------------HashMap以键值对(key-value)存储数据------------------------
//其中,key关键字不能重复,必须具有唯一性。value值可以重复
Random rd = new Random();
System.out.println("myMap中的数据(key-value):");
for(int i=0; i< 10; i++){
//使用put方法,向map中添加数据
String key = "A"+i;
int value = rd.nextInt(100);
myMap.put(key,value);
System.out.println(key+"-"+value);
}
//使用containsKey方法,判断map中是否包含对应关键字
boolean IsContain = myMap.containsKey("A3");
System.out.println("myMap 中包含 A3关键字吗:"+IsContain);
//使用containsValue方法,判断map中是否包含对应值
IsContain = myMap.containsValue(50);
System.out.println("myMap 中包含 50这个数值吗:"+IsContain);
//使用containsValue方法,判断map中是否包含对应值
Object value = myMap.get("A5");
System.out.println("关键字A5对应的值是:"+value);
value = myMap.get("A10");
System.out.println("关键字A10对应的值是:"+value);
}
运行结果:
<img src="https://img-blog.csdn.net/20160221134425293" alt="" style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" />
3.2ArrayList
/*
* ArrayList操作
*
*/
private static void MyArrayList(List myList){
Random rd = new Random();
for(int i = 0; i< 10; i++){
myList.add(rd.nextInt(100));
}
//---------------使用迭代器遍历ArrayList------------------------
System.out.println("使用迭代器遍历ArrayList");
Iterator it = myList.iterator();//得到迭代器
while(it.hasNext()){//还有下一个元素
System.out.print(it.next()+" ");
}
System.out.println("\n");
//---------------使用for循环遍历ArrayList------------------------
System.out.println("使用for循环遍历ArrayList");
for(int k = 0; k<myList.size(); k++){
System.out.print(myList.get(k)+" ");
}
System.out.println("\n");
//---------------使用集合提供的方法排序List------------------------
Collections.sort(myList);
System.out.println("\n排序:");
it = myList.iterator();//得到迭代器
while(it.hasNext()){//还有下一个元素
System.out.print(it.next()+" ");
}
System.out.println("\n");
//---------------得到指定元素------------------------
//使用get方法得到集合中指定位置的元素
System.out.println("第3个元素是:"+myList.get(2));
//---------------删除指定下标的元素------------------------
System.out.println("删除的第4个元素是:"+myList.get(3));
myList.remove(3);//使用remove方法删除集合中的元素
System.out.println("删除后的集合:");
it = myList.iterator();//得到迭代器
while(it.hasNext()){//还有下一个元素
System.out.print(it.next()+" ");
}
System.out.println("\n");
}
运行结果:
3.2ArrayList泛型操作
package exp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class ArrayListDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
IntegerArr(list);
List<String> list2 = new ArrayList<String>();
StringArr(list2);
List<StudentInf> list3 = new ArrayList<StudentInf>();
ObjectArr(list3);
}
private static void IntegerArr(List<Integer> list){
Random rd = new Random();
for(int i =0; i< 10; i++){
list.add(rd.nextInt(50));
}
System.out.println("ArrayList存储整形数值:");
Iterator it =list.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
System.out.println("\n");
}
private static void StringArr(List<String> list){
for(int i = 0; i< 10; i++){
list.add("A"+i);
}
System.out.println("ArrayList存储字符串值:");
Iterator it =list.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
System.out.println("\n");
}
private static void ObjectArr(List<StudentInf> list){
StudentInf stuInf;
String[] name = {"刘雅","李佳","陈馨","张凯","王力"};
String sex,sexStr = "男女";
for(int i = 0; i< 5; i++){
if(i < 3)
sex = sexStr.charAt(1)+"";
else
sex = sexStr.charAt(0)+"";
stuInf = new StudentInf(name[i],sex,"高三一班");
list.add(stuInf);
}
System.out.println("ArrayList存储对象:");
Iterator it =list.iterator();
while(it.hasNext()){
System.out.println(it.next().toString());
}
System.out.println("\n");
}
}
class StudentInf{
private String name;
private String sex;
private String classmate;
public StudentInf(){}
public StudentInf(String name,String sex,String classmate){
this.name = name;
this.sex = sex;
this.classmate = classmate;
}
@Override
public String toString() {
String inf;
inf = "姓名:"+this.name+"\t 性别:"+this.sex+"\t班级:"+this.classmate;
return inf;
}
}
运行结果:
所有结果都正确打印了
四、小结
ArrayLsit有序,且可以存储重复数值。get(index)可以得到下标为index的对应数值。remove(index)则删除对应下标的值。add()方法可以向ArrayList里添加数据。
Hashset无序,存放不重复的数值,remove(vaule)删除对应值为value的元素
HashMap是以键值对存储数据,关键字具有唯一性,值可以重复。
ArrayLsit有序,且可以存储重复数值。get(index)可以得到下标为index的对应数值。remove(index)则删除对应下标的值。add()方法可以向ArrayList里添加数据。
Hashset无序,存放不重复的数值,remove(vaule)删除对应值为value的元素
HashMap是以键值对存储数据,关键字具有唯一性,值可以重复。