先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
List list = List.of(
new Person(“Xiao”, “Ming”, 18),
new Person(“Xiao”, “Hong”, 25),
new Person(“Bob”, “Smith”, 20)
);
boolean exist = list.contains(new Person(“Bob”, “Smith”, 20));
System.out.println(exist ? “测试成功!” : “测试失败!”);
}
}
class Person {
String firstName;
String lastName;
int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(firstName, person.firstName) && Objects.equals(lastName, person.lastName);
}
@Override
public int hashCode() {
return Objects.hash(firstName, lastName, age);
}
}
在集合类中,List
是最基础的一种集合:它是一种有序列表
。
List
的行为和数组几乎完全相同:List内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置,List
的索引和数组一样,从0
开始。
ArrayList
引用包:
import java.util.ArrayList;
创建方法:
ArrayList arrayList = new ArrayList();
示例代码:
import java.util.ArrayList;
import java.util.Comparator;
public class RunoobTest {
public static void main(String[] args) {
ArrayList sites = new ArrayList();
//添加元素
sites.add(“Google”);
sites.add(“Runoob”);
sites.add(“Taobao”);
sites.add(“Weibo”);
System.out.println(sites);
//访问元素
System.out.println(sites.get(1)); // 访问第二个元素
//修改元素
sites.set(2, “Wiki”); // 第一个参数为索引位置,第二个为要修改的值
System.out.println(sites);
//删除元素
sites.remove(3); // 删除第四个元素
System.out.println(sites);
//获取List长度
System.out.println(sites.size());
//循环输出元素
for (int i = 0; i < sites.size(); i++) {
System.out.println(sites.get(i));
}
for (String i : sites) {
System.out.println(i);
}
//List排序
sites.sort(Comparator.naturalOrder());
System.out.println("排序后: " + sites);
}
}
List转Array:
import java.util.List;
public class HelloWord {
public static void main(String[] args) {
List list = List.of(“apple”, “pear”, “banana”);
//第1种方法
Object[] array = list.toArray();
for (Object s : array) {
System.out.println(s);
}
//第2种方法,指定类型
String[] stringArray1 = list.toArray(new String[3]);
for (String n : stringArray1) {
System.out.println(n);
}
//第2种方法改进版
String[] stringArray2= list.toArray(new String[list.size()]);
for (String n : stringArray2) {
System.out.println(n);
}
//第3种方法
String[] stringArray3 = list.toArray(String[]::new);
for (String n : stringArray3) {
System.out.println(n);
}
}
}
Array变List
import java.util.List;
public class HelloWord {
public static void main(String[] args) {
//Array变为List就简单多了,通过List.of(T…)方法
List list = List.of(12, 34, 56);
System.out.println(list);
//我们调用List.of(),它返回的是一个只读List,如下代码会报错
list.add(999); // UnsupportedOperationException
}
}
常用API:
| 方法 | 描述 |
| — | — |
| add() | 将元素插入到指定位置的 arraylist 中 |
| addAll() | 添加集合中的所有元素到 arraylist 中 |
| clear() | 删除 arraylist 中的所有元素 |
| clone() | 复制一份 arraylist |
| contains() | 判断元素是否在 arraylist |
| get() | 通过索引值获取 arraylist 中的元素 |
| indexOf() | 返回 arraylist 中元素的索引值 |
| removeAll() | 删除存在于指定集合中的 arraylist 里的所有元素 |
| remove() | 删除 arraylist 里的单个元素 |
| size() | 返回 arraylist 里元素数量 |
| isEmpty() | 判断 arraylist 是否为空 |
| subList() | 截取部分 arraylist 的元素 |
| set() | 替换 arraylist 中指定索引的元素 |
| sort() | 对 arraylist 元素进行排序 |
| toArray() | 将 arraylist 转换为数组 |
| toString() | 将 arraylist 转换为字符串 |
| ensureCapacity() | 设置指定容量大小的 arraylist |
| lastIndexOf() | 返回指定元素在 arraylist 中最后一次出现的位置 |
| retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
| containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
| trimToSize() | 将 arraylist 中的容量调整为数组中的元素个数 |
| removeRange() | 删除 arraylist 中指定索引之间存在的元素 |
| replaceAll() | 将给定的操作内容替换掉数组中每一个元素 |
| removeIf() | 删除所有满足特定条件的 arraylist 元素 |
| forEach() | 遍历 arraylist 中每一个元素并执行特定操作 |
小结:
-
ArrayList必须要连续空间,查询快、增删慢
-
频繁访问列表中的某一个元素时使用ArrayList。
-
只需要在列表末尾进行添加和删除元素操作时使用ArrayList。
LinkedList
链表(Linked list
)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。链表可分为单向链表和双向链表。
一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。
一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。
以下情况使用 LinkedList :
-
你需要通过循环迭代来访问列表中的某些元素。
-
需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
LinkedList 继承了 AbstractSequentialList
类。
LinkedList 实现了 Queue
接口,可作为队列使用。
LinkedList 实现了 List
接口,可进行列表的相关操作。
LinkedList 实现了 Deque
接口,可作为队列使用。
LinkedList 实现了 Cloneable
接口,可实现克隆。
LinkedList 实现了 java.io.Serializable
接口,即可支持序列化,能通过序列化去传输
引用包:import java.util.LinkedList;
创建方法:
LinkedList list = new LinkedList(); // 普通创建方法
或者
LinkedList list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表
示例代码:
import java.util.LinkedList;
public class HelloWord {
public static void main(String[] args) {
LinkedList sites = new LinkedList();
sites.add(“Google”);
sites.add(“Runoob”);
sites.add(“Taobao”);
sites.add(“Weibo”);
// 使用 addFirst() 在头部添加元素
sites.addFirst(“Baidu”);
// 使用 addLast() 在尾部添加元素
sites.addLast(“Alibaba”);
for (int size = sites.size(), i = 0; i < size; i++) {
System.out.println(sites.get(i));
}
// 使用 removeFirst() 移除头部元素
sites.removeFirst();
// 使用 removeLast() 移除尾部元素
sites.removeLast();
for (String i : sites) {
System.out.println(i);
}
// 使用 getFirst() 获取头部元素
System.out.println(sites.getFirst());
// 使用 getLast() 获取尾部元素
System.out.println(sites.getLast());
}
}
常用方法:传送门
小结:
-
API
-
首尾添加
-
首尾获取
-
首尾移除
-
(双向)链表结构:
-
每一个元素都分为上一个,下一个,当前元素
-
每次增加元素,只新增一个对象,极大提高了集合元素变化的性能
-
对元素的访问性能不高,因为其本质是没有游标的,要访问某个元素都是从首尾开始迭代
如果我们只需要存储不重复的key
,并不需要存储映射的value,那么就可以使用Set
。
特点:
-
无序、无下标、元素不可重复
-
Set实现了Collection接口中定义的方法。
Set用于存储不重复
(唯一)的元素集合,它主要提供以下几个方法:
-
将元素添加进Set:boolean
add
(E e) -
将元素从Set删除:boolean
remove
(Object e) -
判断是否包含元素:boolean
contains
(Object e)
Set实际上相当于只存储key、不存储value的Map。我们经常用Set用于去除重复元素。
Set接口并不保证有序,而SortedSet接口则保证元素是有序的:
-
HashSet
是无序的,因为它实现了Set
接口,并没有实现SortedSet
接口; -
TreeSet
是有序的,因为它实现了SortedSet
接口。
HashSet
没有真正意义上的set集合,他使用的是HashMap
的key。
方法:
-
新建集合
HashSet<String> hashSet = new HashSet<String>();
-
添加元素
hashSet.add( );
-
删除元素
hashSet.remove( );
-
遍历操作
增强for for(type type : hashSet)
迭代器 Iterator<String> it = hashSet.iterator( );
- 判断
hashSet.contains( );
,hashSet.isEmpty();
TreeSet
特点:
-
基于排列顺序实现元素不重复
-
实现
SortedSet
接口,对集合元素自动排序 -
元素对象的类型必须实现
Comparable
接口,指定排序规则 -
通过
CompareTo
方法确定是否为重复元素 -
使用TreeSet和使用TreeMap的要求一样,添加的元素必须正确实现
Comparable
接口,如果没有实现Comparable
接口,那么创建TreeSet时必须传入一个Comparator
对象。
方法:
-
创建集合 TreeSet treeSet = new TreeSet<>()
-
添加元素 treeSet.add();
-
删除元素 treeSet.remove();
-
遍历 1. 增强for 2. 迭代器
-
判断 treeSet.contains();
使用:要求:元素必须实现Comparable
接口,compareTo()
方法的返回值为0,认为是重复元素
// 重写compareTo
@override
public int compareTo(Person o){
int n1 = this.getName().compareTo(o.getName()); //后面的compareTo方法为String带的方法
int n2 = this.getAge()-o.getAge();
return n1 == 0 ? n2 : n1;
}
或者 传入一个Comparator
对象
// 重写compare 创建集合时就制定比较规则
TreeSet treeSet = new TreeSet<>(new Comparator){
@override
public int compare(Person o1,Person o2){
int n1 = o1.getName().compareTo(o2.getName());
int n2 = o1.getAge()-o2.getAge();
return n1 == 0 ? n2 : n1;
}
}
特点:存储一对数据(Key-Value)【键值对】,无序、无下标、键不可重复,值可重复
HashMap
方法:
-
V
put
(K key,V value):将对象存入到集合中,关联键值。key重复则覆盖原值 -
Object
get
(Object key):根据键获取对应的值 -
keySet
():返回所有key -
values
():返回包含所有值的Collection集合 -
Set<Map.Entry<K,V>>
entrySet()
:键值匹配的Set集合 -
boolean
containsKey
(K key):判断key是否存在
示例代码:
import java.util.HashMap;
import java.util.Map;
public class HelloWord {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();//需要指定key和value的类型
// 1. 添加元素
map.put(“cn”, “中国”);
map.put(“uk”, “英国”);
map.put(“cn”, “zhongguo”); // 会替换第一个
// 2. 删除
map.remove(“uk”); //用key删除
// 3. 遍历
// 3.1 使用KeySet()
for(String key : map.keySet()){
System.out.println(key + “—” + map.get(key));
}
// 3.2 使用entrySet()
for(Map.Entry<String, String> entry : map.entrySet()){
System.out.println(entry.getKey() + “—” + entry.getValue());
}
//判断
System.out.println(map.containsKey(“cn”));
System.out.println(map.containsValue(“泰国”));
}
}
备注
:Java这块的Map和C#中的Dictionary不太一样,如果key已经存在了再添加同名的key不会报错。
重复放入key-value并不会有任何问题,但是一个key只能关联一个value。在上面的代码中,一开始我们把key对象"apple"映射到Integer对象123,然后再次调用put()方法把"apple"映射到789,这时,原来关联的value对象123就被“冲掉”了。实际上,put()方法的签名是V put(K key, V value),如果放入的key已经存在,put()方法会返回被删除的旧的value,否则,返回null。
最后
即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!
我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:
Dubbo面试专题
JVM面试专题
Java并发面试专题
Kafka面试专题
MongDB面试专题
MyBatis面试专题
MySQL面试专题
Netty面试专题
RabbitMQ面试专题
Redis面试专题
Spring Cloud面试专题
SpringBoot面试专题
zookeeper面试专题
常见面试算法题汇总专题
计算机网络基础专题
设计模式专题
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-1HCtpNqm-1713545449068)]
Netty面试专题
[外链图片转存中…(img-UnWBI8MD-1713545449068)]
RabbitMQ面试专题
[外链图片转存中…(img-FJPbTifd-1713545449068)]
Redis面试专题
[外链图片转存中…(img-t62GCVjh-1713545449069)]
Spring Cloud面试专题
[外链图片转存中…(img-Vv4eSA3U-1713545449069)]
SpringBoot面试专题
[外链图片转存中…(img-GEgSXQay-1713545449069)]
zookeeper面试专题
[外链图片转存中…(img-QGoUfaKO-1713545449069)]
常见面试算法题汇总专题
[外链图片转存中…(img-SQuQOMjW-1713545449070)]
计算机网络基础专题
[外链图片转存中…(img-YvP26QWf-1713545449070)]
设计模式专题
[外链图片转存中…(img-KthiOh7t-1713545449070)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-ra7bI3zG-1713545449071)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!