Java学习笔记-集合(1),2024年最新java面试数据结构与算法 高频考

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

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内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置,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 中每一个元素并执行特定操作 |

小结:

  1. ArrayList必须要连续空间,查询快、增删慢

  2. 频繁访问列表中的某一个元素时使用ArrayList。

  3. 只需要在列表末尾进行添加和删除元素操作时使用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());

}

}

常用方法:传送门

小结:

  1. API

  2. 首尾添加

  3. 首尾获取

  4. 首尾移除

  5. (双向)链表结构:

  6. 每一个元素都分为上一个,下一个,当前元素

  7. 每次增加元素,只新增一个对象,极大提高了集合元素变化的性能

  8. 对元素的访问性能不高,因为其本质是没有游标的,要访问某个元素都是从首尾开始迭代

Set


如果我们只需要存储不重复的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;

}

}

Map


特点:存储一对数据(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面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值