文章目录
- 数据类型
- 运算符
- 字符串
- 重载和重写函数
- 代码块初始化顺序
- Scanner
- StringBuffer和String的区别?
- Random:产生随机数
- Hashtable和HashMap的区别?
- List,Set,Map等接口是否都继承了Map接口?
- Collection和Collections的区别?
- 异常 编译器期异常和运行期异常的区别?
- throw和throws区别
- finally关键字及其面试题
- outputStreamWriter close 和flush的区别?
- 逻辑题
- length
- 编程题: 用最有效率的方法算出2乘以8等於几?
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性吗?
- switch
- JDK中的5个类名,5个接口名,5个包名
- 多态是编译时行为还是运行时行为? 如何证明?
- 三元运算符注意点
- ++
- 包装类
数据类型
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
那句会编译失败呢?为什么呢?
b=3+4,3和4都是常量,所以在Java编译时期会检查该常量的和是否超出了Byte类型的范围。如果没有可以赋值。
b=b1+b2不可以,是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。(先开空间)
运算符
int a=4;
int b=(a++)+(++a)+(a*10);
System.out.println(a);
System.out.println(b);
输出 a=6,b=70
short c=1;
c+=1;
short c=1;
c=c+1;
上面的两个代码有没有问题,如果有,那些有问题?
c=c+1编译会有问题,c+=1等价于c=(c的数据类型)(c+1);
字符串
(1) 直接输出一个对象名称,其实默认调用了对象的toString()方法。
(2) ==和equals()的区别?
- == 基本类型:比较的是值是否相同
引用类型:比较的是地址值是否相同 - equals()
只能比较引用类型。默认情况下,比较的是地址值是否相同。
但是,我们可以根据自己的需要重写该方法,string类重写了这个方法,比较的是字符串的内容。 - 字符串的拼接
字符串如果是变量相加,先开空间,在拼接
字符串如果是常量相加,是先加,然后在常量池里面找。
public class test{
public static void main(String[] args) {
String s="hello";
s+="world";
// s=(new StringBuilder()).append(s).append("world").toString();
System.out.println("s:"+s);
//System.out.println(new StringBuilder().append("s:").append(s).toString());
}
}
上面的代码反编译后的结果
import java.io.PrintStream;
public class test
{
public test()
{
}
public static void main(String args[])
{
String s = "hello";
s = (new StringBuilder()).append(s).append("world").toString();
System.out.println((new StringBuilder()).append("s:").append(s).toString());
}
}
说明:字符串被赋值后就不能改变,为了节省空间可以使用stringBuffer替换string
重载和重写函数
Override和Overload的区别?Overload是否可以改变放回值类型? 构造方法可以被override吗?
Override:重写
Overload:重载
方法重写:
在子类中,出现和父类中一摸一样的方法声明的现象.
构造方法不可以被重写
方法重载:
在一个类中,出现的方法名相同,参数列表不同的现象.
this和super的区别 和各自的作用?
this:代表当前类的对象引用。
super:代表父类存储空间的表示。(可以理解为父类的引用,通过这个东西可以访问父类的成员)
场景:
成员变量:
this.成员变量
super.成员变量
构造方法:
this(…)
super(…)
成员方法:
this.成员方法
super.成员方法
代码块初始化顺序
class Fu{
static int i=1;
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu(){
System.out.println("构造方法Fu");
}
}
class Zi extends Fu{
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi(){
System.out.println("构造方法Zi");
}
}
public class test{
public static void main(String[] args) {
Zi z=new Zi();
}
}
输出结果
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
class X{
Y b=new Y();
X(){
System.out.println("X");
}
}
class Y{
Y(){
System.out.println("Y");
}
}
public class Z extends X{
Y y=new Y();
Z(){
System.out.println("Z");
}
public static void main(String[] args) {
new Z();
}
}
输出结果:
Y
X
Y
Z
Scanner
Scanner类有个问题:
先获取一个数值,然后再获取一个字符串,会出现问题
主要原因:就是那个换行符号的问题
如何解决的呢?
A:先获取一个数值后,在创建一个新的键盘录入对象获取字符串
B: 把所有的住居都先按照字符串获取,然后要什么,你就对应的转换成为什么。
StringBuffer和String的区别?
StringBuffer,StringBuilder和String的区别?
前者长度和内容可变,后者不可以改变。
如果使用前者做字符串的拼接,不会浪费太多资源。
StringBuffer:线程安全的可变字符串,同步的,数据安全,效率低。
(StringBuild?)
StringBuilder是不同步的,数据不安全的,效率高;
string 和stringbuffer互换
string s;
stringbufer sb=new stringbuffer(s);
or sb.apend(s); 通过构造方法,或者append()方法
stringbuffer转换成string通过构造方法或者tostring()方法 。
2 StringBuffer和数组的区别?
Random:产生随机数
构造方法:
public Random():没有给种子,用的是默认种子。是当前时间的毫秒值
publlic Random(long seed):给出指定种子
常见的数据结构的优缺点?
Hashtable和HashMap的区别?
HashMap:线程不安全,效率高。允许null键和null值
Hashtable:线程安全,效率低。不允许null键和null值
List,Set,Map等接口是否都继承了Map接口?
List,Set不是继承自Map接口,他们继承自Collection接口,Map接口本身就是一个顶层接口
Collection和Collections的区别?
Collection:是单列集合的顶层接口,有子接口List和Set
Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法
异常 编译器期异常和运行期异常的区别?
1: 编译器异常 必须要处理的,否则编译不通过
2: 运行期异常 可以不处理,可以处理
throw和throws区别
throw:
- 在方法体中,后面跟的是异常对象名,并且只能是一个
- 只能抛出一个异常对象名
- throw抛出一个异常对象,是一种可能,这个异常并不一定会产生
throws:
4. 在方法声明上,后面跟的是异常的类名,可以是多个
5. 表示抛出异常,由该方法的调用者来处理
3. throws是声明方法有异常,是一种可能性,这个异常并不一定会产生
finally关键字及其面试题
A:finally用于释放资源,它的代码永远会执行。特殊情况:在执行到finally之前jvm退出了
B:面试题
-
final,finally,finalize的区别?
final:最终的意思,可以修饰类,成员变量,成员方法
修饰类,类不能被继承
修饰变量,变量是常量
修饰方法,方法不能被重写
finally:是异常处理的一部分,用于释放资源。
一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了finalize:是Object类的一个方法,用于垃圾回收
-
如果在catch里面有return,请问finally还执行吗?如果执行,在return前还是后
会,前。
实际上在中间。
public class FinallyDemo2 {
public static void main(String[] args) {
System.out.println(getInt());
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a在程序执行到这一步的时候,这里不是return a而是return 30;这个返回路径就形成了。
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的返回路径,继续走return 30;
*/
} finally {
a = 40;
return a;//如果这样结果就是40了。
}
// return a;
}
}
outputStreamWriter close 和flush的区别?
close :先刷新缓冲区,然后关闭流对象。
flush:只刷新缓冲区
逻辑题
-
矿泉水1元钱1瓶,每2个空瓶换一瓶矿泉水,现有20元钱,请问可以买多少瓶矿泉水?
39 程序员
40 销售 – 管理岗位
逻辑思维能力是没有问题的:
20+10+5+2+1+1 和1个空瓶子
如何能达到40呢?
借一个。
如何借?交通能力。(交流沟通)
1个空瓶子先给商店,再借。 -
下面这个表达式,你移动一个数字或者符号就可以把这个表达式变成正确的
62-63=1
把6移动到2的次方位置。
2的10次幂以内的值要非常的敏感。 -
一栋房子需要一个工匠七天建成,这个工匠的工钱是一份金条,假如现在你需要盖一栋房子,而你只有一根完整的金条,怎么能把金条分三份的情况下每天都付给工匠工资,最后一天刚好付完?
- 1/7,2/7,4/7
length
数组有没有length()这个方法? String有没有length()这个方法?
数组没有。
String有
编程题: 用最有效率的方法算出2乘以8等於几?
2<<3
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性吗?
可以。
switch
switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
可以
不可以
JDK7以后可以
JDK中的5个类名,5个接口名,5个包名
5个常用类名
String
StringBuilder
Integer
集合类(ArrayList,LinkedList,HashSet,HashMap)
IO流(FileReader,FileWriter,FileInputStream,FIleOutputStream)
(BufferedXxx系列)
**5个接口名**
Colletion,List,Set,Map,Iterator,Comparable,Comparator
跟数据库相关:
Connection,Statement,PreparedStatement,CallableStatement,ResultSet
**5个包名**
Java.lang
java.util
java.io
java.net
java.sql
java.math
java.awt
多态是编译时行为还是运行时行为? 如何证明?
三元运算符注意点
public static void main(String [] args){
char x=‘x’;
int i=10;
System.out.println(true?x:i);
}
输出 120
如果其中有一个是变量,按照自动类型转换规则换成相同的类型;
++
int i=3;
i=i++;
sout(i);
输出3;
定义float f=3.4;是否正确?
答:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4
包装类
Object o1=true?new Integer(1):new Double(2.0);
System.out.println(o1);
//输出1.0
Object o2;
if(true)
o2=new Integer(1);
else
o2=new Double(2.0);
System.out.println(o2);
输出1
public void method1() {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j); false
Integer m = 1;
Integer n = 1;
System.out.println(m == n);// true
Integer x = 128;
Integer y = 128;
System.out.println(x == y);// false
}