美文网首页Java入门基础
java面试| 精选基础题(1)

java面试| 精选基础题(1)

作者: KenDoEverything | 来源:发表于2018-07-09 09:39 被阅读4次

    每天进步一点点,距离大腿又近一步!

    以下题目是从面试经历和常考面试题中选出有点儿意思的题目,参考答案如有错误,请联系小编指正,感谢!

    1.反射

    1.1定义a

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。

    1.2作用

    ①在运行时判断任意一个对象所属的类

    ②在运行时构造任意一个类的对象

    ③在运行时判断任意一个类所具有的成员变量和方法(通过setAccessible()方法可访问或修改private成员)

    ④在运行时调用任意一个对象的方法

    1.3用法

    首先得获取class字节码对象,再通过class对象可获取类中的各种属性和方法等

    3种获取class对象方法:

    1.通过Object类的getClass方法

    Classclazz = foo.getClass();

    2.通过对象实例方法获取对象

    Classclazz = foo.class;

    3.通过Class.forName方式

    Class clazz = Class.forName("xx.xx.foo");//完整的类名,包括所在包

    例子:

    publicclassUser{

    privateString name;

    privateintage;

    privatevoidspeak(String name){

    System.out.println("我的名字是:"+name);

    }

    publicUser(String name,intage)){

    this.name = name;

    this.age = age;

    }

    }

    User user =newUser("张三",25);

    // 获取User类中的所有方法

    Method[] methods = User.class.getDeclaredMethods();

    // 获取User类中的所有属性

    Field[] fields = User.class.getDeclaredFields();

    //遍历User类的所有属性

    for(inti =0; i < fields.length; i++) {

    fields[i].setAccessible(true);

    System.out.println(fields[i].getName()+":"+fields[i].get(user));

    }

    结果:

    name:张三

    age:25

    (反射基本上可以获取类中所有的信息,请自行谷歌)

    1.4优缺点

    优点:

    1.能够运行时动态获取类的实例,大大提高了系统的灵活性和扩展性;

    2.与java动态编译相结合,可以实现无比强大的功能。

    缺点:

    1.使用反射的性能较低;

    2.使用反射来说相对不安全;

    3.破坏了类的封装性,可以通过反射来获取这个类的属性和私有方法。

    2.String、StringBuilder和StringBuffer的区别

    存储

    String:字符串常量,对象一旦创建,不可更改

    StringBuilder和StringBuffer:字符串变量,对象可更改

    执行速度

    String

    线程安全

    String,StringBuilder是线程不安全的,StringBuffer是线程安全的。

    适用范围

    String:适用于少量的字符串操作

    StringBuilder:适用于单线程下,大量字符串操作

    StringBuffer:适用多线程下,大量字符串操作

    3.单例模式

    作用

    保证在Java程序中,某个类只有一个实例存在。

    spring中的单例模式

    spring生成对象默认是单例的,可将scope属性设置为prototype改为多实例

    适用场景

    1.需要频繁的进行创建和销毁的对象;

    2.创建对象时耗时过多或耗费资源过多,但又经常用到的对象;

    3.工具类对象;

    4.频繁访问数据库或文件的对象。

    4.Java 中 ++ 操作符是线程安全的吗?

    不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。

    5.== 与 equals 的区别

    ==

    1.比较基本数据类型(int,float,double…)时,比较的是它们的值是否相等

    2.比较引用类型(比如String类,自定义的User类等),比较的是引用所指向的对象是否相等,即对象内存地址是否相同

    equals

    equals方法是由Object类提供的,可以由子类来进行重写

    Object类默认的实现如下:

    publicbooleanequals(Object obj){

    return(this== obj);

    }

    默认的实现只有当对象和自身进行比较时才会返回true, 这个时候和 “==”是等价 

    的。

    Java中很多类(String类  Date类  File类)等都对equals方法进行了重写,这 

    里拿常见的String类

    publicbooleanequals(Object anObject){

    if(this== anObject) {

    returntrue;

    }

    if(anObject instanceof String) {

    String anotherString = (String)anObject;

    intn =value.length;

    if(n == anotherString.value.length) {

    charv1[] =value;

    charv2[] = anotherString.value;

    inti =0;

    while(n-- !=0) {

    if(v1[i] != v2[i])

    returnfalse;

    i++;

    }

    returntrue;

    }

    }

    returnfalse;

    }

    这里,从String的重写equals方法可以看出,比较的是String的所存放内容是否相等

    equals方法其实是交给开发者重写,在自定义类里,你想用它比较什么都可以,只要你重写它,所以我们并不能单纯的说它是用来比较什么的

    6.数组在内存中如何分配

    读前须知:

    栈:存放对象引用

    堆:存放所有new出来的对象和数组

    数组可以存放基本数据类型,可以存放引用类型。数组的引用存放于栈中,实际存放的对象在堆中。

    可看以下代码及分析:

    // 存放基本数据类型

    int[] arr =newint[3];

    arr[0] =1;

    arr[1] =2;

    arr[2] =3;

    // 存放自定义类型User

    User[] userArr =newUser[3];

    User user1 =newUser("张三");

    User user2 =newUser("李四");

    user[0] = user1;

    user[1] = user1;

    user[2] = user2;

    运行步骤分析:

    存放基本数据类型

    1.在栈中创建arr引用

    2.在堆中创建长度3的int数组,并将其初始化,赋默认值0

    3.将arr引用指向int数组

    4.对int数组中每一个int值重新赋值

    存放引用类型User

    1.在栈中创建userArr引用

    2.在堆中创建长度3的User数组,并将其初始化,赋默认值null

    3.将userArr引用指向User数组

    4.在栈中创建user1,user2引用

    5.在堆中创建User("张三"),User("李四")对象

    6.将user1,user2分别指向User("张三"),User("李四")

    7.分别对User数组中的每一个User进行重新赋值,此时user[0]指向User("张三"),user[2]指向User("张三"),user[2]指向User("李四")

    ps:这里所说的指向是引用变量指向对象,即引用变量保存了对象在堆内存中的存储地址

    可看下图,更好的理解:

    ps:数组所存放的基本数据类型可能存放于堆中,也可能存放于方法区的常量池中,此处仅以堆中的基本数据类型为例。

    后台回复"谷歌访问助手",获取插件访问谷歌,沉入信息的海洋


                                                                    end~thanks!

                                                一个立志成大腿而每天努力奋斗的年轻人

                                                                       期待你的到来!

    微信公众号

    相关文章

      网友评论

        本文标题:java面试| 精选基础题(1)

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