Java学习笔记-集合,转疯了

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不会报错。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?
]

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

[外链图片转存中…(img-8N0QPqDM-1711752249382)]

[外链图片转存中…(img-lc6208zL-1711752249382)]

[外链图片转存中…(img-3xNrYWOI-1711752249383)]

[外链图片转存中…(img-VyyUIKBd-1711752249383)]

[外链图片转存中…(img-etdVyuYk-1711752249384)]

[外链图片转存中…(img-KY4TCzaG-1711752249384)]

[外链图片转存中…(img-3RuXuOSC-1711752249384)]

[外链图片转存中…(img-HOhFUBhB-1711752249385)]

[外链图片转存中…(img-YLt3goeG-1711752249385)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值