首页 > 代码库 > java基础面试
java基础面试
* 以下内容是我在准备java面试的时候觉得有用,面试官很可能会问的一些问题
* 内容(除了代码)详情来自网络(学习的时候遇到不会的百度的 (*^__^*) )
* 如果大家发现有什么地方不对,请告诉我。谢啦!!☆⌒(*^-゜)v
1:java的基础类型
Java语言提供了八种基本语言
boolean |
char |
byte |
8位 |
short |
|
|
16位 |
int |
float |
|
32位 |
long |
double |
|
64位 |
注意:String本身就是一个对象而不是基本数据类型,String的变量名是对String类的引用
2:String、StringBuffer、StringBuilder之间的区别
2.1:三者的执行速度: String<StringBuffer<StringBulider
2.2:String是字符串常量,也就是说值是不会改变的,StringBuffer和StringBuilder是字符串变量,是可以对值进行操作的。
public class StringTest {
public static void main(String argv[]){
String s = "abc";
s = s+"def";
System.out.println("s="+s);//s=abcdef
/*
* 我们明明就是改变了String型的变量s的,为什么说是没有改变呢?
* 其实这是一种欺骗,JVM是这样解析这段代码的:
* 首先创建对象s,赋予一个abc
* 然后再创建一个新的对象s用来执行第二行代码,
* 也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,
* 由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,
* 而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多低。
*/
}
}
2.3:StringBulider和StringBuffer的区别
StringBulider是线程非安全的,StringBuffer是线程安全的。JVM不能保证StringBuilder操作是安全的,虽然他速度快,但可以保证StringBuffer是可以确定操作的。但是因为大多数操作是在单线程环境下完成的,所以大多数情况下建议使用StringBuilder是因为速度问题。
2.4:对三者进行总结:如果操作少量的数据,使用String
单线程操作字符串缓冲区下大量的数据使用StringBulider
多线程操作字符串缓冲区下大量的数据使用StringBuffer
3:类型之间的转换
public class StringTest {
public static void main(String argv[]){
//String转化为int float double
String s = "123";
int i=Integer.parseInt(s);
float f = Float.parseFloat(s);
double d = Double.parseDouble(s);
System.out.println("i="+i+" f="+f+" d="+d);
System.out.println(Integer.valueOf(s));
//注意:虽然valueOf也可以将字符串转化为int等,但是valueOf调用的是parse的方法,返回的是已经封装的对象,如Integer等
//将int float double转化为String
String s1 = String.valueOf(i);
String s2 = String.valueOf(f);
String s3 = String.valueOf(d);
System.out.println("s1="+s1+" s2="+s2+" s3="+s3);
}
}
4:日期的用法
4.1:calendar和Date的区别
Date是类,Calendar是抽象类。在JDK1.0中,Date是唯一的代表时间的类,但因为Date不变实现国际化,所以JDK1.1版本开始,推荐使用Calendar类进行时间和日期的处理。
import java.util.Calendar;
import java.util.Date;
public class DateTest {
public static void main(String argv[]){
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
//Sun Jul 23 10:33:44 CST 2017(解释:星期天 7月 23号 10点33分44秒 2017年)
System.out.println(date);
//获取年月
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH)+1;//日期是0~11 所以要加1
System.out.println("year="+year+" month="+month);//year=2017 month=7
//获取日期
int day1 = calendar.get(Calendar.DAY_OF_YEAR);//本年的第204天
int day2 = calendar.get(Calendar.DAY_OF_MONTH);//这个月的第23天
int day3 = calendar.get(Calendar.DAY_OF_WEEK);//本周第一天(每周星期天开始)
int day4 = calendar.get(Calendar.DATE);
System.out.println("day1="+day1+" day2="+day2+" day3="+day3+" day4="+day4);//day1=204 day2=23 day3=1 day4=23
//获取时分秒
int hour1 = calendar.get(Calendar.HOUR_OF_DAY);
int hour2 = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
//hour1=10 hour2=10 minute=59 second=26 10点59分26秒
System.out.println("hour1="+hour1+" hour2="+hour2+" minute="+minute+" second="+second);
}
}
4.2:DateFormat和SimpleDateFormat的区别
DateFormat可以直接使用、但其本身是一个抽象类,可以根据Locate指定的区域得到不同的日期显示效果。SimpleDateFormat是DateFormat的子类,一般情况下DateFormat类很少直接使用,而都是由SimpleDateFormat类完成。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateTest {
public static void main(String argv[]){
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
DateFormat df1 = DateFormat.getDateInstance();
DateFormat df2 = DateFormat.getDateTimeInstance();
System.out.println(df1.format(date));//2017-7-23
System.out.println(df2.format(date));//2017-7-23 12:18:51
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日");
System.out.println(sdf.format(date));//2017年18月23日
}
}
5:集合List Set Map的区别
集合List有序,其中的元素可以重复
集合Set无序,其中元素不可以重复
集合Map是一种把键对象和值对象映射的集合,每个元素都包含一个键和一个值,键不允许重复,但是可以将任意多个键独享映射到一个值对象上。
6:文件
我对文件非常不熟悉,所以这块会单独列出来_(:зゝ∠)_
7:面向对象编程的特性
7.1:封装
封装即把对象的属性饥饿操作结合成为一个独立的整体,并尽可能的隐藏对象内部实现细节
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这是一个典型的封装案例,user类的属性id和name都是用private隐藏起来了的,只能通过get和set方法来对属性进行操作
7.2:抽象
使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。
public abstract class AbstractTest {
public abstract void get();
public String set(){
return "这是一个抽象类";
}
}
7.3:继承
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力
public class TestExtends {
public static void main(String argv[]){
B b = new B();
b.get();
//测试结果:正在执行子类…… 这是父类
}
}
class A{
public String toString(){
return "这是父类";
}
}
class B extends A{
public void get(){
System.out.print("正在执行子类…… "+toString());
}
}
7.4:多态
多态可以分成编译多态(主要体现在重载上面)和运行多态(主要体现在继承上面)
8:重载和重写的区别
重载是同一个类里面有相同名称不同参数列表的方法
重写是子类里面创建一个除了方法体其余的(方法名,参数列表,返回值)都和父类一样的方法,覆盖父类方法
需要注意的是一个重写的方法不能抛除没有在基类中定义的非运行时异常,但是它可以抛出没有在基类中定义的运行时异常
原因:1:就算有运行时异常也是可以通过编译的,而如果出现非运行时异常就必须进行处理(throws或者try{}catch{})
2:子类重写父类方法所抛出的一场不能超过父类的范畴
9:接口和抽象类的区别
9.1:抽象类里面的方法可以有具体实现,但接口里面所有的方法都是抽象方法。
9.2:抽象类可以有构造器,接口不能有构造器
9.3:抽象方法可以有public、protected和default这些修饰符,但是接口只能使用public修饰符
9.4:抽象方法可以继承一个类和实现多个接口,接口只可以继承一个或多个其它接口
未完待续……O(∩_∩)O~~
java基础面试