美文网首页
java SE问题总结(持续更新。。。)

java SE问题总结(持续更新。。。)

作者: jimi_jin | 来源:发表于2016-10-14 15:46 被阅读0次

    q:安装的jdk为什么没有javac.exe文件?

    a:JDK和JRE一定不能安装在同一文件夹中,(jdk自带的那个jre除外)否则运行的时候会找不到javac命令。 原因:JRE晚于JDK安装,而JRE只是提供Java运行环境,不需要javac编译命令的。 JRE安装前你会发现它会自动删除一些无关文件,如果同JDK安装在同一目录下,原本JDK中完好的javac命令就会被删除!! 解决方案:重新安装一次JDK 你会发现系统会安装两次文件 第一次的是jdk 第二次的是jre 只要保证你两次安装的目录不是同一个就OK。
    另外切记jdk和jre分别装在不同盘符,这样也会导致意想不到的惊喜!


    q:java环境变量全删除了怎么java.exe还是能在cmd下执行呢?

    a:当在控制台执行java.exe,操作系统寻找JRE的方式如下:

    • 先找当前目录下有没有JRE
    • 再找父目录下有没有JRE
    • 接着在PATH路径中找JRE
    • 注册表 KEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看 CurrentVersion的键值指向哪个JRE
      最常用的是在PATH路径中找JRE,一般情况下,自己的程序运行之前都会先在批处理文件里面临时设置PATH,把自己用的JRE放到PATH路径最前面,所以肯定会运行自己带的JRE,不会造成版本混乱。
      也就是说删除了环境变量,javac.exe是无法编译的,但是java.exe运行的是jre下的java.exe.

    q:编译出现乱码怎么破?

    a:1.notepad++-->格式-->然后选择编码-->ANSI


    q:int a =10;long b = 20L; int c =a+b;为什么错了?

    a:无法自动转换到小的数据类型中,有可能会丢失精度。比如long-->int,int-->byte;
    而从小数据类型向大的数据类型转,可以自由转换:

    q:如下代码执行结果是什么原因

    String s1 = "abc";
    String s2 = "abc";
    String s3 = "abcabc";
    System.out.println(s1==s2); //true
    System.out.println(s3==s1+s2); //false
    System.out.println(s3=="abc"+"abc"); //true
    

    分析: "abc" 存在字符串常量池中,并且只存在一份,所以s1、 s2指向同一片栈空间中的字符串常量池中的空间,因此第一行true;并且"abc"+"abc"会被编译器自动优化成"abcabc",生成的字符串同样存放在字符串常量池中,并且我们知道常量池中只存在一份,因此第三行true。那为什么第二行是false呢,s1、s2是两个对象相加,而并非字符串,因此结果无法在编译期确定,因此不放在字符串常量池中,因此地址不相同。

    q: 静态变量,静态代码快,属性,构造方法,静态方法,普通方法的执行顺序是什么?

    首先要分开看,我们在使用不同方式初始化类的时候JVM分别做了不同的工作,我们仅以调用静态方法和new 类的对象两方面说起:
    1> 调用类的静态方法,比如StringUtil.isEmpty();首先加载静态变量或者执行静态代码块,并且这项工作只做一次,二者谁写在前面,先执行谁。然后我们调用了isEmpty静态方法,才会加载并执行该方法。因此此类执行的顺序为: 静态变量/或者静态代码快 --- 静态方法
    2>使用new 初始化对象,首先还是加载静态变量或者执行静态代码块,如果此项工作已经做过,将不再执行。其次是加载类的属性,其次构造方法,最后直到调用该对象的某个普通方法才会去加载该方法。因此执行顺序为:
    静态变量/或者静态代码快 --- 属性---构造方法---普通方法。

    • 构造方法和普通方法中不能调用静态变量,静态方法可以。静态的东西是类拥有的所有方法共享,只有一份,在静态方法里调用普通方法或者属性,必须new出来对象才能用。(个人理解,万望指正)

    q:使用Iterator的next(),sacnner.next()遇到的DT问题解释:

    a:大家看如下代码有没有问题:

          String name = "tom";
          List<String> list = new ArrayList<>();
          list.add("tom");
          Iterator<String> listIt = list.iterator();
          if (listIt.hasNext()) {
              if (listIt.next().equals(name)) {
                  System.out.println(listIt.next());
              }
          }
    

    相信大家能够看出来问题所在,没错,会爆NoSuchElementException:



    原因就是我们在list里加入一个元素,在遍历的时候调用了两次listIt的next()方法,这就导致了,判断的时候调用获取了"tom",进入if判断之后,打印又调用一次,第二次调用的时候会去找迭代器的下一个元素,所以报错。每调用一次,就会获得当前值的下一个值。正确做法是:

          if (listIt.hasNext()) {
                          String itName = listIt.next();
              if (itName.equals(name)) {
                  System.out.println(itName );
              }
          }
    

    类似的还有Scanner.next()方法,同理,不再赘述。

    q:转义的时候\n \t \r 都是单斜杠就可以了,为什么用.的时候要\\. 双斜杠呢?

    a:注意用.的时候是在正则表达式中使用的,在正则表达式中 .可以标识任意字符,想仅仅匹配.就必须转义
    (例如邮箱正则表达式)。我们都知道转义需要\,但是在java中,.并不是特殊字符,可以直接用".",不需
    要转义,而你直接转义"/."会报错,在java中需要转义\,因此用"\\."。

    相关文章

      网友评论

          本文标题:java SE问题总结(持续更新。。。)

          本文链接:https://www.haomeiwen.com/subject/dlqvyttx.html