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

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中需要转义\,因此用"\\."。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、.java源文件: 一个以”.java“为后缀的源文件:只能有一个与文件名相同的类,可以包含其他类。 2、类方...
    Hughman阅读 5,439评论 1 9
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,597评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,954评论 18 399
  • Win7下如何打开DOS控制台? a:开始--所有程序--附件--命令提示符 b:开始--搜索程序和文件--cmd...
    逍遥叹6阅读 5,513评论 4 12
  • 就在刚才 太阳半露着脸 突然噼里啪啦 不期的你从天而降 荡去了暑天的烦闷 淋湿了行人 是夸你呢 还是贬你
    宋茉莉阅读 451评论 0 0