集合
集合
1. 内容
1.1 List
ArrayList集合特点:有序,可重复
LinkdList特点:有序,可重复,增加删除效率高。
1.2 set
set集合特点:无序,不可重复元素
Hashset:无序,不可重复元素
LinkdHashset:有序,不可重复
Treeset:有序且不可重复
1.3 Map
键值对集合
HashMap:键值对集合,无序且不可重复
LinkdHashMap:键值对集合,有序且不可重复
TreeMap:键值对集合,有序且不可重复
2. 集合概述
集合是什么,有什么用
可以认为集合就是一个可以存储任何数据类型的动态数组。
3. 集合导入泛型
简单了解泛型的基本使用后,对于我目前javaweb的使用的相关定义记录一下
java web使用的一般是HashMap这个集合,实例化如下:
HashMap <key,value> 集合变量名 = new HashMap<key,value> ();
其中,key指的是这个集合里面对象的序号的类型,value指的是该对象来自哪个类,即该对象的类型是什么。
举例:HashMap<String,UserBean> = new HashMap<String,UserBean> ();
注意:集合里面实际上存储的是对象,对于基本数据类型,要转化为他的包装类。
对于String类型的对象,集合里面直接传数据就可以(这是允许的),可以简单的认为,数据就是以String类的对象的形式存储的,只不过这个对象就表示数据。
就好像这个String类里面属性只有一个value,str.value=数据。
static这个找个时间看一下,好多对象都是用静态设置
4.集合和数组的区别
5.集合和数组输出对比
5.1 集合原型输出
List<Integer> people1 = Arrays.asList(1,2,4);
System.out.println(people1);
上述代码输出后结果为
System.out.println(people1);输出时,,List接口的实现abstractCollection类中对该方法重写,输出结果为集合的值。
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
5.2 集合遍历输出
List<Integer> people1 = Arrays.asList(1,2,4);
for (Integer people2 : people1 ) {
System.out.println(people2.toString());
}
上述代码输出结果为:
遍历输出是访问每个元素,一个一个输出。
5.3 数组原型输出
int[] array = {1, 2, 3};
System.out.println(array.toString());
上述代码输出:
数组默认没有重写toStirng方法,输出类型和哈希值组合
5.4 数组如何输出原型
int[] array = {1, 2, 3};
System.out.println(Arrays.toString(array)); // 输出: [1, 2, 3]
5.5总结toStirng方法重写和未重写对象
总结一下List、map和list集合对象是map,map值是list的三种情况原型输出方法出处
5.1map集合输出原型
编译时调用的是Object的toString方法,运行时调用的是实际类型的重写后的toString方法,这个toString方法是HashMap的父类AbstractMap类的方法,这个方法输出的Map集合带有{key=value}的格式,如果value是list集合则输出{key=[a,b,c]}的形式。
因此下面的图片的说调用toString的方法有误,其他没问题。
public String toString() {
Iterator<Entry<K,V>> i = entrySet().iterator();
if (! i.hasNext())
return "{}";
StringBuilder sb = new StringBuilder();
sb.append('{');
for (;;) {
Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();
sb.append(key == this ? "(this Map)" : key);
sb.append('=');
sb.append(value == this ? "(this Map)" : value);
if (! i.hasNext())
return sb.append('}').toString();
sb.append(',').append(' ');
}
}
5.2 第三种类型
List<Map<String, List>> list = new ArrayList<>();
这种输出情况是:
- 首先有list的[]
- 其次里面对象是map,所以里面是{key=value}的形式
- 最后value是list形式,最终形式[{key=[1,2,3]}, {key=[2,2,2]}]
6 三种集合具体对比
6.1 特点对比
只要知道三种集合的特点,根据特点会用响应的集合就行,还不需要仔细理解三个集合的实现类的数据结构,数据结构属于更更底层了。业务开发只根据结构的特点选用具体的集合,一般就到Hash和Array就行,linked用的很少,用的时候他们的实现类都是根据实现的接口的特点操作,只不过也有自己的方法,不过一般不常用(注意一个ArrayList的indexOf方法返回索引)。
我简单总结一下:list主要就是有序,可重复;set主要就是不可重复,也可以通过实现类实现有序;map主要就是键值对特点,也可以实现有序通过实现类。然后注意set的自动去重是除了自定义对象外的所有对象,自己的对象需要重写hasCode和equals方法
下面三张图片详细解释了特点:
6.2三种集合常用方法
6.3 实现类常用方法
其实除了个别实现类有之外,其他的都是跟接口方法一样,只不过基于不同的数据结构之后,一些特点会改变,像无序便有序,增删效率快慢等,尤其是hash实现类,相当于基于哈希表对接口进行实现,相当于接口的宿主一样,没有大的变化,接口干啥他干啥
7. 泛型
7.1 int和Integer的区别
7.2 为什么泛型中无法使用int
作者:yzh先生
博客:https://www.cnblogs.com/ZiJun
本文版权归作者和博客园共有,转载请在文章中注明原文链接:https://www.cnblogs.com/ZiJun/p/18755668 ,愿尊重劳动成果,谢谢!
若有关于博客内容的各种问题,欢迎在评论区讨论或发消息,让我们一起进步!