java面试|精选基础(1)
以下题目是从面试经历和常考面试题中选出有点儿意思的题目,参考答案如有错误,请联系小编指正,感谢!
1.反射
1.1定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。
1.2作用
①在运行时判断任意一个对象所属的类
②在运行时构造任意一个类的对象
③在运行时判断任意一个类所具有的成员变量和方法(通过setAccessible()方法可访问或修改private成员)
④在运行时调用任意一个对象的方法
1.3用法
首先得获取class字节码对象,再通过class对象可获取类中的各种属性和方法等
3种获取class对象方法:
1.通过Object类的getClass方法
Class clazz = foo.getClass();
2.通过对象实例方法获取对象
Class clazz = foo.class;
3.通过Class.forName方式
Class clazz = Class.forName("xx.xx.foo");//完整的类名,包括所在包
例子:
public class User {
private String name;
private int age;
private void speak(String name){
System.out.println("我的名字是:"+name);
}
public User(String name,int age)) {
this.name = name;
this.age = age;
}
}
User user = new User("张三",25);
// 获取User类中的所有方法
Method[] methods = User.class.getDeclaredMethods();
// 获取User类中的所有属性
Field[] fields = User.class.getDeclaredFields();
//遍历User类的所有属性
for (int i = 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<StringBuffer<StringBuilder;线程安全
StringBuilder是线程不安全的,StringBuffer是线程安全的。适用范围
String:适用于少量的字符串操作
StringBuilder:适用于单线程下,大量字符串操作
StringBuffer:适用多线程下,大量字符串操作
3.单例模式
作用
保证在Java程序中,某个类只有一个实例存在。spring中的单例模式
spring生成对象默认是单例的,可将scope属性设置为prototype改为多实例
<bean id="hi" class="com.test.Hi" init-method="init" scope="singleton">
适用场景
需要频繁的进行创建和销毁的对象;
创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
工具类对象;
频繁访问数据库或文件的对象。
4.Java 中 ++ 操作符是线程安全的吗?
不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
5.== 与 equals 的区别
==
1.比较基本数据类型(int,float,double…)时,比较的是它们的值是否相等
2.比较引用类型(比如String类,自定义的User类等),比较的是引用所指向的对象是否相等,即对象内存地址是否相同equals
equals方法是由Object类提供的,可以由子类来进行重写
Object类默认的实现如下:public boolean equals(Object obj) { return (this == obj); }
默认的实现只有当对象和自身进行比较时才会返回true, 这个时候和 “==”是等价
的。
Java中很多类(String类 Date类 File类)等都对equals方法进行了重写,这
里拿常见的String类public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
这里,从String的重写equals方法可以看出,比较的是String的所存放内容是否相等
equals方法其实是交给开发者重写,在自定义类里,你想用它比较什么都可以,只要你重写它,所以我们并不能单纯的说它是用来比较什么的
6.数组在内存中如何分配
读前须知:
栈:存放对象引用
堆:存放虽有new出来的对象和数组
数组可以存放基本数据类型,可以存放引用类型。数组的引用存放于栈中,实际存放的对象在堆中。
可看以下代码及分析:
// 存放基本数据类型
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
// 存放自定义类型User
User[] userArr =new User[3];
User user1 = new User("张三");
User user2 = new User("李四");
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)的更多相关文章
- java面试| 精选基础题(3)
每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 系列文章 java面试| 精选基础题(1) java面试|精选基础题(2) 1.float f=3.4;是否正确? 答:不正确,编译无法通过 ...
- java面试| 精选基础题(2)
关注微信公众号"java从心",置顶公众号 每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 继续挖掘一些有趣的基础面试题,有错望指出来哈,请赐教~ 1.包装类的装箱与拆 ...
- JAVA面试精选
JAVA面试精选[Java基础第一部分] 这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱.只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了.对 ...
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
- JAVA面试精选【Java基础第一部分】
这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱.只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了.对于那些正打算找工作JAVA软件开发工作的童 ...
- JAVA面试精选【Java基础第二部分】
上一篇,我们给出了大概35个题目,都是基础知识,有童鞋反映题目过时了,其实不然,这些是基础中的基础,但是也是必不可少的,面试题目中还是有一些基础题目的,我们本着先易后难的原则,逐渐给出不同级别的题目, ...
- JAVA面试精选【Java基础第三部分】
上一篇,我们给出了大概35个题目,都是基础知识,有童鞋反映题目过时了,其实不然,这些是基础中的基础,但是也是必不可少的,面试题目中还是有一些基础题目的,我们本着先易后难的原则,逐渐给出不同级别的题目, ...
- JAVA面试精选【Java web部分一】
Java的基础知识点就太多了,要说也不能穷尽,这个主要是靠自己在平时的积累和项目的开发经验,外边考的多的一般是继承,多态,线程,集合等等,但是笔试或者是面试中很有可能问许多集体的内容,比如hashMa ...
- Java面试专题-基础篇(1)
随机推荐
- 2019-8-31-How-to-fix-nuget-Unrecognized-license-type-MIT-when-pack
title author date CreateTime categories How to fix nuget Unrecognized license type MIT when pack lin ...
- ie6 ie7下,Li不能自动换行,出现竖排文字现象(PS:li不固定宽度,所有li同一行显示),在ie8却可以
好久没写CSS,今天又发现一个ie兼容问题. 我需要所有的li在同一行显示,不固定Li的宽度,如果一行排不下,需要自动换行.当然Li的内容长度不同. 必须在li加white-space:nowrap; ...
- HDU4609 FFT+组合计数
HDU4609 FFT+组合计数 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 找出n根木棍中取出三根木棍可以组成三角形的概率 题解: ...
- Struts2 类型转换(易百教程)
在HTTP请求中的一切都被视为一个String由协议.这包括数字,布尔值,整数,日期,小数和一切.每一件事情是一个字符串,将根据HTTP.然而,Struts类可以有任何数据类型的属性.Struts的自 ...
- Linux基础:认识Linux
1.Linux操作系统的特点 优点 (1)可靠性高:linux是基于Unix的概念开发出来的系统,拥有Unix的稳定且效率的特点.运行一年以上而不曾宕机.不必关机是很平常的事情 : (2)彻底 ...
- DEVOPS技术实践_06:sonar与Jenksin集成
代码质量管理平台 一.checkout和打包功能 1.1 gitlab在新建一个文件 后续在写入内容 1.2 Jenkins新建一个任务 两个参数 1.3 流水线配置 copy仓库地址: http:/ ...
- 从零开始のcocos2dx生活(一)内存管理
cocos中所有的对象都是继承自Ref基类,Ref的职责就是对对象进行引用计数管理 内存管理中最重要的是三个方法retain().release().autorelease() 在cocos中创建对象 ...
- 【题解】CF894E Ralph and Mushrooms (缩点)
[题解]CF894E Ralph and Mushrooms (缩点) 这是紫?给个解方程算法 考虑一条边若可以重复遍历说明一定有环,有环的话一定会把环上的蘑菇榨干,考虑一条边从全部到榨干的贡献是多少 ...
- 洛谷$P2153\ [SDOI2009]$ 晨跑 网络流
正解:网络流 解题报告: 传送门$QwQ$ 题目好长昂,,,大概概括下$QwQ$.就说有$n$个节点$m$条边,然后要求每次走的路径都不一样,问最多能走多少次,然后在次数最多的前提下问路径最短是多少$ ...
- HDU3886 Final Kichiku “Lanlanshu” 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3886 题目大意: 给一定区间 \([A,B]\) ,一串由 /, \ , - 组成的符号串.求满足符号 ...