最后
为什么我不完全主张自学?
①平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。
除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。
我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。
应该学哪些技术才能达到企业的要求?(下图总结)
–HashMap (实现Map接口,非同步,允许null作为key和value,用的多)
–WeakHashMap(实现Map接口)
3.2 Collection 中的主要方法
(1)添加
boolean add(E o);
boolean add(Collection<? extends E> c);
(2)删除
boolean remove(Object o);
boolean removeAll(Collection<? extends E> c)
void clear();
(3)判断
a.判断集合中是否有元素:boolean isEmpty();
b.判断集合中是否包含某个元素:boolean contains(Object o);
c.判断集合中是否包含某些元素:boolean contains(Collection<?> c);
(4)获取
a.获取集合中元素个数:int size();
b.遍历集合中所有元素:Iterator iterator();
c.判断两个集合中是否存在相同的元素并保留两个集合中相同的元素删除不同的元素:boolean retainAll(Collection<?> c);
(5)其他
将集合中元素转为数组:
a. Ojbect[] toArray();
b. T[] toArray(); 泛型
Java8新增方法
在 JDK 8 以后,Collection 接口还提供了从集合获取连续的或者并行流:
Stream stream()
Stream parallelStream()
于Collection接口相关还有一个抽象类AbstractCollection:
AbstractCollection是一个抽象类,实现了Collection接口的部分功能,实现了一些最基本的通用操作,把复杂的和业务相关的延迟到子类实现。
在AbstractCollection中,主要实现了contains(), isEmpty(), toArray(), remove(), clear() 这几个操作。有兴趣的同学可以自行研究下,逻辑都比较简单。
特别注意:List接口扩展了一个一些方法,其中最重要,也是用的最多的是:
E get(int index) 返回指定索引的元素
数组特点:
-
数组本质上就是一段连续的内存空间,用于记录多个类型相同的数据;
-
数据一旦声明完毕,则内存空间固定不变;
-
插入和删除操作不方便,可能会移动大量的元素并导致效率太低;
-
支持下标访问,可以实现随机访问;
-
数组中的元素可以是基本数据类型,也可以使用引用数据类型。
集合特点:
-
内存空间可以不连续,数据类型可以不相同;
-
集合的内存空间可以动态的调整;
-
集合的插入删除操作可以不移动大量元素;
-
部分支持下标访问,部分不支持;
-
集合中的元素必须是引用数据类型(你存储的是简单的int,它会自动装箱成Integer);
可以看出数组和集合在数据的存储,访问,类型,长度等都有不同的地方。
-
通过集合对象获取其对应的Iterator对象
-
判断是否存在下一个元素
-
取出该元素并将迭代器对象指向下一个元素
Iterator iterator():取出元素的方式:迭代器。该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。
所以该迭代器对象是在容器中进行内部实现的。对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator方法。
扩展知识:
ArrayList里面的iterator方法采用了设计模式中的——工厂方法模式!
有兴趣的同学可以后续看到我另外的文章“设计模式精讲”专栏。
该问题与第二个问题类似~ 后续文章会有更详细的介绍!
Collection两大体系:链表List、集合Set 另映射Map
List接口及子类介绍
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和下面要提到的Set不同,List允许有相同的元素。 除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
实现List接口的常用类有:
-
LinkedList类 (底层数据结构是链表,线程不安全)
-
ArrayList类 (底层数据结构是数组,线程不安全)
-
Vector类 (底层数据结构是数组,线程安全)
-
Stack类 (顾名思义:栈,继承至Vector类并进行扩展)
在后续的文章中我们将一一详细介绍这些类的相关特性!
Set接口及子类介绍
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。
实现Set接口的常用类有:
-
HashSet类 (底层数据结构是数组+单链表+红黑树,无序)
-
LinkedHashSet (底层数据结构是数组+单链表+红黑树+双向链表,无序)
-
TreeSet类 (底层数据结构红黑树,有序)
在后续的文章中我们将一一详细介绍这些类的相关特性!
Map接口及子类介绍
注意:Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。
Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
-
Hashtable类
-
HashMap类
在后续的文章中我们将一一详细介绍这些类的相关特性!
最后
学习视频:
大厂面试真题:
厂面试真题:
[外链图片转存中…(img-Dnx8ODOl-1715358267494)]