系列文章目录
第一章 JAVA集中学习第一周学习记录(一)
第二章 JAVA集中学习第一周项目实践
第三章 JAVA集中学习第一周学习记录(二)
第四章 JAVA集中学习第一周课后习题
第五章 JAVA集中学习第二周学习记录(一)
第六章 JAVA集中学习第二周项目实践
第七章 JAVA集中学习第二周学习记录(二)
第八章 JAVA集中学习第二周课后习题
第九章 JAVA集中学习第二周学习记录(三)
第十章 JAVA集中学习第二周学习记录(四)
文章目录
前言
集合,我们今天要了解的是集合,集合是数组的上位替代。甚至java设计者为了解决集合没法使用基本数据类型的问题,把基本数据类型包装成引用类型来给集合使用。很牛吧,本文将介绍集合牛在哪里,为什么我们要用集合。在下攸攸太上,我们ൠ♄§星人基本什么都能做到,突然冲上CSDN榜一也是小菜一碟。
一、 集合的介绍
在介绍集合之前,我们首先要对上一篇文章的自动拆装包技术进行复习:
1. 自动拆包装操作
装箱:
基础数据类型转包装类
int a = 9;
Integer i = new Integer(a);
拆箱:
包装类转基础数据类型(程序自动.intValue())
Integer i = new Integer(7);
int b = i;
2. 集合与数组的对比
集合:是一种容器,是一种变量类型,跟数组很像
数组的优点:
数组只能存储一种数据类型,集合能存储多种数据类型,但是我们调用的时候要怎么在循环内同时对多种数据类型进行操作呢?所以还是专精一种的好。(后面会讲到泛型)
数组的缺点
1、数组的空间长度固定,一旦确定不可以更改。多了浪费,少了报错。
2、使用数组操作数据的时候,删除、增加效率比较低
3、没办法获得数组中存储的真实元素个数
4、数组没办法满足,不可重复,无序的数据
这些缺点集合都可以满足
3. 集合的分类
根据存储数据的方式分类
1、Collection一个一个存储元素,是无序不唯一的接口:存入和取出的顺序可能不一样,可以不唯一
Collection有两个子接口
1.1、list不唯一,有序(接口)
——ArrayList
——LinkedList
——Vector(老版,1.6以弃用,面试有可能考)
1.2、set无序,唯一(接口)
——HashSet
——TreeSet
2、map一对一对存储元素(key:value)(key无序唯一;value无需不唯一)(接口)
1.1、HashMap
1.2、TreeMap
3.1 Collection接口
Collection c = new ArrayList();
使用声明父类 = new 子类的形式,只能使用从父类继承、重写的方法。
增加: add,addAll(Collection参数)
c1.add(“hi”);
Collection c1 = new ArrayList();
c1.addAll©;
删除: remove只删除一个,删除前面的,removeAll(ci集合),clear
c.remove(23);
c.removeAll(c1);从要删的集合中移除ci中能匹配上的所有元素(重复匹配的也删)
c.clear();//清空数组内的
修改: 没有修改方法
判断: isEmpty,contains
Collection c2 = null;
Collection c3 = new ArrayList();
//System.out.println(c2.isEmpty());//报错,空指针异常
System.out.println(c3.isEmpty());
查找: size,iterator(只有Collection的实现类有迭代器)
Iterator iterator = c.iterator();
while (iterator.hasNext()){//判断光标下是否还有下一个元素,判断弹夹iterater里还有没有子弹,返回true为有子弹
System.out.println(iterator.next());
}
转换: toArray
c.toArray();//把它转成数组,返回一个Object类型的数组
System.out.println(Arrays.toString(c.toArray()));
这些方法子接口/实现类都会继承(小幅度进行重写),所以下文不会重复讲解
3.2 List子接口
存储有序不唯一的元素(有下标)
新增:
List list = new LinkedList();
list.add(“aa”);
list.add(0, “bb”);
list.add(3, “cc”);//不能数组越界会出错
List list1 = new LinkedList();
list1.addAll(0, list);
list1.add(true);//如果没有设置下标,就末位添加
!!!
list.addAll(1, list1);
出现结果:[bb, bb, aa, cc, true, 55]
list.add(1, list1);
出现结果:[bb, [bb, aa, cc, true], 55]
查找:
System.out.println(list.get(0));//获取第一个元素
List list2 = list.subList(1, 4);//前包后不包,获取下标区间的
修改:
list.set(1, “55”);
排序,后续再讲:
list.sort();
3.3 ArrayList实现类
没有自己特有的方法,只有重写的list,Collection的方法
他的底层源码是数组
泛型数组: 限制元素添加时的元素类型
private static final int DEFAULT_CAPACITY = 10;初始默认分配空间大小为10个元素
数组满的时候会以*1.5的空间大小扩增(会取整)
底层为数组的优势:
随机访问和遍历的效率高,
劣势:
删除和添加的效率比较低,
Vector是老版本的集合
vector与ArrayList的对比:
Vector ArrayList
1.5之前 1.5之后
线程安全,效率低 线程不安全,效率高
底层数组已2倍速度扩充 底层数组已1.5倍速度扩充
3.4 LinkList实现类(链表)
存储有序不唯一的元素
优点:
擅长做删除和添加操作
缺点:
查找,随机访问效率低
特殊方法与头尾有关:
LinkedList list = new LinkedList<>();//钻石符号内不用写
list.add(434.43);
list.addFirst(1d);//把int转成double
list.addLast(3.4d);
System.out.println(list);
list.removeFirst();
list.removeLast();
System.out.println(list);
System.out.println(list.poll());
//获得最后一个元素
结果:
[1.0, 434.43, 3.4]
[434.43]
434.43
3.5 Iterator接口
是一个迭代器:专门做循环遍历
优点:效率高,是普通for循环遍历的倍
对不同的集合结构有不同的遍历规则
是重点,而且容易跟int的包装类Integer搞混,要牢记他的拼写。
3.6 Set接口
存储无序唯一的元素
相较于List,没有自己特有的方法,只有父接口Collection里的方法
3.7 HashSet实现类
无序唯一的元素
去重原理是什么?
借助元素对象的两个方法:HashCode、Equals
首先获得要存入元素的哈希值,
通过比较哈希值,
依次比较集合中已有的元素哈希值,
如果哈希值不同,认为是不同的对象,存入集合
如果哈希值相同,再使用equals方法对哈希值相同的两个对象的属性进行比较
如果属性都相等就拒绝存入集合中
如果属性有一点不相同,可以存入集合中
底层实现:
哈希表
例如一根线上有很多夹子
每一个夹子都是一个哈希值24,65,32,63
每个夹子能夹很多衣服,他们的哈希值都一样,但分开之后的哈希值肯定有区别
3.8 TreeSet实现类
有序,唯一的元素(树是有序的)数值大小的有序,树会给你排序
TreeSet去重排序原理
利用比较器对象的比较方法依次比较想存入的元素与已存入的元素依次比较,
如果比较的结果为0,则认为是相同元素,拒绝存入
如果比较的结果为1,则认为是不同元素,可以存入,并且位置靠前
如果比较的结果为-1,则认为是不同元素,可以存入,并且位置靠后
让自定义的对象拥有比较的能力,设置该类实现Comparable接口,实现CompareTo方法
重写比较方法
3.9 比较器
集合中存入数据时(add、put)时进行比较
外部比较器 Comparator 方法Compare
内部比较器 Comparable 方法CompareTo
内部比较器:
实现Comparable接口,实现CompareTo方法
缺点:
1、如果每次更改比较规则的时候都要改源码
2、只有实现了比较器接口的对象才可以存入TreeSet项目里进行排序
外部比较器:
能解决内部比较器的缺点
使用步骤:
1、创建一个比较器类,实现Comparator接口
2、重写compare()方法
3.10 Map大类
3.10.1 Hashmap
Map 一对一对进行元素存储
以键值对key, value形式
key无序唯一
value无序不唯一
解释:键值对形式更符合网络发展的使用场所。
遍历map集合四种方法
主要思路是因为Map没有迭代器方法,所以我们需要把Map型集合转成Connection型集合,再调用迭代器方法进行遍历。
1、第一种遍历
Map<Integer, Student> map = new HashMap<>();
Student student = new Student(1, "张三", 24, "八嘎雅鹿");
Student student1 = new Student(2, "张四", 22, "八嘎雅鹿");
Student student2 = new Student(4, "李三", 14, "八嘎雅鹿");
map.put(student.getStuid(), student);
map.put(student1.getStuid(), student1);
map.put(student2.getStuid(), student2);
System.out.println(map);
Student student3 = map.get(2);
student3.setAge(312);
System.out.println(map);
System.out.println();
Collection<Student> values = map.values();
Iterator<Student> iterator = values.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println();
2、第二种遍历
Set<Integer> set = map.keySet();
Iterator<Integer> iterator1 = set.iterator();
while (iterator1.hasNext()) {
Student stu = map.get(iterator.next());
System.out.println(stu);
}
System.out.println();
3、第三种遍历:Entry同时封装多个对象
Set<Map.Entry<Integer, Student>> entries = map.entrySet();
Iterator<Map.Entry<Integer, Student>> iterator2 = entries.iterator();
while (iterator2.hasNext()) {
Student stu = iterator2.next().getValue();
System.out.println(stu);
}
System.out.println();
4、第四种遍历:增强型for循环
Collection<Student> values5 = map.values();
for (Student student4:values5){
System.out.println(student4);
}
增强for循环:
增强型for循环:可以在不知道下标的情况下遍历集合/数组
普通for循环:必须知道下标
for(集合中元素的类型 代号(形参): 要遍历的集合){对代号进行操作}
修改方法
会将原有的值覆盖掉,来实现修改
HashMap的键值对都可以设置为空
注意事项:
保证key值唯一的原理时,key值类型要求重写HashMap()
HashTable和HashMap的区别:
table继承于Dictionary、线程安全、操作速度慢、效率低;不允许为空;初始值11;老版本; 底层数组已2倍速度扩充
Map继承于AbstractMap、线程不安全,操作速度快,效率高;允许为空;初始值16;新版本;底层数组已1.5倍速度扩充
3.10.2 TreeMap
与HashMap的区别
1、key值去重的原理不同
2、底层存储数据的实现不同
3、TreeMap的key值可以去重+排序,HashMap不能排序只能去重
思考:System.out.println( c );
一般输出语句默认调用toString(只有在输出语句里是这样)
会对String类型的变量调用tostring方法吗?
答案:会的,虽然是废二遍事。
总结
本文花费大篇幅讲述了集合的分类,List和Set区别,Hash和Tree区别,Connection和Map区别。请大家在仔细区分的同时学习各自特殊的方法。感谢各位客官在宝贵的生命中分给这篇文章一些时间,感谢你们用心观看。话说,在下面临一些问题,心情有些低迷,有什么方法能学到大火球术,传送门法术,心灵控制术这些奇门功法吗?或者告诉我异世界的传送卡车会在什么时候在什么地方出现?
标签:JAVA,list,System,println,第二周,集中学习,数组,集合,out From: https://blog.csdn.net/howwickhappy/article/details/140712194