标签:arraylist hashset 表结构 数据类型 获取 移除 学生 key 不可
集合就像一种容器,可以把多个对象放进容器内
特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变
集合按照其存储结构可以分为两大类:
数组的长度是固定的,集合的长度是可变的
数组长度在数组初始化时就已经确定,只能保存定长的数据;
而集合可以保存数量不确定的数据,同时可以保存具有映射关系的数据(key - value)
数组元素既可以是基本类型的值,也可以是对象;
而集合只能保存对象(保存对象的引用变量),基本数据类型变量需要转换为对应的包装类才能放入集合类中
集合类主要由两个接口派生而出。
Collection和Map
Collection、Map是Java集合框架的根接口
常用已实现的结合类有:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素
两个重要的子接口:
接口中定义了许多方法供其子类进行实现
List 接口的主要实现类为:
Set 接口的主要实现类为:
public boolean add(E e)
:把对象添加到当前集合中public void clear()
:清空集合public boolean remove(E e)
:把对象删除public boolean contains(E e)
:判断当前集合中是否包含给定的对象public boolean isEmpty()
:判断集合是否为空public int size()
:返回集合元素个数public Object[] toArray()
:把集合中的元素存储到数组中public class CollectionTest {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("蓝天");
collection.add("白云");
System.out.println(collection);
System.out.println("===========");
System.out.println(collection.contains("蓝天"));
System.out.println("===========");
System.out.println(collection.size());
System.out.println("===========");
Object[] objects = collection.toArray();
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
System.out.println("============");
for (String s : collection) {
System.out.println(s);
}
}
}
Iterator接口经常被称作迭代器,它是Collection接口的父接口
Iterator接口主要用于迭代访问 Collection 中的元素,因此 Iterator 对象也被称为迭代器
Iterator接口中主要定义了2个方法:
public class demo {
public static void main(String[] args) {
//创建集合
Collection<Student> students = new ArrayList<Student>();
Student student = new Student("张三", 23);
students.add(student);
//获得集合的迭代器
Iterator<Student> iterator = students.iterator();
while (iterator.hasNext()) {
Student s = iterator.next();
System.out.println(s.toString());
}
//这里还可以使用增强for来遍历
}
}
使用迭代器进行元素的迭代,集合元素的值传递给了迭代变量
集合元素的值传给了迭代变量,仅仅传递了对象引用。保存的仅仅是指向对象内存空间的地址
实现原理:在遍历集合时,首先调用集合的 iterator() 方法获得迭代器对象,然后使用 hashNext() 方法判断集合中是否存在下一个元素,如果存在,则调用 next() 方法将元素取出,否则说明已到达了集合末尾,停止遍历元素
List接口继承自Collection接口,是单列集合的一个重要分支
特点:
有序:存储和取出元素顺序一直
可重复:存储的元素可以重复
所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素
public void add(int index, E element)
:将元素添加到集合指定位置上public E get(int index)
:返回集合指定位置元素public E remove(int index)
:移除指定位置元素,返回被移除的元素public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回更新前的元素public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("蓝");
list.add("蓝天");
list.add("蓝天空");
System.out.println(list);
System.out.println("=========");
System.out.println(list.remove(1));
System.out.println(list);
System.out.println("=========");
list.set(0, "宇");
System.out.println(list);
System.out.println("=========");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("=========");
for (String s : list) {
System.out.println(s);
}
System.out.println("=========");
}
}
java.util.ArrayList
集合数据存储的结构是数组结构
元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList
是最常用的集合
java.util.LinkedList
集合数据存储的结构是链表结构
方便元素添加、删除的集合
LinkedList是一个双向链表
LinkedList提供了大量首尾操作的方法:
public void addFirst(E e)
:将元素插入列表头public void addLast(E e)
:将元素添加到列表尾public E getFirst()
:返回列表第一个元素public E getLast()
:返回列表最后一个元素public E removeFirst()
:移除并返回列表第一个元素public E removeLast()
:移除并返回列表最后一个元素public E pop()
:从列表所表示的堆栈处弹出一个元素public void push(E e)
:将元素推入列表所表示的堆栈public boolean isEmpty()
:判断空public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("1");
linkedList.add("2");
linkedList.add("3");
System.out.println("===========");
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
System.out.println("===========");
System.out.println(linkedList.removeFirst());
System.out.println(linkedList.removeLast());
System.out.println("===========");
while (!linkedList.isEmpty()) {
System.out.println(linkedList.pop());
}
System.out.println("===========");
System.out.println(linkedList);
}
}
Set接口与Collection集合基本相同,行为不同(Set不允许包含重复元素)
Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复
java.util.HashSet
是Set接口的一个实现类,它所存储的元素是不可重复、无序的
HashSet 根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能
public class HashSetTest {
public static void main(String[] args) {
HashSet<String> strings = new HashSet<>();
strings.add("123");
strings.add("1234");
strings.add("12345");
for (String name : strings) {
System.out.println(name);
}
}
}
HashSet存储自定义对象
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Student{" +
"name=‘" + name + ‘\‘‘ +
", age=" + age +
‘}‘;
}
}
使用
public class HashSetTest {
public static void main(String[] args) {
HashSet<Student> students = new HashSet<>();
students.add(new Student("蓝天", 100));
students.add(new Student("星月", 1000));
students.add(new Student("镇天", 10000));
for (Student student : students) {
System.out.println(student);
}
}
}
我们知道HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?
在HashSet下面有一个子类java.util.LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构
可以保证有序
public class LinkedHashSetDemo {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add("bbb");
set.add("aaa");
set.add("abc");
set.add("bbc");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
映射:一一对应的关系,就叫做映射
Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map
接口
常用子类:
Map接口中的集合都有两个泛型变量<K,V>
在使用时,要为两个泛型变量赋予数据类型
两个泛型变量<K,V>的数据类型可以相同,也可以不同
Map集合不能直接使用迭代器或者foreach进行遍历,但是转成Set之后就可以使用了
public V put(K key, V value)
:添加指定键值在集合中public V remove(Object key)
:删除指定键值并返回public V get(Object key)
:根据指定的键,获取对应的值boolean containsKey(Object key)
:判断集合中是否包含指定的键public Set<K> keySet()
:获取Map集合中所有的键,存储到Set集合中public Set<Map.Entry<K,V>> entrySet()
:获取到Map集合中所有的键值对对象的集合(Set集合)public class MapTest {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("蓝天", "教主");
map.put("苏宇", "人皇");
map.put("天圣", "镇守");
System.out.println(map);
System.out.println("==========");
System.out.println(map.remove("蓝天"));
System.out.println("==========");
System.out.println(map.get("苏宇"));
System.out.println("==========");
}
}
使用put方法时:
键找值方式:即通过元素中的键,获取键所对应的值
public class MapTest {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("蓝天", "教主");
map.put("苏宇", "人皇");
map.put("天圣", "镇守");
//获取键集
Set<String> keys = map.keySet();
//遍历键集
for (String key : keys) {
String s = map.get(key);
System.out.println(key + " = " + s);
}
}
}
Map中存放的是两种对象:key(键)、value(值)
把这一对对象称为Map中的一个Entry(项)
Entry 将键值对封装成了对象,即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对对象中获取对应的键与对应的值
public K getKey()
:获取Entry对象中的键public V getValue()
:获取Entry对象中的值public Set<Map.Entry<K,V>> entrySet()
:获取Map集合中所有的键值对对象到集合Set使用Entry遍历
public class MapTest {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("蓝天", "教主");
map.put("苏宇", "人皇");
map.put("天圣", "镇守");
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " = " + value);
}
}
}
练习:每位学生(姓名,年龄)都有自己的家庭住址,将学生对象和家庭住址存储到map集合中
学生作为键, 家庭住址作为值
public class HashMapTest {
public static void main(String[] args) {
Map<Student, String> map = new HashMap<Student, String>();
map.put(new Student("蓝天", 100), "五重天");
map.put(new Student("星月", 1000), "六重天");
map.put(new Student("苏宇", 10000), "七重天");
Set<Student> students = map.keySet();
for (Student key : students) {
String value = map.get(key);
System.out.println(key.toString() + "...." + value);
}
}
}
标签:arraylist hashset 表结构 数据类型 获取 移除 学生 key 不可
原文地址:https://www.cnblogs.com/lloco/p/14616345.html