精华内容
下载资源
问答
  • java面试题28 牛客 下面有关java classloader说法错误是? A Java默认提供三个ClassLoader是BootStrap ClassLoader,Extension ClassLoader,App ClassLoader B ClassLoader使用是双亲委托模型来搜索类 ...

    java面试题28 牛客 下面有关java classloader说法错误的是?

    A Java默认提供的三个ClassLoader是BootStrap ClassLoader,Extension ClassLoader,App ClassLoader
    B ClassLoader使用的是双亲委托模型来搜索类的
    C JVM在判定两个class是否相同时,只用判断类名相同即可,和类加载器无关
    D ClassLoader就是用来动态加载class文件到内存当中用的

    蒙蔽树下蒙蔽果,蒙蔽树上你和我


    Java语言系统自带有三个类加载器:

        Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。比如java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。我们可以打开我的电脑,在上面的目录下查看,看看这些jar包是不是存在于这个目录。
        Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。
        Appclass Loader也称为SystemAppClass 加载当前应用的classpath的所有类。

    我们上面简单介绍了3个ClassLoader。说明了它们加载的路径。并且还提到了-Xbootclasspath和-D java.ext.dirs这两个虚拟机参数选项。
    加载顺序?

    我们看到了系统的3个类加载器,但我们可能不知道具体哪个先行呢?
    我可以先告诉你答案

        Bootstrap CLassloder
        Extention ClassLoader
        AppClassLoader

    为了更好的理解,我们可以查看源码。
    看sun.misc.Launcher,它是一个java虚拟机的入口应用。
     

    public class Launcher {
        private static Launcher launcher = new Launcher();
        private static String bootClassPath =
            System.getProperty("sun.boot.class.path");
    
        public static Launcher getLauncher() {
            return launcher;
        }
    
        private ClassLoader loader;
    
        public Launcher() {
            // Create the extension class loader
            ClassLoader extcl;
            try {
                extcl = ExtClassLoader.getExtClassLoader();
            } catch (IOException e) {
                throw new InternalError(
                    "Could not create extension class loader", e);
            }
    
            // Now create the class loader to use to launch the application
            try {
                loader = AppClassLoader.getAppClassLoader(extcl);
            } catch (IOException e) {
                throw new InternalError(
                    "Could not create application class loader", e);
            }
    
            //设置AppClassLoader为线程上下文类加载器,这个文章后面部分讲解
            Thread.currentThread().setContextClassLoader(loader);
        }
    
        /*
         * Returns the class loader used to launch the main application.
         */
        public ClassLoader getClassLoader() {
            return loader;
        }
        /*
         * The class loader used for loading installed extensions.
         */
        static class ExtClassLoader extends URLClassLoader {}
    
    /**
         * The class loader used for loading from java.class.path.
         * runs in a restricted security context.
         */
        static class AppClassLoader extends URLClassLoader {}
    


    源码有精简,我们可以得到相关的信息。

    Launcher初始化了ExtClassLoader和AppClassLoader。
        Launcher中并没有看见BootstrapClassLoader,但通过System.getProperty("sun.boot.class.path")得到了字符串bootClassPath,这个应该就是BootstrapClassLoader加载的jar包路径。

    我们可以先代码测试一下sun.boot.class.path是什么内容。
     

    System.out.println(System.getProperty("sun.boot.class.path"));

    得到的结果

    C:\Program Files\Java\jre1.8.0_91\lib\resources.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\rt.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\sunrsasign.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\jsse.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\jce.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\charsets.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\jfr.jar;
    C:\Program Files\Java\jre1.8.0_91\classes

    可以看到,这些全是JRE目录下的jar包或者是class文件。
    ExtClassLoader源码

    如果你有足够的好奇心,你应该会对它的源码感兴趣

    
    /*
         * The class loader used for loading installed extensions.
         */
        static class ExtClassLoader extends URLClassLoader {
    
            static {
                ClassLoader.registerAsParallelCapable();
            }
    
            /**
             * create an ExtClassLoader. The ExtClassLoader is created
             * within a context that limits which files it can read
             */
            public static ExtClassLoader getExtClassLoader() throws IOException
            {
                final File[] dirs = getExtDirs();
    
                try {
                    // Prior implementations of this doPrivileged() block supplied
                    // aa synthesized ACC via a call to the private method
                    // ExtClassLoader.getContext().
    
                    return AccessController.doPrivileged(
                        new PrivilegedExceptionAction<ExtClassLoader>() {
                            public ExtClassLoader run() throws IOException {
                                int len = dirs.length;
                                for (int i = 0; i < len; i++) {
                                    MetaIndex.registerDirectory(dirs[i]);
                                }
                                return new ExtClassLoader(dirs);
                            }
                        });
                } catch (java.security.PrivilegedActionException e) {
                    throw (IOException) e.getException();
                }
            }
    
            private static File[] getExtDirs() {
                String s = System.getProperty("java.ext.dirs");
                File[] dirs;
                if (s != null) {
                    StringTokenizer st =
                        new StringTokenizer(s, File.pathSeparator);
                    int count = st.countTokens();
                    dirs = new File[count];
                    for (int i = 0; i < count; i++) {
                        dirs[i] = new File(st.nextToken());
                    }
                } else {
                    dirs = new File[0];
                }
                return dirs;
            }
     
    ......
        }
    


    我们先前的内容有说过,可以指定-D java.ext.dirs参数来添加和改变ExtClassLoader的加载路径。这里我们通过可以编写测试代码。
     

    System.out.println(System.getProperty("java.ext.dirs"));


    结果如下:

    C:\Program Files\Java\jre1.8.0_91\lib\ext;C:\Windows\Sun\Java\lib\ext

    AppClassLoader源码
     

    /**
         * The class loader used for loading from java.class.path.
         * runs in a restricted security context.
         */
        static class AppClassLoader extends URLClassLoader {
    
    
            public static ClassLoader getAppClassLoader(final ClassLoader extcl)
                throws IOException
            {
                final String s = System.getProperty("java.class.path");
                final File[] path = (s == null) ? new File[0] : getClassPath(s);
    
         
                return AccessController.doPrivileged(
                    new PrivilegedAction<AppClassLoader>() {
                        public AppClassLoader run() {
                        URL[] urls =
                            (s == null) ? new URL[0] : pathToURLs(path);
                        return new AppClassLoader(urls, extcl);
                    }
                });
            }
    
            ......
        }
    


    可以看到AppClassLoader加载的就是java.class.path下的路径。我们同样打印它的值。
     

    System.out.println(System.getProperty("java.class.path"));


    结果:

    D:\workspace\ClassLoaderDemo\bin



    这个路径其实就是当前java工程目录bin,里面存放的是编译生成的class文件。
    好了,自此我们已经知道了BootstrapClassLoader、ExtClassLoader、AppClassLoader实际是查阅相应的环境属性sun.boot.class.path、java.ext.dirs和java.class.path来加载资源文件的。

    看到这里我们容易知道A答案是正确的

    ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。想想也是的,一次性加载那么多jar包那么多class,那内存不崩溃。

    看完这句话我们主动D也是正确的

    ClassLoader用来加载class文件的。
        系统内置的ClassLoader通过双亲委托来加载指定路径下的class和资源。
        可以自定义ClassLoader一般覆盖findClass()方法。
        ContextClassLoader与线程相关,可以获取和设置,可以绕过双亲委托的机制。

    看完这句话我们知道B也是没问题

    再来看看C

    JVM在判定两个class是否相同时,不仅要判断两个类名是否相同,而且要判断是否由同一个类加载器实例加载的。

    所以答案为C

    我是歌谣,如有不合理之处欢迎讨论。一起学习,共同成长

    阅读目录(置顶)(长期更新计算机领域知识)

    阅读目录(置顶)(长期更新计算机领域知识)

    阅读目录(置顶)(长期科技领域知识)

    歌谣带你看java面试题

    展开全文
  • 组合键的判断

    2009-06-11 15:38:00
    在网上找了半天也没有一个较为容易理解的说法判断组合键,经过5天的折腾,终于让我折腾出来了~~哈哈系统:xp sp3;编译环境:VC++6.0;使用键盘:罗技标准键盘;原理:组合键多由两个字符组成,比如:F1,它是由空字符和分号,...

    在网上找了半天也没有一个较为容易理解的说法来判断组合键,经过5天的折腾,终于让我折腾出来了~~哈哈

    系统:xp sp3;

    编译环境:VC++6.0;

    使用键盘:罗技标准键盘;

    原理:组合键多由两个字符组成,比如:F1,它是由空字符和分号,ASCII码由0和59两部分组成,那么可以先进行判断

    这里的判断最好用的是getch函数,它可以直接读取ASCII码,下面这个例子就是说明判断按下的是F1,如果是其他键将跳出;

    #include <stdio.h>
    #include <conio.h>

    main ()

    {
        char c;    
        while(1)
           
        {
           
            c=getch();
           
            if (c==NULL)
               
            {
               
                c=getch();
               
                if (c==59)
                {
                    printf("you input is F1/n");
                    continue;
                }
                else
                {
                    printf("you input is other resultant key/n");
                    break;
                }
           
            }    
            printf("you input is not F1/n");
            break;
           
        }
        return 0;
    }

    以上程序经过验证,可以有效的判断!

    值得说明的是:

    具体组合键的键值是由哪几个字符组成,最好自己实际写个小程序看看,我从网上看了一些组合键的ASCII不是

    完全正确的,所以还是实践出真理呀~~~~

    展开全文
  • C++闰年判断

    2021-03-16 19:50:32
    在数学上的说法,就是 能被4整除的同时能被100整除 或者能被400整除。 那么在程序上怎么体现的呢?就是下面这样啦: (n%4==0&&n%100!=0)||n%400==0 同时,考虑到逻辑运算符等级的运算,我们可以将括号...

    今天闲来无事,突发奇想,写个闰年判断的程序

     

    想要写程序,首先要知道要求和完成条件。那么,怎么判断闰年呢?

    在数学上的说法,就是

    能被4整除的同时能被100整除

    或者能被400整除。

    那么在程序上怎么体现的呢?就是下面这样啦:

    (n%4==0&&n%100!=0)||n%400==0

    同时,考虑到逻辑运算符等级的运算,我们可以将括号去掉

    n%4==0&&n%100!=0||n%400==0

     判断条件有了,那么思路也很清晰了。

    我们只需要输入一个年份,然后判定是否符合上面的条件,是就输出闰年,不是就输出平年

    自然,我们就能写出代码啦

    #include<iostream>
    #include<string>
    using namespace std;
    int main(void){
    	int n;
    	string a="平年";
    	cin>>n;
    	if(n%4==0&&n%100!=0||n%400==0)
    		a="闰年";
    	cout<<a;
    }

    以上!!!

    展开全文
  • 先来说说我们经常听到一种说法,引用计数算法。这种算法大体思路是:给每一个对象添加一个引用计数器,每当有一个地方引用对象时,计数器值+1;引用失效,值-1;任何时刻当计数器值为0时,这对象就是不可能再...
    • 引用计数算法

    先来说说我们经常听到的一种说法,引用计数算法。这种算法的大体思路是:

    给每一个对象添加一个引用计数器,每当有一个地方引用对象时,计数器的值+1;引用失效,值-1;任何时刻当计数器值为0时,这对象就是不可能再被使用的。

    客观的讲,引用计数算法实现简单,效率高。然而在主流的Java虚拟机中有没有使用此算法呢?我们一起来看看下面这个例子:

    public class CountGC {
        public Object instance = null;
        private static final int _1MB = 1024*1024;
        private byte[] bigSize = new byte[2 * _1MB];
    
        public static void main(String[] args) {
            testGC();
        }
    
        public static void testGC() {
            CountGC objA = new CountGC();
            CountGC objB = new CountGC();
    
            objA.instance = objB;
            objB.instance = objA;
    
            objA = null;
            objB = null;
    
            System.gc();//如果在这里发生GC,objA和objB是否被回收
        }
    }

    运行结果如下图:

    这里写图片描述

    可以看出:代码中的 testGC() 方法,对象 objA 和 objB 都有字段 instance ,赋值令objA.instance = objB; objB.instance = objA;

    除此之外,这两个对象再没有其他任何引用。在引用赋值为 null 后,这两个对象已经不可能再被访问,但因为互相引用对方,导致他们的计数器值都不为0.

    但是我们在GC日志中发现“7M->0M”,意味着虚拟机回收了他们。所以Java虚拟机并没有使用引用计数算法。这种算法的最大缺点是:很难解决对象之间相互循环引用的问题。

    那么在Java主流虚拟机中使用的是什么算法呢?答案是“可达性分析算法”!


    • 可达性分析算法

    如下图,本算法会设定一系列的成为“ GC Roots ”的对象作为起始点,从这些节点往下搜索,搜索走过的路径成为引用链。

    当一个对象到GC Roots没有任何引用链相连接(对象到GC Roots 不可达),证明此对象是不可用的。

    这里写图片描述

    在Java中,可以作为GC Roots的对象:
    1. 虚拟机栈(栈帧中的本地变量表)中引用的对象;
    2. 方法区中静态属性引用的对象;
    3. 方法区中常量引用的对象;
    4. 本地方法栈中JNI(Native方法)引用的对象。

    展开全文
  • 对赋值操作if判断

    2009-09-28 21:40:00
    教科书上都说什么左值,但左值具体是什么一直还没个确定的说法看看下面这段程序: int b=0;004113AE mov dword ptr [b],0 int a=0;004113B5 mov dword ptr [a],0 if(a=1)004113BC mov dwo
  • 下面代码运行结果:IE 下返回true,其他标准浏览器返回false。!-[1,],仅仅只有 6 bytes!   &lt;script type='text/javascript'&... 据远古流传下来的说法,这一牛叉方法来自遥远的俄罗斯。      ...
  • Weblogic 是64位还是32位的判断方法

    千次阅读 2011-11-18 07:54:36
    在网上找了NNN久,没找到个准确的说法,还是要靠自己 !#weblogic#64bit与32bit的主要区分经过我的分析终于找到了一个最快捷的方法,查看安装目录下$WLS_HOME/server/native/linux/下面是不是有一个名字为"x86_64"的...
  • 关于 vim,下面那些说法是错误? B A vim 在几乎所有 Linux 发行版本中都有预装 B vim 最精简版本是 vim 小型版 C vim 功能丰富,效率极高 D vim 是 vi 改进版本,完美向前兼容 vi 向下移动 10 行并定位到行...
  • pos刷卡联签购单真假判断(二)

    千次阅读 2021-01-15 18:29:24
    下面继续介绍签购单pos刷卡联真假判断剩下几项内容,我们以图片方式来介绍吧: 上次我们介绍了商户编码,终端号和操作员号,这次就介绍剩下几项重要参数,包括发卡行,收单行,有效期。 发卡行和收...
  • (1.3分)【单选题】下面不符合python语言命名规则是() (1.3分)【单选题】Python 中,以下哪个变量赋值是正确? (1.3分)【判断题】药物作用选择性是指药物对机体某一器官或组织产生明显作用,而对其他器官或...
  • python之判断对象是否为空 判断对象是否为None 要研究这个问题,首先我们要弄清楚,啥是None. ...我们用下面这两段代码,验证一下这些说法: In [68]: type(None) Out[68]: NoneType In [67]: None...
  • 下面证明我的说法。 alert(null);//false alert(!null);//true alert(!!null);//false 自然你要高兴的话,可以写!!!,或则是三个以上的感叹号。在我眼中这种写法就是哗众取宠,毫无意义。 转载于:...
  • 正常枕先露分娩时,多选说仰伸发生于()39、题下【单选题】人们常常用来判断一种活动是不是游戏一项外部指标是( )面关【多选题】S-S法阶段2训练内容包括于修【判断题】痉挛性睑内翻多发生于下睑。配置【判断题】...
  • 下面说法中错误是 AFileReader类是Reader类间接子类 BInputStreamReader类是Reader类子类 CBufferedReader类可以读取一行 DBufferedReaderreadLine()函数,如果没有数据时会返回0 (2)单选题 下列...
  • 下面来看看网上大多资料的说法 代码如下: 转别人的一些东西: jquery判断checkbox是否被选中 在html的checkbox里,选中的话会有属性checked=”checked”。 如果用一个checkbox被选中,alert这个checkbox的属性”...
  • 人 数 人 性别 看 书 踢球 看电视 画画 跳绳 玩电子游戏 男生 5 3 2 1 1 12 女生 12 0 4 1 3 2 活动 男女生最喜欢活动 合计 24 22 总计 观察统计表中三届奥运会情况判断下面说法是否正确 1中国获得金牌一届比一...
  • 这个郁闷了,今天写这个功能的时候发现了问题...下面来看看网上大多资料的说法 转别人的一些东西: jquery判断checkbox是否被选中 在 html 的 checkbox 里,选中的话会有属性 checked="checked"。 如果用一个...
  • 场景:当我成功添加一个收藏网址的时候,根据我预先定义好的类别,根据返回的prop值显示不同的图标,像下边这样 ...可是在HTML里哪有函数判断的说法 利用Vue操作DOM节点也不是什么很好的办法 我们不使用prop...
  • 以下内容都是引自网上其他的说法,下面的说法很容易误导人的,要获得主键,首先应该先把主键能插入,显然代码里面有显示插入主键的值,初步判断是利用了触发器,插入数据时,将事先建好的序列插入进去,关于如何利用...
  • 该方法是正确的关闭协程的方法,只要协程按照下面的说法写代码,当调用此函数时,协程立刻关闭;协程关闭后就不能再send数据了,否者会报出StoIteration这个错误。关闭协程除了不能send数据这个方法之外,还可以...
  • Jquery 获取checkbox的checked问题 这个郁闷了,今天写这个功能的时候发现了问题...下面来看看网上大多资料的说法 转别人的一些东西: jquery判断checkbox是否被选中 在html的checkbox里,选中的话会有属性checke
  • 前言:最近在学习消费信贷的业务场景,也是被各种专业术语弄的很懵,下面是来自...举例: “进件”是传统银行的说法,指申请单。评分卡是对一系列用户信息的综合判断。随着可以收集到的用户信息变多,授信决策者不再...
  • 这个郁闷了,今天写这个功能的...下面来看看网上大多资料的说法 转别人的一些东西: jquery判断checkbox是否被选中 在html的checkbox里,选中的话会有属性checked="checked"。 如果用一个checkbox...
  • 题一: 如果一个二叉树前序遍历结果是abcdefg,下面哪一个是可能中序遍历结果?...判断下列说法是否正确:已知完全二叉树第七层中有10个叶子结点,则整个二叉树中最多有73个结点。() 正确答案: B 你答案:

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 161
精华内容 64
关键字:

判断下面的说法