JAVA开发入门教程:(十)集合

集合跟数组类似,都是用来储存数据的,但是集合用起来更加方便,因为集合提供了很多便捷常用的方法,最大特点是集合不用像声明数组一样需要指定一个长度。常用的集合有这么几类: ListMap Set,他们都有不同的特性,需要跟据具体的场景选用合适的集合。

1、List

import java.util.ArrayList;

public class JiHe {

	public static void main(String[] args) {
		
		//声明一个ArrayList
		ArrayList arrayList = new ArrayList();
		
		//随便塞什么类型的值
		arrayList.add(2);
		arrayList.add('b');
		arrayList.add("abc");
		arrayList.add(new JiHe());
		
		//获取值
		int i = (int)arrayList.get(0);
		char c = (char)arrayList.get(1);
		String s = (String)arrayList.get(2);
		JiHe jiHe = (JiHe)arrayList.get(3);
		
		System.out.println(i + " " + c + " " + s + " " + jiHe);
		
		//这一行数组越界会抛出一个异常
		arrayList.get(4);
	}
}

运行结果:

 上面的代码中,ArrayList可以存放各种类型的值,但是这就有一个问题,结果把值取出来的时候,需要事先知道每一个位置存的是哪种类型的值,然后类型转换之后才能使用,不然就会报错,如下图

 我们一般使用list的时候,会在声明的时候指定这个list只能存放哪种类型,这个东西叫泛型,用<>来指定。声明方式如下:

import java.util.ArrayList;

public class JiHe {

	public static void main(String[] args) {
		
		ArrayList<String> strList = new ArrayList<String>();
		strList.add("abc");
		strList.add("g43fd");
		
		ArrayList<Integer> intList = new ArrayList<Integer>();
		intList.add(new Integer(2));
		intList.add(2);//自动装箱
		
		ArrayList<JiHe> jiHeList = new ArrayList<JiHe>();
		JiHe jiHe1 = new JiHe();
		JiHe jiHe2 = new JiHe();
		jiHeList.add(jiHe1);
		jiHeList.add(jiHe2);
		
		String str1 = strList.get(0);
		//因为声明的时候指定了泛型,所以不能做类型转换
		int str2 = strList.get(1);
		
	}
}

集合中提供了很多方法,可以通过查询API学习。

  集合遍历跟数组遍历的方式一样,for和foreach都行。

import java.util.ArrayList;

public class JiHe {

	public static void main(String[] args) {
		
		ArrayList<String> strList = new ArrayList<String>();
		strList.add("abc");
		strList.add("g43fd");
		strList.add("fsdf");
		strList.add("路口一家火锅");
		strList.add("适当放松的");
		strList.add(" rheg6");
		strList.add("356453");
		strList.add(" 黱");
		
		for (int i = 0; i < strList.size(); i++) {//注意数组是.length,list是.size()
			System.out.println(strList.get(i));
		}
		
		for (String s : strList) {
			System.out.println(s);
		}
	}
}

List中的数据是有序的,就是说add进去的数据,get的时候是按add时候的顺序出来的。 

属于List家族的还有VectorLinkedList, 因为实现了List接口(接口下章会讲),所以他们的提供的方法基本一样,用法也基本一样,区别是ArrayList查询快,Vector线程安全、LinkedList插入删除快。

2、Set

 与List最大的不同是Set是无序的,不能重复存放相同的数据,

import java.util.HashSet;

public class JiHe {

	public static void main(String[] args) {
		
		HashSet<String> hashSet = new HashSet<String>();
		hashSet.add("fsd");
		hashSet.add("fdv");
		hashSet.add("dvs");
		hashSet.add("呵呵");
		hashSet.add("呵呵");
		hashSet.add("一4");
		hashSet.add("1");
		
		System.out.println("set大小:" + hashSet.size());
		
		for (String s : hashSet) {
			System.out.println(s);
		}
	}
}

上面可以看出,“呵呵”被add了两次,实际只存了一次,打印出来的顺序跟我add时候的顺序是不一样的,这就是无序。其他的泛型、数组越界、方法等都跟List差不多就不多讲了,我们有时候会用Set不重复的特性来对数据去重。

