在Java中, 用数组保存数据时会有一些问题?比如,数组的长度无法改变,在定义时就设定好了,这时候我们就要用到集合:
集合是什么:Java集合类存放于 java.util 包中,是一个用来存放对象的容器。存放的引用数据类型的引用,即内存地址
注意:1、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。
2、集合存放的是多个对象的引用,对象本身还是放在堆内存中。
3、集合可以存放不同类型,不限数量的数据类型。
在Java中,我们常用的集合有三种:
1.List<E>集合
2.Set<E>集合
3Map<K,V>集合
其中List和Set都继承了Collection接口,Map没有继承和实现其余接口或者类
collections类中封装了一些集合用到的方法
List<E>集合:是一个有序可重复的集合,根据存储的顺序指定索引(从0开始)
继承了collection<E>,Iterable<E>接口
实现类:ArrayList(速度快,线程不安全);vector(速度慢,线程安全)
添加元素的方法:list.add()
获取元素的方法:list.get()
移除元素的方法:list.remove()
获取集合长度:list.size()
可以存放null;但无意义
Person p1 = new Person();
p1.setId(100);
p1.setName("jazz");
p1.setAge(10);
Person p2 = new Person();
p2.setId(200);
p2.setName("jazz2");
p2.setAge(20);
List<Person> list = new ArrayList<>();
list.add(1);
list.add("tom");
list.add(3.14);
list.add(p1);
list.add(p2);
List<E>集合的遍历:有三种方法
1.简单的for循环
for(int i = 0;i<list.size();i++){
Person person = list.get(i);
System.out.println(person.getId()+"---"+person.getName());
}
2.foreach循环
for (Person person : list) {
System.out.println(person.getId()+"---"+person.getName());
}
3.使用Iterable<E>接口的iterator()方法,迭代器(也是一种设计模式)
Iterator<Person> it = list.iterator();
while (it.hasNext()) {
//需要獲取對象
Person pp = it.next();
System.out.println(pp.getId()+"---"+pp.getName());
}
Set<E>集合:一个不包含重复元素集合
继承了collection<E>,Iterable<E>接口
常用实现类:
HashSet:无序;不可重复。线程不安全,存取速度快,底层实现是一个HashMap(保存数据),实现Set接口
TreeSet:有序;不可重复,底层使用 红黑树算法,擅长于范围查询
添加操作同list集合,只能用迭代器方法来进行遍历,因为无序
public class SetDemo {
public static void main(String[] args) {
Person p1 = new Person();
p1.setId(100);
p1.setName("jazz");
p1.setAge(10);
Person p2 = new Person();
p2.setId(200);
p2.setName("jazz2");
p2.setAge(20);
Person p3 = new Person();
p3.setId(300);
p3.setName("jazz3");
p3.setAge(30);
//1.创建了集合Set
Set<Person> set = new HashSet<>();
//2.向Set集合中添加元素
set.add(p1);
set.add(p2);
set.add(p3);
//3.如何从Set集合中获取元素
Iterator<Person> iterator = set.iterator();
while(iterator.hasNext()) {
Person p = iterator.next();
System.out.println(p.getId()+"---"+p.getName());
}
Set<Integer> set = new TreeSet<>();//有序的集合
set.add(23);
set.add(13);
set.add(1);
set.add(2);
set.add(7);
set.add(5);
Iterator<Integer> iterator = set.iterator();
while(iterator.hasNext()) {
Integer p = iterator.next();
System.out.println(p);
}
}
}
Map<K,V>集合:根据键-值对来保存数据,可以快速的根据键取出想要的值。将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射到一个值(键唯一)
在Map集合中,使用put("key","value")来保存数据
获取数据用get(key)方法
常用实现类HashMap、Hashtable、TreeMap
HashMap:允许空值做键,速度快,线程不安全
Hashtable:不允许空值做键,速度慢、线程安全
遍历:自己没有遍历的方法,提供了一个方法,将map集合转换为set集合,再进行迭代
public class MapDemo {
public static void main(String[] args) {
Person p1 = new Person();
p1.setId(100);
p1.setName("jazz");
p1.setAge(10);
Person p2 = new Person();
p2.setId(200);
p2.setName("jazz2");
p2.setAge(20);
Person p3 = new Person();
p3.setId(300);
p3.setName("jazz3");
p3.setAge(30);
//1.创建Map集合
Map<String, Person> maps = new HashMap<>();
//2.向Map集合中添加对象
maps.put("p1", p1);
maps.put("p2", p2);
maps.put("p3", p3);
//3.从集合中获取到某一个对象
Person person = maps.get("p2");
System.out.println(person.getName());
System.out.println("-------------------------------------------------------");
//4.如何对Map进行遍历操作Entry<String, Person>相当于Map集合
Set<Entry<String, Person>> set = maps.entrySet();
Iterator<Entry<String, Person>> iterator = set.iterator();
while(iterator.hasNext()) {
//从迭代器中获取Map集合
Entry<String, Person> entry = iterator.next();
String key = entry.getKey();
Person person2 = entry.getValue();
System.out.println(key+"-----"+person2.getName());
}
System.out.println("-------------------------------------------------------");
}
}
网友评论