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中需要转义\,因此用"\\."。
网友评论