这些Java基础知识,诸佬们都还记得嘛(学习,复习,面试均可)

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

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

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

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

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

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

正文

=======================================================================================================

String是final修饰的,String的对象不可变,每次操作都会产生新的String对象,所以String修饰的常量是线程安全的。

StringBuffer和StringBuilder都是在原始创建的对象上操作的。StringBuffer和StringBuilder的相同点是他们都有公共父类AbstractStringBuilder抽象类。当调用StringBuffer和StringBuilder中的方法时,都会调用AbstractStringBuilder抽象类中的方法。

而StringBuffer和StringBuilder的不同点是StringBuffer是线程安全的,StringBuildel是线程不安全的,这是因为StringBuffer会在方法是添加synchronized锁

在性能方面,StringBuilder>StringBuffer>String

如果在使用时要改变字符串的内容,应使用前两个,在多线程使用共享变量时优先使用StringBuffer,因为其线程安全;在没有特殊情况下,优先使用StringBuilder,因为其效率高。

在这里插入图片描述

🍻ArrayList和LinkedList的区别

========================================================================================

🍺ArrayList


ArrayList是List接口的一个实现类,基于动态数组存储的,并且存储地址是连续的。因为ArrayList内部的存储形式是数组的形式,所以不适合做大量的增删操作(尤其是在中间插入或删除元素,因为后面的数组都要向前或向后移动),但是ArrayList在遍历和查找元素时效率很高

ArrayList适合下标访问,也适合随机访问,在进行随机的get,set方法调用时,ArrayList的效率比LinkedList效率高。

当存入的元素超过了设定的ArrayList的长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,即新建数组,将旧的数组中的数据拷贝到新的数组中,如果不是尾插法,后面的数据都要移动


ArrayList list1 = new ArrayList();

list1.add("xiaowei");

List1.add("haoshuai");



对于上面的代码,当运行第一行,底层先创建了一个长度为0的数组,这是因为没有指定数组大小;当运行到第二行时,add第一个元素时,会初始化数组的大小为10(默认的,可指定),如果超过此容量,再次扩容时就是之前的1.5倍

🍺LinkedList


LinkedList是List接口的另一个实现类,LinkedList集合是一个双向链表,其内部包含有两个Node类型的first和last属性维护的双向循环链表,链表中的每一个元素都使用引用的方式来记住他的前一个和后一个元素,当插入或者删除一个节点时,只需要修改几个元素之间的引用关系就行了,无需造成数据的大量移动。所以Linked List在增删元素上具有很高的效率。

LinkedList没有初始化容量,其底层是双向链表结构,所以不存在扩容这一说。

优点:

随机增删元素效率较高,因为增删元素不涉及大量元素的位移。

缺点:

查询效率较低,每一次查找某个元素时都需要从头节点开始往下遍历

在这里插入图片描述

🍉HashMap和Hashtable的区别

=====================================================================================

🍇HashMap


HashMap 是 map 接口的实现类,是将键映射到值的对象,它的键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap 允许key和value为空值。

HashMap中的方法没有synchronized修饰,所以HashMap是线程不安全的。

HashMap的底层实现:数组+链表

jdk8开始如果链表高度到8,数组的长度超过64,链表就会转变为红黑树,元素以内部类Node节点存在。

计算key的hash值,二次hash然后对数组长度取模,对应到数组下标,如果没有产生hash冲突(下标位置没有元素),则直接创建Node存入数组,如果产生hash冲突,则先进行equal比较,相同的话就会取代该元素,如果不同的话,则判断链表高度插入链表,链表高度达到8,并且数组长度到64则转变为红黑树,长度低于6则将红黑树转回链表。

由于HashMap是线程非安全的,所以HashMap在效率上要优于HashTable。

🍇HashTable


HashTable中的方法都被Synchronized修饰,所以在多个线程访问HashTable时,不需要自己为它的方法实现同步。HashTable是线程安全的。

HashTable无论是key还是value,都不能为null值。

遍历方面:

HashMap只支持Iterator(迭代器)遍历。

而Hashtable支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历。

容量方面:

HashMap默认的容量大小是16;增加容量时,每次将容量变为“原始容量x2”。所以其容量一定是2的n次幂。

Hashtable默认的容量大小是11;增加容量时,每次将容量变为“原始容量x2 + 1”。

在这里插入图片描述

🚀用HashMap实现的小游戏

===============================================================================

以下是用HashMap实现的斗地主小游戏,代码有发牌和看牌的操作,可以运行一下玩玩。


import java.util.*;



public class PlayPoker {

    public static void main(String[] args) {

        HashMap<Integer, String> hm = new HashMap<Integer, String>();

        ArrayList<Integer> array = new ArrayList<Integer>();

//        color数组装牌的花色

        String[] color = {"♦","♣","❤","♠"};

//        num数组装牌的大小

        String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};

        int index = 0;

//        外层循环是牌的大小,内层循环是花色

        for (String num1 : num) {

            for (String color1 : color) {

                hm.put(index,color1+num1);

                array.add(index);

                index++;

            }

        }

        hm.put(index,"小王");

        array.add(index);

        index++;

        hm.put(index,"大王");

        array.add(index);

//        洗牌操作,掉头Collections工具类里面的shuffle方法

        Collections.shuffle(array);

//        用TreeSet来实现对牌的排序

        TreeSet<Integer> player1 = new TreeSet<Integer>();

        TreeSet<Integer> player2 = new TreeSet<Integer>();

        TreeSet<Integer> player3 = new TreeSet<Integer>();

        TreeSet<Integer> dp = new TreeSet<Integer>();

        for (int i = 0; i < array.size() ; i++) {

            int s = array.get(i);

//            最后三张就是底牌

            if (i >= array.size()-3) {

                dp.add(s);

            }else if (i % 3 == 0) {

                player1.add(s);

            }else if (i % 3 == 1) {

                player2.add(s);

            }else if (i % 3 == 2) {

                player3.add(s);

            }

        }



        lookPoker("蔡徐村",player1,hm);

        lookPoker("苏珊",player2,hm);

        lookPoker("小黑子",player3,hm);

        lookPoker("底牌",dp,hm);



# 总结

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。

*   **第一个是算法**

关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。

而且,**我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本**

**《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题**

![最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?](https://img-blog.csdnimg.cn/img_convert/566334c116bc046ed774238d1cedb264.webp?x-oss-process=image/format,png)

**《算法的乐趣》共有23个章节:**

![最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?](https://img-blog.csdnimg.cn/img_convert/eeba288911c9d506a16c374610b08005.webp?x-oss-process=image/format,png)

![最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?](https://img-blog.csdnimg.cn/img_convert/3a30d3c8a11ed184e4996ca7c2cb7169.webp?x-oss-process=image/format,png)

*   **第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)**

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

![最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?](https://img-blog.csdnimg.cn/img_convert/dedbcaba2eabeb68546f392c85eaffa3.webp?x-oss-process=image/format,png)

*   **第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)**

![最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?](https://img-blog.csdnimg.cn/img_convert/00f5c6f9e2df2d8860a1dd71403196d7.webp?x-oss-process=image/format,png)



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

**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)**
![img](https://img-blog.csdnimg.cn/img_convert/e7205617c75525e0a90dbe39ac1eaea3.jpeg)

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

[外链图片转存中...(img-9ByOyWfi-1713550682766)]



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

**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)**
[外链图片转存中...(img-Xx0O4XKO-1713550682767)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值