一、集合类
集合类的由来:Java语言中对事物的体现都是以对象的形式,为了方便对多个对象进行操作,就定义一个容器对这些对象进行存储。集合就是存储对象最常用的一种方式。对象里面封装数据,集合里面封装对象。
集合和数组的区别:
1、数组中可以存储基本数据类型和对象类型;集合中只能存储对象类型;
2、数组的长度是固定的;集合的长度是可变的;
3、数组中存储的数据类型必须一致;集合可以存储不同类型的对象;
4、在遇到不明确对象数量和类型的情况下,可以选择用集合存储。
二、集合框架
Java中定义了很多集合,每种集合存储数据的方式不同,将其中共性的内容不断的向上抽取,就形成了集合框架。如图所示:
为什么会出现这么多的集合容器呢?
因为每一个容器对数据的存储方式都有不同,这个存储方式称之为"数据结构"。
三、集合中的常用接口
常用接口:Collection、List、Map、Set、Iterator等,各自的特点如下。
Collection:是集合框架的一个顶层接口,它里面定义了单列集合的共性方法。存储元素是无序的,可以重复的对象;
List:继承Collection接口,元素是有序的,对元素都有定义索引,元素可以重复;
常用实现类:
ArrayList:底层使用的是数组结构;特点:查询速度很快,但增删稍慢,线程不同步;
LinkedList:底层使用的是链表数据结构;特点:增删速度很快,查询稍慢,线程不同步;
Vector:底层使用的是数组结构;特点:早期提供的方法,增删速度慢,线程同步。
package blog.itheima;
//代码示例:在ArrayList中添加元素,并演示泛型,进行for循环和迭代,以及高级for循环
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
addInteger();
addClass();
}
public static void addClass() {
List<Person> list = new ArrayList<Person>();
//此处需要注明元素的类型,1.5的泛型机制
list.add(new Person("lucy",25));
list.add(new Person("Mike",28));
list.add(new Person("Lily",22));
//演示迭代器,也要注明元素类型
Iterator<Person> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
/*打印结果
name=lucy, age=25
name=Mike, age=28
name=Lily, age=22
*/
}
//高级for循环:for(迭代的元素类型 变量名 : 集合对象)
for(Person person : list){
System.out.println(person);
//和以上结果一相同
}
//普通for循环
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i));
}
}
public static void addInteger() {
List<Integer> list = new ArrayList<Integer>();
for(int i=1; i<=10; i++){
//往ArrayList集合中循环添加元素
list.add(i);
}
System.out.println(list);
//打印结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
//高级for循环
for(Integer inte : list){
System.out.println(inte);
}
}
//创建一个对象,让集合添加
static class Person{
private String name;
private int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString() {
return "name=" + name + ", age=" + age;
}
}
}
Set:继承Collection接口,元素是无序的,不可以添加重复元素;
常用实现类:
HashSet:底层数据结构是哈希表,通过hashCode和equals方法来保证元素的唯一性;也可以复写hashCode和equals方法自定义排序规则;其内部是一个只有Key的HashMap;线程不安全,存取速度快;
TreeSet:底层数据结构是二叉树,通过compareTo方法来保证元素的唯一性;可以对元素进行自然排序,当元素不具备比较性时,不能存入TreeSet集合,也可以自定义比较器覆盖compare()方法再存入;线程是不安全的。
Map:接口存储一组成对的键-值对象,提供key(键)到value(值)的映射;Map中的key不要求有序,不允许重复(如果重复,key对应的value会有覆盖操作);value同样不要求有序,但允许重复。
常用实现类:
HashTable:底层是哈希表数据结构,不可以存入null键和null值,该集合是线程同步的,JDK1.0就有的类,效率较低;
HashMap:底层是哈希表数据结构,可以存入null键和null值,该集合是线程不同步的,JDK1.2出现,效率高;
TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行自然排序
package blog.itheima;
//把Map集合转化成Set集合,再通过迭代取出元素
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
class HashMapTest {
public static void main(String[] args) {
Map<Integer,String> m = new HashMap<Integer,String>();
m.put(01,"lucy01");
m.put(02,"lucy02");
m.put(03,"lucy03");
m.put(04,"lucy04");
//通过Map集合的entrySet方法,将map集合转化成Set集合再迭代
Set<Map.Entry<Integer,String>> s = m.entrySet();
Iterator<Map.Entry<Integer,String>> it = s.iterator();
while(it.hasNext()){
//通过迭代,取出Map集合中的映射关系Map.Entry
Map.Entry<Integer,String> map = it.next();
Integer s1 = map.getKey();
String s2 = map.getValue();
System.out.println((s1 + "---" + s2));
}
//通过Map集合的keySet方法,取出集合中key的Set集合
Set<Integer> keyset = m.keySet();
Iterator<Integer> iterator = keyset.iterator();
while(iterator.hasNext()){
Integer key = iterator.next();
//通过Map集合的get(key)方法,得到对应的value值
String value = m.get(key);
System.out.println("key=" + key + " value=" + value);
}
}
}
Iterator接口是对Collection进行迭代的迭代器。
ListIterator是Iterator的子接口,该接口只能通过List集合的ListIterator方法获取,是List集合特有的迭代器。因为Iterator迭代时只能对元素进行判断和取出等操作,如果想操作添加修改功能,就要用ListIterator。
Map与Collection的区别:
1、Map与Collection在集合框架中属并列存在;
2、Map存储的是键值对;
3、Map存储元素使用put方法,Collection使用add方法;
4、Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素;
5、Map集合中键要保证唯一性。
集合框架中的工具类:
Collections类:
1、是集合框架中的一个工具类,该类方法都是静态的;
2、提供的方法中有可以对List集合进行排序、取出最大值、最小值、二分查找、反转打印、反转比较器等操作;
3、通常常用的集合都是线程不安全的,因为要提高效率,如果多线程操作这些集合时,可以通过Collections中的同步方法将线程不安全的集合转换成安全的。
Arrays类:
1、用来操作数组的工具类,可对数组进行排序和搜索等各种方法;
2、可以将数组转成List集合,对数组进行排序、二分查找等;将数组变成集合后,不可以使用集合的增删方法,因为数组的长度是固定的;
3、数组转集合时,如果数组中的元素是对象或者基本数据类型,会出现什么情况呢?
package blog.itheima;
//用代码说明:数组转集合时,如果数组中的元素类型不同的问题
import java.util.Arrays;
import java.util.List;
public class ArraysTool {
public static void main(String[] args) {
String[] arr1 = {"asd","abc","cbv","qwe"};
List<String> listString = Arrays.asList(arr1);
System.out.println(("contains: " + listString.contains("abc")));
//list.add("qw"); 此代码会抛UnsupportedOperationException异常,数组变成集合后,不能使用集合的增删方法
System.out.println("有"+listString.size()+"个元素");
Integer[] arr2 = {1,3,4,6};
System.out.println("有"+Arrays.asList(arr2).size()+"个元素");
int[] arr3 = {1,3,4,6};
System.out.println("有"+Arrays.asList(arr3).size()+"个元素");
/* 打印如下结果:
contains: true
有4个元素
有4个元素
有1个元素
总结:数组转集合时,如果数组中的元素都是对象,那么变成集合时,数组中的元素就会直接转成集合中的元素;如果数组中的元素都是基本数据类型(8种基本类型),那么会将该数组作为集合中的元素存在。
*/
}
}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------