• 首先做一个自我介绍,我做java开发接近两年半的时间,真正开始看源码是从今年7月16号开始的,到现在大约过去了三个月,目前已看的有:集合类ArrayList/Vector/HashMap/HashTable/ConcurrentHashMap,包括jdk1.7和1.8...

    首先做一个自我介绍,我做java开发接近两年半的时间,真正开始看源码是从今年7月16号开始的,到现在大约过去了三个月,目前已看的有:集合类ArrayList/Vector/HashMap/HashTable/ConcurrentHashMap,包括jdk1.7和1.8的版本。另外简单了解了jvm虚拟机的内存结构、java中锁机制、synchronize的实现原理、spring ioc/aop的实现原理。

    现在回过头来,思考几个问题,看源码的目的是什么(是为了应付面试吗)?源码需要看到什么程度?这也是我以后想去探索总结的。

    在看源码的过程中,类的跳跃性大,给理解需求带来了挑战。打个比方,线程安全的1.7版本的ConcurrentHashMap中,使用了ReentranLock作为Segement的父类实现分段锁技术。那不经要熟悉了,什么是ReentranLock,他和synchronize关键字的区别在哪里。看到这儿思维就被阻塞或者带偏了。又例如1.8版本的ConcurrentHashMap中,使用了红黑树来优化链表过长带来的时间复杂度,这里涉及到红黑树算法的知识,求知欲驱使你去熟悉算法知识。

    整个学习过程是比较煎熬的,受到的挫折感强,所以各位同学要调整好心态,告诉自己,知识摆在那里,不是等你看到的时候才感觉到自己的无知,学习的过程也是养成习惯的过程,后者更为重要。

    未完待续。。。

    展开全文
  • java源码学习

    2019-07-06 04:07:35
     Collection  List  ArrayList  LinkedList  Vector  Stack   Set  HashSet  TreeSet  Map  HashMap  TreeMap  LinkedHashMap  C...

      

      Collection

        List

          ArrayList

          LinkedList

          Vector

          Stack    

        Set

          HashSet

          TreeSet

        Map

          HashMap

          TreeMap

          LinkedHashMap

          ConcurrentHashMap

        集合小结

        同步容器问题分析

      Queue

        ArrayBlockingQueue

          自定义Queue    

     

      设计模式

        单例模式

        代理模式

        观察者模式

        装饰者模式

        享元模式

     

      并发

        master-work

        

    转载于:https://www.cnblogs.com/LuisYang/p/10034493.html

    展开全文
  • 最新互联网大厂面试真题、Java程序员面试策略(面试前的准备、面试中的技巧)请移步GitHub 对于很多开源软件来说,如果我们把它作为我们业务系统的重要组成部分之一,真正地用于生产,仅仅知道如何使用是远远不够的...

    最新互联网大厂面试真题、Java程序员面试策略(面试前的准备、面试中的技巧)请移步GitHub

    对于很多开源软件来说,如果我们把它作为我们业务系统的重要组成部分之一,真正地用于生产,仅仅知道如何使用是远远不够的,你必须掌握它的实现原理和很多细节,这样才能找到最佳的使用姿势,当你的系统出现问题时,你才有可能基于它的实现原理,再根据一些现象来排查问题原因。

    掌握这些开源软件的最佳方式就是去学习它的源代码。很多同学跟我说:“我也很想去看一些开源软件的代码,也尝试去看过,但是面对上千个源码文件,几十万行代码,完全不知道从哪儿入手啊。”

    今天我们就针对这个情况来聊一聊,学习开源软件的代码该如何入手。

    有一点我提前说明一下,对于这节课里面涉及到的一些名词,我会直接使用英文,主要目的是方便你直接对应到那些开源软件英文官网上的标题。

    一、通过文档来了解开源项目

    学习源代码应该从哪儿入手呢?最佳的方式就是先看它的文档

    通过看文档,你可以快速地掌握这个软件整体的结构,它有哪些功能特性,它涉及到的关键技术、实现原理和它的生态系统等等。在掌握了这些之后,你对它有个整体的了解,然后再去看它的源代码,就不会再有那种盲人摸象找不到头绪的感觉了。

    首先强调一点是,你必须去看这些开源软件官方网站上的文档,尽量不要去网上搜一些翻译的中文文档。为什么呢?

    因为这些开源软件,特别是一些社区活跃的软件,它的迭代是很快的,即使是自带官方中文翻译的项目,它的中文文档很多都会落后于英文版,你能看到的中文版本很多时候都已经过时了。那非官方的翻译,问题可能就不止是过时的问题了,可能还会出现一些错漏的地方。所以,最好还是直接来看官方的英文文档。

    如果说你的英文阅读水平确实有限,直接阅读英文文档有困难或者看得非常慢,怎么办?你还是要按照我接下来告诉你的方法去看它的英文官网,即使阅读大段的技术文章有困难,网站的标题你总能看懂吧?找到你需要阅读的文章后,你可以在网上搜一下对应的中文版本,先看一遍中文版,然后再对着英文原版过一遍,弥补中文版可能过时或翻译不准确的问题。

    开源社区经过这么多年的发展,它已经形成一个相对比较成熟的文化。每个开源软件,代码如何管理、社区成员如何沟通、如何协作这些都已经形成了一个比较固定的套路。大多数开源软件,它的官网和技术文档也是有一个相对比较固定的结构的。

    接下来我们以Kafka 的官网为例子,来说下怎么来看它的文档。

    如果说你对这个项目完全不了解,没用过这个软件,你首先需要看的文档是Quick Start,按照 Quick Start 中的指导快速把它的环境搭起来,把它运行起来,这样你会对这个项目有个感性认识,也便于你在后续深入学习的时候“跑”一些例子。

    然后你需要找一下它的Introduction,一般里面会有项目的基本介绍。这里面很重要的一点是,你需要找到这个项目用到的一些基本概念或者名词的介绍文档,在 Kafka 的文档中,

    这些内容就在 Introduction 里面,比如 Topic、Producer、 Consumer、Partition 这些概念在 Kafka 中代表的含义。

    有些开源项目会单独有一个 Basic Concepts 文档来讲这些基础概念。这个文档非常重要,因为这些开源社区的开发者都有个很不好的爱好:发明概念。很多开源项目都会自己创造一些名词或者概念,了解这些基本概念才有可能看懂它项目的其他文档。

    对项目有个基本的了解之后呢,接下来你可以看一下它的使用场景、功能特性以及相关的生态系统的介绍。在 Kafka 中功能相关的内容在Use cases和EcoSystem两篇文章中,有些项目中会有类似名为 Features 的文档介绍功能和特性。

    其中项目的生态系统,也就是 EcoSystem,一般会介绍它这个项目适用的一些典型的使用场景,在某个场景下适合与哪些其他的系统一起来配合使用等。如果说你的系统不是特别特殊或者说冷门的话,你大概率可以在 EcoSystem 里面找到和你类似的场景,可以少走很多的弯路。

    你在读完上面这些文档之后,对这个项目的整体应该会有一个比较全面的了解了,比如说:

    • 这个项目是干什么的?
    • 能解决哪些问题?
    • 适合在哪些场景使用?
    • 有哪些功能?
    • 如何使用?

    对这些问题有一个初步的答案之后,接下来你就可以去深入学习它的实现原理了。这是不是意味着,你可以立即去看它的源码呢?这样做或许可行,但并不是最好的方法。

    你知道大部分开源项目都是怎么诞生的吗?一般来说是这样的:某个大学或者大厂的科学家,某天脑海里突然出现了一个改变世界的想法,科学家们会基于这个想法做一些深入的研究,然后写了一篇论文在某个学术期刊或者会议上发表。论文发表后在业内获得很多的赞,这时候就轮到像 Google、Facebook 这样的大厂出手了:这个论文很有价值,不如我们把它实现出来吧?一个开源项目就这样诞生了。

    所以,对于这样的开源项目,它背后的这篇论文就是整个项目的灵魂,你如果能把这篇论文看完并且理解透了,这个项目的实现原理也就清楚了。

    学习完项目灵魂,就可以开始阅读源码了。

    二、用以点带面的方式来阅读源码

    需要注意的是,你在读源码的时候,千万不要上来就找 main 方法这样泛泛地去看,为什么?你可以想一下,一篇文章,它是一个线性结构,你从前往后读就行了。一本书呢?如果我们看目录的话,可以认为是个树状结构,但大多数的书的内容还是按照线性结构来组织的,你可以从前往后读,也可以通过目录跳着读。

    那程序的源代码是什么结构?那是一个网状结构,关系错综复杂,所以这种结构是非常不适合人类去阅读的。你如果是泛泛去读源代码,很容易迷失在这个代码织成的网里面。那怎么办?
    我推荐大家阅读源码的方式是,带着问题去读源码,最好是带着问题的答案去读源码。你每次读源码之前,确定一个具体的问题,比如:

    • RocketMQ 的消息是怎么写到文件里的?
    • Kafka 的 Coordinator 是怎么维护消费位置的?

    类似这种非常细粒度的问题,粒度细到每个问题的答案就是一两个流程就可以回答,这样就可以了。如果说你就想学习一下源代码,或者说提不出这些问题怎么办呢?答案还是,看文档

    确定问题后,先不要着急看源代码,而是应该先找一下是否有对应的实现文档,一般来说,核心功能都会有专门的文档来说明它的实现原理,比如在 Kafka 的文档中,DESIGN和IMPLEMENTATION两个章节中,介绍了 Kafka 很多功能的实现原理和细节。一些更细节的非核心的功能不一定有专门的文档来说明,但是我们可以去找一找是否有对应的Improvement Proposal。(Kafka 的所有 Improvement Proposals 在这里。)

    这个 Improvement Proposal 是什么呢?你可以认为它是描述一个新功能的文档,一般开源项目需要增加一个新的功能或者特性的时候,都会创建一个 Improvement Proposal,一般标题都是"xIP- 新功能名称",其中 IP 就是 Improvement Proposal 的缩写,x 一般就是这个开源项目的名称的首字母,比如 Kafka 中 Improvement Proposal 的标题就都是以KIP 来开头。

    每个 Improvement Proposal 都是有固定格式的,一般要说明为什么需要增加这个功能,会对系统产生那些影响和改变,还有我们最关心的设计和实现原理的简述。

    你读完讲解实现的文档再去看源代码,也就是我刚刚说的,不只是带着问题去读,而是带着答案去读源码。这样你在读源码的时候,不仅仅是更容易理解源代码,还可以把更多的精力放在一些实现细节上,这样阅读源码的效果会更好。

    使用这种以问题为阅读单元的方式来读源代码,你每次只要花很短的时间,阅读很少的一部分源码,就能解决一个问题,得到一些收获。这种方式其实是通过一个一个的问题,在网状的源代码中,每次去读几个点组成的那一两条线。随着你通过阅读源码了解的问题越来越多,你对项目源码的理解也会越来越全面和深入。

    三、总结

    如果你想了解一个开源项目,学习它的代码,最佳的切入点就是去读它的官方文档,这些文档里面,最重要的灵魂就是项目背后的那篇论文,它一般是这个开源项目的理论基础。

    在阅读源码的时候呢,最佳的方式是带着问题去阅读,最好是带着问题的答案去读,这样难度低、周期短、收获快。不要想着一定要从总体上去全面掌握一个项目的所有源代码,也没有必要。

    展开全文
  • Java学习代码合集

    2019-07-17 10:49:41
    其实我学习java最根本的原因是:我是一个挺关注外在的人,虽然是个程序员,所以我很喜欢写出那些带有漂亮的界面的程序,因为C总是控制台,我不是很喜欢,在这份java代码合集中,我会记录自己学习Java界面化编程的...

    其实我学习java最根本的原因是:我是一个挺关注外在的人,虽然是个程序员,所以我很喜欢写出那些带有漂亮的界面的程序,因为C总是控制台,我不是很喜欢,在这份java代码合集中,我会记录自己学习Java界面化编程的点点滴滴。

    更新:因为C/C++是我主要使用语言,所有后来写界面主要用Qt写了,但我java也会继续学的。我只是给想学界面gui的同志一个思路。可以参考这篇文章Qt5 计算器的实现

    可能会有java初学者,我也是,说明,java是一个工程里可以有很多java类class,每一个类class都可以单独运行,不像C语言里只能有一个main()函数可以运行,这是我的代码合集程序结构:

    helloworld:

    class Javahelloworld {
        public static void main(String args[]){
            System.out.println("hello world\n");
        }
    }
    

    基本输入输出:

    import java.util.Scanner;
    public class ScannerTest {
        public static void main(String[] args){
            Scanner scanner=new Scanner(System.in);
            System.out.print("请输入一个数");
            int a=scanner.nextInt();
            System.out.printf("%d的平方是%d\n",a,a*a);
        }
    }
    

    Java图形化界面求数的平方:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;/**包含JFrame*/
    public class AppGraphInOut {
        public static  void main(String args[]){
            new AppFrame();
        }
    }
    
    class AppFrame extends  JFrame
    {
        JTextField in=new JTextField(10);
        JButton btn=new JButton("求平方");
        JLabel out=new JLabel("用于显示平方结果的标签");
        public AppFrame()
        {
            setLayout(new FlowLayout());
            getContentPane().add(in);
            getContentPane().add(btn);
            getContentPane().add(out);
            btn.addActionListener(new BtnActionAdapter());
            setSize(400,100);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setVisible(true);
        }
    
        class BtnActionAdapter implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                String s=in.getText();
                double d=Double.parseDouble(s);
                double sq=d*d;
                out.setText(d+"的平方是:"+sq);
            }
        }
    }
    

    Java位运算:

    public class BitwiseOperators {
        public static  void main(String args[]){
            int a=0b1100;
            int b=0b1010;
            print("a    ",a);
            print("b    ",b);
            print("a&b  ",a&b);
            print("a|b  ",a|b);
            print("a^b  ",a^b);
            print("~a   ",~a);
            print("a<<2 ",a<<2);
            print("a>>2 ",a>>2);
            print("a>>>2    ",a>>>2);
        }
        static void print(String prefix,int n){
            String s=Integer.toBinaryString(n);
            while(s.length()<4)s="0"+s;
            System.out.print(prefix+" "+s+"\n");
        }
    }
    

    同心圆:

    import java.awt.*;
    import javax.swing.*;
    
    public class Circle99Frame extends JFrame {
        public static void main(String args[])
        {
            JFrame frame=new Circle99Frame();
            frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            frame.setSize(600,600);
            frame.setVisible(true);
        }
        public void paint(  Graphics g)
        {
            g.drawString("circle 99",20,20);
            int x0=getSize().width/2;
            int y0=getSize().height/2;
            for(int r=0;r<getSize().height/2;r+=10)
            {
                g.setColor(getRandomColor());
                g.drawOval(x0-r,y0-r,r*2,r*2);
            }
        }
        Color getRandomColor()
        {
            return new Color(
                    (int)(Math.random()*255),//random本身只产生(0~1)之间的小数,
                    (int)(Math.random()*255),
                    (int)(Math.random()*255)
            );
        }
    }
    

     

    下面呢是一个常见的简陋的登陆界面,这个程序是这个两个类class共同组成的程序,先看代码:

    
    import javax.swing.JFrame;
    
    import javax.swing.JPanel;
    
    public class DemoFrame extends JFrame{
    
        public DemoFrame(DemoPanel panel)
    
        {
    
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            this.setSize(300, 200);
    
            this.setTitle("Frame Demo");
    
            this.add(panel);
    
            this.setResizable(false);
    
            this.setVisible(true);
    
        }
    
    
    
        public static void main(String[] args)
    
        {
    
            DemoPanel panel = new DemoPanel();
    
            DemoFrame Frame = new DemoFrame(panel);
    
        }
    
    }  
    import java.awt.GridLayout;
    
    
    
    import javax.swing.JButton;
    
    import javax.swing.JLabel;
    
    import javax.swing.JPanel;
    
    import javax.swing.JPasswordField;
    
    import javax.swing.JTextField;
    
    
    
    public class DemoPanel extends JPanel{
    
    
    
        private JLabel labelUser, labelPassWd;            //标签      用户名,密码
    
        private JButton buttonLogin, buttonReset;         //按钮      登录,重置
    
        private JTextField textFieldUserName;             //文本框  用户名输入
    
        private JPasswordField passWdField;               //密码框  密码输入
    
        private JPanel panelUserName;
    
        private JPanel panelPassWd;
    
        private JPanel panelLoginButton;
    
    
    
        public DemoPanel(){
    
            this.labelUser = new JLabel("用户名");
    
            this.labelPassWd = new JLabel("密    码");
    
            this.buttonLogin = new JButton("登录");
    
            this.buttonReset = new JButton("重置");
    
            this.textFieldUserName = new JTextField(10);
    
            this.passWdField = new JPasswordField(10);
    
            this.panelPassWd = new JPanel();
    
            this.panelUserName = new JPanel();
    
            this.panelLoginButton = new JPanel();
    
    
    
            this.setLayout(new GridLayout(3, 1));  //网格式布局
    
    
    
            this.panelUserName.add(this.labelUser);
    
            this.panelUserName.add(this.textFieldUserName);
    
            this.panelPassWd.add(this.labelPassWd);
    
            this.panelPassWd.add(this.passWdField);
    
            this.panelLoginButton.add(buttonLogin);
    
            this.panelLoginButton.add(buttonReset);
    
    
    
            this.add(this.panelUserName);
    
            this.add(this.panelPassWd);
    
            this.add(this.panelLoginButton);
    
        }
    
    }

    程序结果如下 :

    简单的加法器:

    package TEST;
    
    
    
    import javax.swing.JOptionPane;  //导入类
    
    
    
    public class TEST
    
    {
    
        public static void main(String args[])
    
        {
    
            String input_pane1,input_pane2;
    
            int n1,n2,sum;
    
            input_pane1 = JOptionPane.showInputDialog("Please input the first number");  //输入框1
    
            input_pane2 = JOptionPane.showInputDialog("Please input the second number"); //输入框2
    
            n1 = Integer.parseInt(input_pane1); //获取输入框中输入数据的整数类型
    
            n2 = Integer.parseInt(input_pane2);//获取输入框中输入数据的整数类型
    
            sum = n1+n2;
    
            JOptionPane.showMessageDialog(null, "The sum is: "+sum,"Adding Device",JOptionPane.PLAIN_MESSAGE);
    
            //第1个参数:null 显示在中央
    
            //第2个参数:要显示的字符
    
            //第3个参数:标题栏信息
    
            //第4个参数:对话框类型
    
            System.exit(0);  //终结图形用户界面程序必须的
    
        }
    
    }

    结果如下:

    说到这里,我其实有些感触,记得上学期,我们做课程设计,当时一个同学的题目是写一个带界面的大数乘除运算器,关于大数乘除的方法,我有时间再总结一下,但是这个界面当时同学其实是不会的,但是现在看,如果单纯实现界面还是比较简单的,首先看我修改的第一个拙劣的界面版本模板:

    这样其实就好了很多,起码可以看到加数是哪些了,代码很简单,只需要在输出那行添加上n1和n2的信息就可以了。

    JOptionPane.showMessageDialog(null, n1+"+"+n2+" The sum is: "+sum,"Adding Device",JOptionPane.PLAIN_MESSAGE);
    

     

    展开全文
  • 最近有朋友突然问我一个问题 “你怎么把UE4引擎代码看的那么深入的?” 看到问题后我还愣了一下,因为这是第一次有人给我打了个”深入UE4...我只想着分享我对引擎学习的心得总结,却从没有想过分享我的学习方法,或...

    最近有朋友突然问我一个问题 “你怎么把UE4引擎代码看的那么深入的?”

    看到问题后我还愣了一下,因为这是第一次有人给我打了个”深入UE4”的标签。其实我接触虚幻引擎满打满算也就两年,确实谈不上深入。只是靠着平时的学习习惯积累,写了一些相关的技术文章。

    但这个事却让我突然意识到最容易被我忽略的学习习惯很可能是有一定价值和意义的。我只想着分享我对引擎学习的心得总结,却从没有想过分享我的学习方法,或许后者更为重要。

    每一个人做事都有自己的风格与习惯。当你发现身边一个人很优秀的时候,你去看一下他的24小时是怎么度过的,然后再对比一下你的24小时,答案就很明了了。同理,如果你觉得学习源码很困难,不妨请教一下那些比较牛的”过来人”,看一下别人学习源码模块的流程。当然具体来说,影响一个事物的维度,细节,前提条件都很多,别人的方法照搬过来可能是行不通的,比如说别人能一天雷打不动地学10个小时,这个放到有些人身上几乎不可能。这些道理大家都明白,我也不过多阐述。

    回归主题,既然标题是“如何学习大型项目的源码”,所以下面我把自己学习虚幻引擎源码(C++)的思路和过程给分享给大家。

    虚幻引擎源码大概有几百万行(没有确切统计过,可以参考下面的纯代码文件夹截图),最早可以追溯到1998年Epic自主研发的3D游戏——虚幻。对于一个提供了如此完善功能的游戏引擎,可以想象到他的代码是相当复杂的。所以,在学习的一开始你要明确,你的目的不应该是从头到尾地读遍他所有的源码,而是确定好学习目标后,抽丝剥茧地且有条理的整理出某一个具体模块的内容。

    这里写图片描述

    这里先给出简化版的总结,然后我会针对每条做进一步的阐述。

    准备工作:建议准备大块且连续的时间(细碎的时间容易中断类关系的梳理),一个比较方便查找的IDE或工具(VS,Notepad++等),类图工具(staruml,Edraw等)

    学习步骤(简化版):

    • 1.决定要学习的模块,查找官方文档、相关的总结文章,整理出大概的学习内容与目标
    • 2.运行程序,观察表现
    • 3.运行源码,断点调试,从头跟一边源码的执行流程,注意函数堆栈
    • 4.画类图、流程图,先把遇到的重要类记录下来,表明各个类的关系
    • 5.记录问题,把不理解的类或者内容以问题的方式记录下来
    • 6.写文章、笔记,尝试逐个解决之前遗留的问题

    2-6可能需要持续的重复进行


    学习步骤(详细版):

    1. 查找官方文档、相关的总结文章
      比如说我想研究网络模块,首先去官方文档、论坛、wiki里面过一遍网络相关的所有内容,这时候遇到不懂的问题尽可能解决,解决不了的就把问题记下来,先去官方文档看我觉得是非常有必要的,因为这里的文章是最权威的,错误率非常低。然后,去Google、百度搜索相关的文章与帖子,同时可以加入一些技术qq群(有一些水群果断退了就行,保留一些优质的交流群),过一遍这些文章和资料。目前能看到比较好的技术网站大体上就是各个技术对应的官方网站(论坛)、StackOverflow、知乎、博客园、简书、CSDN、一些个人网站等,当然有些网站复制粘贴现象严重,需要自己筛选。建议能找到原文链接的尽量去原文里面看,因为你有可能从原创作者那里看到更多优秀的文章。

    2. 在运行程序的时候,我们需要调整各种参数来执行不同的情况,进而观察其表现效果来验证我们的猜想与结论。
      比如说,对于一个处于休眠状态的Actor属性是否能正常同步,如果客户端属性与服务器一样是否还会执行回调函数等。执行程序可以快速的得到结论,然后根据结论我们可以更快速准确的进行分析。为了提高效率,最好在一开始就设置不同的配置、GM等来在项目运行时动态改变运行内容,因为大型项目一般都是编译型语言,我们可能可能需要频繁的修改代码编译再重新运行。

    3. 调试可以说是最为关键的一步了,80%的细节需要你在调试中去理解函数什么时候执行到这里(函数断点)?每一步每一个属性值是多少?属性值什么时候发生变化(条件断点)?一个完整的执行流程是什么样的(函数堆栈)?这些问题需要你一点一点的进行跟踪调试,最后再去解决。

    4. 画图的习惯可能很多人没有,但是我个人觉得这是一个必不可少的环节,因为他可以大幅度提高你对框架理解的速度对于任何一个复杂的项目,每一个模块都会牵扯到大量的类(排除纯C项目),类的关系错综复杂,而且为了降低耦合还可能用到各种设计模式,这些都大大提高了代码的阅读难度,很有可能你看了3、4个类之后就完全搞混了他们都是干什么的。举例来说,我在看UE4属性同步模块的时候,完全被各个类之间的关系搞蒙了,所以我看到一个类就把他的类图画下来,看到相关的类就记录他们的关系,最后得到了下面这样一个简化的类图。经过梳理后,几句话我就可以概括他们之间的关系。当然,除了类图以外,还有流程图、时序图,甚至是你自己为了方便发明的“模块关系图”,这时候图的种类与规范其实没有那么重要,只要能帮助你理解就行。这里写图片描述

    5. 记录的问题有两种:别人给你的问题以及你自己给自己的问题别人给你的问题
      别人给你的问题:你在阅读的时候不可能一帆风顺,可能在第一步的时候,就已经遇到了无数的问题。这时候不要着急,按照重要程度顺序依次解决,简单的问题直接网上搜一搜,解决不了可以找身边的大神,网上的牛人解决。如果还是不行,就把问题记下来,然后继续学习,当你深入到一定程度的时候,你的问题可能就不攻自破了。
      自己给自己的问题:当你解决了别人给你的问题后,你应该已经理解了一大半了。不过,任何人写的文章都不可能覆盖到全部,你需要自己挖掘更多更深的问题,然后自己再去解答,这样你才能做到比别人了解的更多,更能体现出你自己的价值。

    6. 写文章和写笔记是有区别的,但是都很有意义
      写文章这件事相比上面的步骤我觉得不算是必须的,这个适合那些追求完美还能挤出时间的人。你写的东西是要给别人看的,所以你的目的是给别人讲清楚。我在写文章的时候会去考虑这个东西我说的真的对么,有没有把握,考虑的是否全面。在这种自我拷问下,我会尽可能的完善我的知识体系,修改文章中那些看起来不够准确的内容。如果最后能做到给读者讲清楚的话,那你是真的会了。
      写笔记相比写文章要轻松很多,我只是把我总结的内容,学习的收获记录下来,不需要考虑太多的东西。虽然没有写文章那么追求完美,但是这个过程中我们可能也会多了很多思考,在之后的学习过程中快速的回忆起自己学习的经验。

    备注:第一次执行这个过程是相当漫长和艰难的,如果和我一样一开始知识储备不够,那么几乎每走一步都需要大量的学习和查资料。不过只要坚持下去,你最后会发现自己的收获非常大,阅读其他模块的源码也变得容易很多。
    上面只是我学习源码的一个方法,可能并不适合所有人,也还有很多地方可以进一步完善。

    最后,我再强调一点,如果只是为了使用好一个工具,你不需要彻彻底底的理解所有内容,因为你的时间是有限的。如果你真的是抱着学习的态度去研究源码细节,那请做好花费大量时间的准备并坚持下去。

    有哪些更好的方法或者建议,欢迎留言评论。

    更多内容欢迎关注同名微信公众号: 游戏开发那些事

    展开全文
  • 一、背景 作为Java开发工程师,想进阶,阅读别人项目的源码,尤其是开源的优秀核心技术栈的源码必不可少的步骤。 那么有什么高效的阅读源码的...今天和好友探讨过这个问题,把我们认为比较好的阅读和学习源码的技...
  • JAVA源码学习要点汇总

    2018-05-13 16:07:49
    JVM的原理3.java变量4.java数据类型5.java运算符6.java判断语句if-else7.java循环语句switch-case\for\while\do-while和continue\break二、面向对象1.构造函数2.关键词static、super、final3.继承4.方法重载和覆盖5...
  • 出于学习或面试的原因,需要去查看 Java 源码(比如HashMap的实现等)。我们可以在IDE中写代码时点击指定类/接口/方法可以直接查看源码,或通过包依赖目录查看,这些都不错,我这里也多提供另一种方法。 工具 - VS...
  • Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
  • 我们为自学者编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么疑问的地方也可以加小编的微信Java_Bczn,小编后期还会整理...
  • 我们学习源码肯定需要排除干扰,如com,jdk,sun,org等一看就不是我们需要的 需要注意的是,Java包里是原生的源码实现.而javax相当于随着技术的发展,有了新的更好的,实现,而对原生代码的增强.为了保证向下兼容新...
  • java的日常学习中,我们有时候会需要看java的api说明,或者是查看java源码,使我们更好的了解java,接下来我就来说说如何查看java的api以及java源码 对于java的api,一般是在下面的网址中进行查看 ...
  • 1. java2s http://www.java2s.com/  这个网站非常好,分成三大类,分别是Example、...比如,如果要学习SWT/JFace,只要把Example下的SWT JFace Eclipse 研究一下也就可以了。另外,这个网站还有JavaScript DHTML、 C
  • Hi大家好,我是清和二七,今天我们来聊聊《Java集合源码剖析-Java集合框架》 一.层次关系 Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合...
  • java源码包2

    2020-07-09 23:31:15
    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
  • 如何学习java源码

    2015-07-22 14:03:10
    说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃《Core Java》,你是很难从中吸收到营养的,特别是《深入Java虚拟机》这类书,别人觉得好,未必适合现在的你。...
  • JAVA源码学习--String

    2017-05-04 18:56:02
    最近发四重新学习java的基础,从基本类型以及里面的各种方法开始看起,看的一本书《JAVA核心技术卷1,基础知识》,这是第十版,讲的JDK8的一些特性。 我在想我们创建对象的时候都是这样进行创建的People p = new ...
  •  笔者当初为了学习JAVA,收集了很多经典源码源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时...
  • 如何阅读Java源码

    2019-03-25 10:34:30
    阅读Java源码的前提条件: 1、技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持。 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃《Core Java》,那样是很难有收获的,尤其是《深入...
  • 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃《Core Java》,你是很难从中吸收到营养的,特别是《深入Java虚拟机》这类书,别人觉得好,未必适合现在的你。
1 2 3 4 5 ... 20
收藏数 239,414
精华内容 95,765