属于Set家族的还有TreeSetLinkedHashSet,他们的区别是:HashSet是采用hash表来实现的。其中的元素没有按顺序排列,add()、remove()以及contains()等方法都是复杂度为O(1)的方法。 TreeSet是采用树结构实现(红黑树算法)。元素是按顺序进行排列,但是add()、remove()以及contains()等方法都是复杂度为O(log (n))的方法。它还提供了一些方法来处理排序的set,如first(), last(), headSet(), tailSet()等等。 LinkedHashSet介于HashSet和TreeSet之间。它也是一个hash表,但是同时维护了一个双链表来记录插入的顺序。基本方法的复杂度为O(1)。

3、Map

键值对(key-value)的形式储存数据。

import java.util.HashMap;
import java.util.Map;

public class JiHe {

	public static void main(String[] args) {
		
		//声明一个Map
		HashMap<String, String> map = new HashMap<String, String>();
		
		//复制
		map.put("name", "张三");
		map.put("age", "16");
		map.put("sex", "男");
		map.put("address", "学则路");
		map.put(null, "lala");//map允许用null作为key
		map.put("gaga", null);//map允许存null

		System.out.println(map.get("name"));
		System.out.println(map.get("age"));
		System.out.println(map.get("sex"));
		System.out.println(map.get("address"));
		System.out.println(map.get(null));
		System.out.println(map.get("gaga"));
		
		System.out.println("--------------------------------");
		
		//迭代map方式1
		for (String key : map.keySet()) {
			System.out.println("key:" + key + "  value:" + map.get(key));
		}
		System.out.println("--------------------------------");
		//迭代map方式2
		for (Map.Entry<String, String> entry : map.entrySet()) {
			System.out.println("key:" + entry.getKey() + "  value:" + entry.getValue());
		}
	}
}

属于Map家族的还有LinkedHashMapTreeMap。一般情况下用HashMap可以了,key是无序的。LinkedHashMap的key是有序的,但是效率会比HashMap慢。TreeMap的key是自然排序,也就是说数字开头的靠前、短的靠前、字母小的靠前。

现在有了List、Map,就可以搞一些数据结构出来了,如下保存学生信息。

使用List和实体类(实体类是一种只有私有属性、get/set方法、toString方法的类,用来存放数据不做其他用途)存放一组学生信息。

import java.util.ArrayList;

public class JiHe {

	public static void main(String[] args) {
		
		ArrayList<Student> list = new ArrayList<>();//后面尖括号里面的泛型可以省略
		
		Student s1 = new Student();
		s1.setName("张三");
		s1.setSex("男");
		s1.setAge(16);
		list.add(s1);
		
		Student s2 = new Student();
		s2.setName("李红");
		s2.setSex("女");
		s2.setAge(15);
		list.add(s2);
		
		Student s3 = new Student();
		s3.setName("张明");
		s3.setSex("男");
		s3.setAge(17);
		list.add(s3);
		
		Student s4 = new Student();
		s4.setName("刘敏");
		s4.setSex("女");
		s4.setAge(16);
		list.add(s4);
		
		System.out.println(list);
	}
}

/**
 * 学生类
 */
class Student {

	private String name;
	private String sex;
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
	}
}

使用List和Map

import java.util.ArrayList;
import java.util.HashMap;

public class JiHe {

	public static void main(String[] args) {
		
		ArrayList<HashMap<String, String>> list = new ArrayList<>();//后面尖括号里面的泛型可以省略
		
		HashMap<String, String> student1 = new HashMap<>();//后面尖括号里面的泛型可以省略
		student1.put("name", "张三");
		student1.put("sex", "男");
		student1.put("age", "16");
		list.add(student1);
		
		HashMap<String, String> student2 = new HashMap<>();
		student2.put("name", "李红");
		student2.put("sex", "女");
		student2.put("age", "15");
		list.add(student2);
		
		HashMap<String, String> student3 = new HashMap<>();
		student3.put("name", "张明");
		student3.put("sex", "男");
		student3.put("age", "17");
		list.add(student3);
		
		HashMap<String, String> student4 = new HashMap<>();
		student4.put("name", "刘敏");
		student4.put("sex", "女");
		student4.put("age", "16");
		list.add(student4);
		
		System.out.println(list);
	}
}

为什么ArrayList、Vector、LinkedList都叫List,HashSet、TreeSet、LinkedHashSet都叫Set,LinkedHashMap、HashMap、TreeMap都叫Map?下章看完接口就清楚了。

补充:ArrayList<HashMap<String, String>> list = new ArrayList<>()这种最后面尖括号里面省略类型的写法,只在jdk1.8中可用,jdk1.8之前的不能省略,要写成ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

发布了56 篇原创文章 · 获赞 49 · 访问量 9万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览