欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA新手入门03~必须精通的内容

程序员文章站 2022-03-10 20:37:26
这篇文章,将会详细的列出来新手入门需要学习的Java基础知识,这些知识,是必须要掌握的,而且不能学的半盆子水平,要深入学习原理,然后才能在以后使用的时候,得心应手。String篇string会伴随Java开发的一生,几乎每天都会用到,所以要去研究这个类,目前作为新手入门,要理解的是如下内容:string底层是什么 它不是基本类型,对吧,它是用哪种基本类型实现的string的比较问题 str1 == str2 和 str1.equals(str2)的区别字符串的拼接问题 str = str1 +...

这篇文章,将会详细的列出来新手入门需要学习的Java基础知识,这些知识,是必须要掌握的,而且不能学的半盆子水平,要深入学习原理,然后才能在以后使用的时候,得心应手。

String篇

string会伴随Java开发的一生,几乎每天都会用到,所以要去研究这个类,目前作为新手入门,要理解的是如下内容:

  • string底层是什么 它不是基本类型,对吧,它是用哪种基本类型实现的
  • string的比较问题 str1 == str2 和 str1.equals(str2)的区别
  • 字符串的拼接问题 str = str1 + str2 + str3 这里会延伸到StringBuffer和StringBuilder
  • 字符串的子字符串 即substring() 要学会使用
  • 字符串和各种类型的转换,例如string转int int转string等 long和double float这些都要会
  • 字符串的hash和equals方法,可能在某些情况下要重写,该怎么重写,这里其实会涉及到List的contains方法的使用
  • 大写转小写 或反向怎么实现
  • 判断字符串是否为空 可以用apache的StringUtils
  • trim()方法,去除字符串2边的空格

想要拔高的话,可以学习:

  • 正则表达式
  • indexof(),怎么在字符串中查找另外的字符串,这里会涉及到几个算法,经典的有KMP,涉及的领域例如敏感词过滤、黑名单、查找替换等等
  • 可以试试判断字符串是否是回文、反转字符串等操作
  • 可以去研究下jvm怎么缓存的字符串
  • 可以研究下String.intern()

集合类篇

面试八股文,经常出现在这里,我刚开始工作的时候,面试必问,可以说是Java的热门话题了。集合类就是Java的一些常见的数据结构,可以很方便的辅助我们日常的编程。

  • HashMap 看源码,理解用法,会有几个延伸,例如LinkedHashMap等
  • HashMap 需要知道初识容量、负载因子、扩容机制、Hash冲突/碰撞之后怎么办(有好几种处理办法,经典的是拉链)、rehash、NULL怎么处理、重写equals和hash方法原因、是否线程安全(延伸到多线程)。
  • List 链表 经典的ArrayList 和 LinkedList的区别 会用,知道各种操作的复杂度 用大O来表示,例如O(N) O(1),不懂可以搜以下算法复杂度。
  • Set 集合 可以关注下底层实现和对null值的处理
  • Stack 栈 掌握用法即可
  • List 需要注意下遍历过程中同时删除的问题,不会可以网上搜

我写的很少,但是需要自己下功夫,这里有1个Java的泛型的问题,可以不用深究,如果受过C语言泛型的毒打,相信会很喜欢Java的泛型,写各种数据结构的时候,不需要太关心类型。

基本类型和它的包装类

  • 自动拆箱装箱问题 即你可以写 Integer a = 10; int a = 10;两者有一点不同。
  • 包装类的比较问题, Integer a,b; a == b ?
  • 基本类型和string的各种转换
  • double和float的精度问题,必须要理解,可以去网上找IEEE 754 标准
  • double和float的比较问题 即 0.0 == 0.0 是返回true还是false,本质上同上1个问题
  • 类型提升问题
  • 溢出问题,即 Integer.MAX_VALUE + 1 会是多少?
  • 溢出问题,即 int a = b + c; 如果 b 和 c的和太大就会溢出,在你学习2分法的时候,可能要计算中间值,需要注意这个溢出问题
  • char型和 ‘A’ ‘a’ ‘Z’ 'z’的灵活运用
  • 和数据库交互的时候一般用包装类,和mysql或者oracle的列的对应 可以去网上搜
  • Java的无符号和有符号,需要注意一下

多线程和内存

这块相对来说比较难,我觉的不适合新手投入过多的精力,在学习编程的前1年,可以稍微关注一下就行了,理解以下概念即可

  • 进程是计算机分配内存等资源的最小单元,线程是计算机分配CPU时间的最小单元。
  • 线程有几个状态 NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED
  • 你需要理解什么是阻塞,什么是等待,可能需要一点计算机基础,不会也可以先跳过
  • 创建线程的几种方式
  • 怎么实现2个线程交叉打印奇数和偶数,用到了哪几个方法。
  • 怎么写1个线程池,线程池的队列的作用,满了怎么办
  • 什么时候用多线程? IO密集是什么意思? CPU密集是什么意思?
  • 学会用linux命令,查看JVM的进程,学会kill -9 pid 和 kill pid的区别
  • 学会2个线程顺序执行,即A执行完了,B再执行

暂时就这么几点把,不需要太多

Java的变量初始化顺序

简单来说就是静态变量、静态块、非静态变量等的初始化顺序,涉及到Java的类加载机制,这块如果搞清楚了,详细类加载机制你也就学的差不多了。这里先说结论,然后大家再做1道题,看看输出结果和你想象的一样,还是不一样就可以了

结论: 对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。

题目:说出输出结果

public class InitOrderDemo {
    // 程序入口
    public static void main(String[] args) {
        new SubClass();
    }
}
class Parent {
    // 静态变量
    public static String p_StaticField = "父类--静态变量";
    protected int i = 1;
    protected int j = 8;
    // 变量
    public String p_Field = "父类--变量";
    // 静态初始化块
    static {
        System.out.println(p_StaticField);
        System.out.println("父类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(p_Field);
        System.out.println("父类--初始化块");
    }
    // 构造器
    public Parent() {
        System.out.println("父类--构造器");
        System.out.println("i=" + i + ", j=" + j);
        j = 9;
    }
}

class SubClass extends Parent {

    // 静态变量
    public static String s_StaticField = "子类--静态变量";
    // 变量
    public String s_Field = "子类--变量";
    // 静态初始化块
    static {
        System.out.println(s_StaticField);
        System.out.println("子类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(s_Field);
        System.out.println("子类--初始化块");
    }
    // 构造器
    public SubClass() {
        System.out.println("子类--构造器");
        System.out.println("i=" + i + ",j=" + j);
    }
}

程序的输出结果是:

父类–静态变量
父类–静态初始化块
子类–静态变量
子类–静态初始化块
父类–变量
父类–初始化块
父类–构造器
i=1, j=8
子类–变量
子类–初始化块
子类–构造器
i=1,j=9

这里的顺序,需要牢牢的记住,说不定哪天你就用上了。

Java新手程序员必看书

  • Effective Java

是的,你没看错,就这么1本书,看了就能提升水平。

全文完。

关注我的博客,获取更多Java编程知识: 双King的技术博客

本文地址:https://blog.csdn.net/weixin_42649081/article/details/112008228

相关标签: Java