1. 怎么样才能比较两个对象是否相等? 2. 如果要实现两个对象的比较,至少要实现哪些方法?为什么?
1. 分几种情况: 对于基础整数类型对应的变量,比如Integer/Char/Long类型,直接用“==”来比较值,在一定范围内是行的通的。比如Char必须是不大于127字符,或者对应Integer和Long来说其值在-128~127之间,“==”都能正确地比较其值是否相等;对于其他范围则必须用equals来比较 对于一般对象的变量,“==”用来比较其指向的是不是同一个对象(内存地址一致),而如果重写了合适equals,则equals用来比较对象的数据意义上是否相等(尽管实际其有些字段可能不同)。 2. 要实现对象的比较,至少要实现hashCode和equals,可以按需实现clone。 equals用来做对象数据意义上相等的比较,hashCode用来做对象哈希意义上是否相等,也就是说用于hashTables等集合中等时候是否映射到同一个位置。一般来讲,equals相等的对象,hashCode也要相等;反之hashCode相等的话,equals最好相等,否则会令人困惑或带来操作上的麻烦。 clone则能复制出一个hashCode和equals都相同的对象,但实际是单独的一个地址空间(==判断则不相同)。
四面
一面:开发基础,感觉就是为了初步筛选而已,数据结构、事务隔离级别、技术平台、开发框架、项目细节、分布式事务、分布式锁、Java并发模型、JVM、缓存,问的广,偏理论。
二面:项目经验和对中间件实现的理解,dubbo的优化、线程问题排查、jvm优化、redis过期键处理、分布式事务实现,问的不多比较考验学的深度。
三面:业务理解和架构,技术平台的选择、架构设计的过程和考量、对业务的理解、个人发展定位、对技术点的预判,问题开放,主要看你个人的视野、架构能力、定位、大局观。
四面:hr,问职业经历、工作组成、工作评价和个人预期,我在写代码占比的问题上回答的过低,败笔,对公司考评方式和结果信息的收集也是欠缺的,另外对要去的业务部门的理解也越全面越好。
一个''.jaa''源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
Jaa有没有goto?
jaa中的保留字,现在没有在jaa中使用。
说说&和&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富
在JAA中如何跳出当前的多重嵌套循环?
在Jaa中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如,
ok:
for(int i=0;i > 10; i++){
for(int j=0;j<i; j++){
if(j == 5) break ok;
}
}
另外, 方法二, 使用中间变量
bool isCon = true;
for(int i=0;isCon && i > 10; i++){
for(int j=0;isCon && j<i; j++){
if(j == 5) isCon = false;
}
}
switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
可选参数类型:char, byte, short, Character, Byte, Short, Integer, String, or an enum
char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
用最有效率的方法算出2乘以8等於几?
因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2
JAVA8新特性?
--
Java对象的生命周期
Java对象生命周期包含创建阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等。
HashMap和HashTable存储原理
HashMap和HashTable是使用数组+链表结构实现,根据Hash和table长度计算数组的下标index做操作,hashMap默认数组长度为16,hashMap对null值的key都放在table[0]的位置,table[index]形成1个链表,当然在新版jdk中链表节点数>8会变成红黑树结构。hashMap达到最大数量会扩容,扩容table长度变为2倍,每个元素(table中)但重新计算index放到新的table中。
HTTP协议,GET和POST 的区别
---
匿名内部类中可以访问final类型的局部变量
- final String foo = "42";
- new Thread() {
- public void run() {
- dowhatever(foo);
- }
- }.start();
数组类型的对象调用clone方法可以复制一个数组
- int[] arr = {1, 2, 3};
- int[] arr2 = arr.clone();
通过反射可以访问私有成员
- public class Foo {
- private int bar;
- public Foo() {
- setBar(17);
- }
- private void setBar(int bar) {
- this.bar=bar;
- }
- public int getBar() {
- return bar;
- }
- public String toString() {
- return "Foo[bar="+bar+"]";
- }
- }
- import java.lang.reflect.*;
- public class AccessibleExample {
- public static void main(String[] args)
- throws NoSuchMethodException,IllegalAccessException, InvocationTargetException, NoSuchFieldException {
- Foo foo=new Foo();
- System.out.println(foo);
- Method method=Foo.class.getDeclaredMethod("setBar", int.class);
- method.setAccessible(true);
- method.invoke(foo, 42);
- System.out.println(foo);
- Field field=Foo.class.getDeclaredField("bar");
- field.setAccessible(true);
- field.set(foo, 23);
- System.out.println(foo);
- }
- }
打印结果:
- Foo[bar=17]
- Foo[bar=42]
- Foo[bar=23]
访问局部变量比访问成员变量快
- public class Slow {
- /** Loop counter; initialized to 0. */
- private long i;
- public static void main( String args[] ) {
- Slow slow = new Slow();
- slow.run();
- }
- private void run() {
- while( i++ < 10000000000L )
- ;
- }
- }
以上代码平均耗时
18.018s
优化后的代码:
- public class Fast {
- /** Loop counter; initialized to 0. */
- private long i;
- public static void main( String args[] ) {
- Fast fast = new Fast();
- fast.run();
- }
- private void run() {
- long i = getI();
- while( i++ < 10000000000L )
- ;
- setI( i );
- }
- private long setI( long i ) {
- this.i = i;
- }
- private long getI() {
- return this.i;
- }
- }
以上代码平均耗时
10.509s
匿名内部类可以直接调用子类中定义的方法
- (new Object() {
- public String someMethod(){
- return "some value";
- }
- }).someMethod();
- new Object() {
- void foo(String s) {
- System.out.println(s);
- }
- }.foo("Hello");
尽管创建的匿名内部类实例并没有实现一个独立的接口, 但是能直接调用不在父类Object中的方法