集合
集合和数组的区别
区别:
1、 数组的长度是固定的,集合的长度可以动态扩展
2、 数组只能存储相同数据类型的数据,而集合可以存储不同数据类型的数据。比如将arr数组中的数据3改为3.0变为double类型就会报错。而list中可以存储字符串和Integer类型的对象。
后面会学习到泛型的使用,如果为集合加上泛型,也就限制了集合中只能存储这一种数据类型的数据。如:下面的<>中定义了泛型类型为String,再去添加Integer类型数据时就会报错了。
3、 数组可以存储基本数据类型数据,也可以是引用类型,而集合只能是引用类型。这里需要说明一下,如下代码所示:1和基本数据类型变量n都可以被添加到集合中,并没有报错。注意这并不是因为集合中能存储基本数据类型数据,而是经过装箱操作,将基本数据类型转换为对应的包装器类对象了。
应用场景:
1、 数组适用于数据长度固定的情况,并且主要进行查询操作
2、 集合的应用场景如下:
无法预测存储数据的数量
同时存储具有一对一关系的数据
需要进行数据的增删
需要解决数据重复问题,可以直接使用集合Set完成
集合中接口和类的特点总结
一、 Collection
主要用于存储类的对象
Collection下有三个子接口,分别是List、Queue和Set,List和Queue中可以存储有序且重复的数据,Set中存储的数据是无序且不允许重复。
1、 List接口的主要实现类包括ArrayList和LinkedList,LinkedList同时实现了Queue接口
ArrayList的底层实现是数组,因此在内存中是连续存储的。查询速度快,但增加和删除速度慢。
LinkedList底层是基于双向链表的,增加和删除速度快,查询速度慢。
2、 Set接口的主要实现类有HashSet和TreeSet
HashSet是基于哈希表实现的,数据是无序的,HashSet元素可以是null,但只能有一个null。
TreeSet是基于二叉树实现的,可以实现数据的自动排序,确保集合元素处于排序状态,不允许放入空值。
HashSet的性能优于TreeSet,一般情况下建议使用HashSet,如果需要使用排序功能建议使用TreeSet
二、 Map
主要用于存储键值对的数据
Map的主要实现类包括HashMap和TreeMap,其中HashMap基于哈希表实现,TreeMap基于红黑树实现。
HashMap适用于在Map中插入、删除和定位元素
TreeMap适用于按自然顺序或自定义顺序对键值进行遍历
HashMap比TreeMap性能好,所以HashMap使用更多一些,如果需要对数据进行排序可以使用TreeMap
List(列表)
Set
set是接口,不能创建对象
hashCode和equals方法的作用
hashCode()方法用于给对象返回hash code值,equals()方法用于判断其他对象与该对象是否相等。为什么需要这两个方法呢?
我们知道HashSet中是不允许添加重复元素的,那么当调用add()方法向HashSet中添加元素时,是如何判断两个元素是不同的。这就用到了hashCode()和equals()方法。在添加数据时,会调用hashCode()方法得到hash code值,通过这个值可以找到数据存储位置,该位置可以理解成一片区域,在该区域存储的数据的hashCode值都是相等的。如果该区域已经有数据了,就继续调用equals()方法判断数据是否相等,如果相等就说明数据重复了,就不能再添加了。如果不相等,就找到一个位置进行存储。
这些是基于哈希算法完成的,它使得添加数据的效率得到了提升。假设此时Set集合中已经有两个100个元素,那么如果想添加第101个元素,如果此时没有使用哈希算法,就需要调用equals()方法将第101个元素与前100个元素依次进行比较,如果元素更多,比较所耗费的时间就越长。
如果两个对象相等,那么他们的hashCode值一定相等。反之,如果两个对象的hashCode值相等,那么这两个对象不一定相等,还需要使用equals()方法进行判断。
如果不重写hashCode()方法,默认每个对象的hashCode()值都不一样,所以该类的每个对象都不会相等。
插入重复数组时需要重写的equals方法
@Override
public boolean equals(Object obj) {
if(this==obj)
return true;
if(obj.getClass()==Student.class) {
Student stu=(Student)obj;
return stu.getName().equals(name)&&stu.getId()==(id)&&stu.getScore()==score;
}
return false;
}
关于getClass()和.class的作用
在视频中我们看到了如下选中的if语句,其中的判断条件中用到了getClass()和.class,有的小伙伴还是会对这块内容产生疑问,下面就来说明一下:
首先,来看一下Class类。在Java中,万事万物皆对象,每个类都有一个相应的Class对象。通过Class类,可以获得一个类的基本信息,比如属性、方法和构造方法等。这些都属于Java反射的内容,在后面的课程中将会学习到。
getClass()是Object类的方法,该方法的返回值类型是Class类,通过getClass()方法可以得到一个Class类的对象。而.class返回的也是Class类型的对象。所以,如果obj.getClass()和Cat.class返回的内容相等,说明是同一个对象。
既然都可以得到Class的对象,关于getClass()和.class的区别:getClass()方法,有多态能力,运行时可以返回子类的类型信息。.class是没有多态的,是静态解析的,编译时可以确定类型信息。
在集合中查询信息:
Map
添加一个对象:
代码:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class FootBallDome {
public static void main(String[] args) {
Map<String,String> maps=new HashMap();
maps.put("2014","德国");
maps.put("2010","西班牙");
maps.put("2006","意大利");
maps.put("2002","巴西");
//使用迭代器输出
System.out.println("使用迭代器输出");
Iterator<String> it=maps.values().iterator();
while(it.hasNext()) {
System.out.print(it.next()+" ");
}
//使用EntrySet方式遍历输出HashMap中的key和value
System.out.println();
Set<Entry<String, String>> entry=maps.entrySet();
for(Entry<String,String> en:entry) {
System.out.print(en.getKey()+"-");
System.out.print(en.getValue());
System.out.println();
}
}
}
Map中获取key-value值的方法
Map<K,V> 集合是一种键值映射形式的集合。当调用put(K key,V value)方法把数据存到Map中后,那么如何把Map中的key值和value值取出来呢?都有哪几种取值的方法呢?下边就来一一介绍一下。
一、 前置准备
以HashMap为例,先为map中存几个数据,以便于后边对map的遍历取值。
二、 获取Map的key-value值。
获取Map的key-value值分别有以下几种方式,使用时可以根据不同的场景,选择对应的取值方式。
方法一:
同时获取Map中的key值和value值。
此方法通常用在要遍历展示这个map中所有的key和value
例如:
在主方法中调用这个获取key和value的方法:
控制台的显示如下:
方法二:
获取Map中的所有key值,以及通过key值获取对应的value值。
此方法可以用在一些需要判断是否是指定key的情况下,获取该key对应的value。
例如:
在主方法中调用这个获取key的方法:
控制台显示如下:
方法三:
获取Map中的所有value值,此方法通常用于只想要展示或获取所有的value值的情况。
判断key值在HashMap中是否存在,可以使用containsKey()方法,返回值是一个boolean类型。
判断HashMap:hsa的可以中是否包含元素word的值,如果包含,则找出来并把对应的value传递到success.jsp 中