Java基础(一)

(一) java基础知识点

java中==和equals和hashCode的区别

答:对于Java基本类型,== 判断的是值,对于对象,==判断的是对象地址,一般情况下,equals和==一样,
因为对象的equals方法直接就是判断是否==,也是判断的对象引用地址。

 public boolean equals(Object obj) {
        return (this == obj);
    }

hashCode一般是用于散列存储结构,比如set。通过hash算法得到元素的存储地址,方便后续的查找。
通过hashCode算出来的物理地址,如果该地址为空,则将元素放到该处;
如果不为空,则看该元素和原有元素是否equals,如果是,则不存;否则,会在该屋里地址上新建一个单向链表,将这些hashCode相等但是不equals的对象存到链表中。

set防重复原理:
set的add方法,实际上是调用了map的put,利用的是map的key防重复原理。
HashSet内部维护了一个map:private transient HashMap<E,Object> map;,add时实际调用的是map的push方法;

//HashSet.java
// Dummy value to associate with an Object in the backing Map
 private static final Object PRESENT = new Object();
 public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

map的key防重原理:

在HashTable计算某个对象在table[]数组中的索引位置,其代码如下:
int index = (hash & 0x7FFFFFFF) % tab.length;
为什么要&0x7FFFFFFF?因为某些对象的hashCode可能会为负值,与0x7FFFFFFF进行与运算可以确保index为一个正数。通过这步我可以直接定位某个对象的位置,所以从理论上来说我们是完全可以利用hashCode直接定位对象的散列表中的位置,但是为什么会存在一个key-value的键值对,利用key的hashCode来存入数据而不是直接存放value呢?这就关系HashTable性能问题的最重要的问题:Hash冲突!
我们知道冲突的产生是由于不同的对象产生了相同的散列码,假如我们设计对象的散列码可以确保99.999999999%的不重复,但是有一种绝对且几乎不可能遇到的冲突你是绝对避免不了的。我们知道hashcode返回的是int,它的值只可能在int范围内。如果我们存放的数据超过了int的范围呢?这样就必定会产生两个相同的index,这时在index位置处会存储两个对象,我们就可以利用key本身来进行判断。所以具有相索引的对象,在该index位置处存在多个对象,我们必须依靠key的hashCode和key本身来进行区分。

 >> 带符号右移。正数右移高位补0,负数右移高位补1。
 >>> 无符号右移。无论是正数还是负数,高位通通补0
 ^ 按位异或,不同为1,相同为0
 & 按位与,都为1时为1,否则为0

HashCode的作用原理和实例解析 http://blog.csdn.net/baidu_31657889/article/details/52298367
Java提高篇之hashCode http://www.importnew.com/20381.html

int、char、long各占多少字节数
byte1个字节8位,charshort2个字节16位
intfloat4个字节32位,longdouble都是8个字节64位

int与integer的区别

int 和Integer的区别 https://www.cnblogs.com/guodongdidi/p/6953217.html

Integerint的包装类,继成自Number类,里面存储的对象的地址,必须实例化才能使用,默认值是null
int是基本数据类型,存储的是数值本身,无需实例化,默认值为0
PS: java中6种数字类型: byte、short、int 、long、float、double,还有2种boolean和char不是
在进行比较时:

 public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

equals比较的是值,用==比较时

Integer a = new Integer(100);
Integer b = new Integer(100);
Integer c = 100 ;
a!=b ;//同Integer类型比较时,比较的是地址,所以不等
a == c ;//Integer和int比较时,回拆解取出里面的value比较,所以会相等

探探对java多态的理解

Java多态 https://www.cnblogs.com/zeze/p/6394231.html 多态的三个必要条件:

1、继承 (每个子类都可以有多种不同的表现)
2、重写 (override)
3、父类引用指向子类对象,比如: Person p = new Children()

多态有5个好处: 1、可替换性;2、可扩充性;3、接口性;4、简化性;5、灵活性 多态实现的方式:1、实现接口;2、继承父类,重写父类方法;3、当前类中重载

String、StringBuffer、StringBuilder区别
String 是常量,无法修改,每次进行操作都会重新创建实例(创建新对象、回收旧对象,都会耗时)。 而StringBuffer则是每次在同一对象上更改,不需创建,所以一般情况下会比String快。 StringBuilder是StringBuffer的一个简单替换类,但是不保证线程安全,因为StringBuffer的多数方法都有synchronized,可以保证线程安全,但是单线程环境下,StringBuider一般比StringBuffer快。

什么是内部类?内部类的作用
内部类简单来说就是定义在类里面的类,他能间接实现C++里有的多重继承,A类通过内部类B、C、D等调用他们继承来的方法,可以使A实现多继承的效果。 此外,内部类拥有外部类所有成员的访问权限,更能解决继承类和接口中有同名方法时的尴尬。
抽象类和接口区别
相同点:
1、都不能被实例化,只能由子类继承或实现;
2、都可以包含抽象方法,子类或实现类必须实现所有抽象方法。
抽象类感觉上是拥有了接口特性的类,他既可以有类的属性: 构造方法、普通成员方法和成员变量,也可以定义子类必须实现的抽象方法,这个跟接口一样,实现接口就必须实现接口中的方法。 但是类是单继承的,抽象类也是一样,但是接口可以被组合实现。 区别:抽象类里可以包含普通方法,接口里不能
抽象类的意义
抽象是对某一类具体事物上提取出的抽象共性,他不能被实例化为对象,只能由子类继承来具体实现,既限制更改共性,又可以允许子类做不同的实现和扩充。 抽象有利于代码和程序的维护。
抽象类与接口的应用场景

抽象类是否可以没有方法和属性?
可以没有,但是如果有抽象方法,这个类一定要声明为抽象类
接口的意义
接口是一个协议或规范,接口和实现分离,可以有效提升团队工作效率,接口
泛型中extends和super的区别

父类的静态方法能否被子类重写

进程和线程的区别

final,finally,finalize的区别
用于修饰类、变量和成员方法。final修饰的类(比如String)不能被继承,修饰的方法(如View里的measure)也不能被子类重写,修饰的变量的值不能被修改,只能初始化赋值 finally 一般和try catch搭配,不管有没有异常,都能保证finally里面的代码块被执行。一般我们用作关闭IO流,释放链接,回收资源等。 finalize 是object里的方法,子类可以重写finalize()方法实现对资源的回收。垃圾回收只负责回收内存,并不负责资源的回收,资源回收要由程序员完成,Java虚拟机在垃圾回收之前会先调用垃圾对象的finalize方法用于使对象释放资源(如关闭连接、关闭文件),之后才进行垃圾回收,这个方法一般不会显示的调用,在垃圾回收时垃圾回收器会主动调用。
序列化的方式
序列化是将对象的状态信息转化为可以存储或传输的形式的过程。在序列化期间,对象会将当前状态写入存储区,然后可以通过反序列化来还原对象。 Android中实现对象序列化有2中方式:1、实现Serializable,用来标识这个对象是可以序列化的,jre对象在传输时会进行相应的封装。2、实现Parcel able接口,这种效率比Serializable高,可以用于IPC。
Serializable 和Parcelable 的区别
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。 2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。 3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable。 4)Serializable的实现,只需要implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。 5)Parcelabel的实现,不仅需要implements Parcelabel,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口。 6) Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
静态属性和方法,可以被继承,但是不能被重写,静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为”隐藏”。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在”隐藏”的这种情况。 “重写”后子类的优先级要高于父类的优先级,但是“隐藏”是没有这个优先级之分的。 非静态类才能实现多态。
静态内部类的设计意图
降低包的深度,方便类的使用,静态内部类适用于包含类当中,但又不依赖与外在的类,不用使用外在类的非静态属性和方法,只是为了方便管理类结构而定义。在创建静态内部类的时候,不需要外部类对象的引用。

http://blog.csdn.net/vange/article/details/5407625

非静态内部类里不能使用静态成员变量 静态内部类的实例化不需要外部类实例化,但是无法使用外部类的非静态方法和成员

Out.In in = new Out.In(); //静态内部类 
Out.Inner inner = new Out().new Inner();//非静态内部类  

成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用

https://www.cnblogs.com/latter/p/5665015.html

谈谈对kotlin的理解
kotlin是基于JVM的编程语言,借鉴Scala,但是比Scala简单,由于是基于JVM的语言,所以100%兼容Java。
相比Java,语法更简洁,并且更安全。具体如下:

1、空指针安全
2、支持方法扩展
3、Lambda语法
4、 函数式编程

闭包和局部内部类的区别

string 转换成 integer的方式及原理

String intString = "123" ; 
Integer integer = Integer.valueOf(intString ) ;

但是Integer.valueOf()方法实际调用的是parseInt:

public static Integer valueOf(String s) throws NumberFormatException 
{ 
    return Integer.valueOf(parseInt(s, 10));//10代表10进制数 
}

取第一位,如果拿到的字符<'0'那么说明有符号,然后判断是正数或是复数,然后确定极值(正数则极值为最大值,-Integer.MAX_VALUE=-0x7fffffff ,负数则极值为最小值,Integer.MIN_VALUE = 0x80000000), > Character.MIN_RADIX=2和Character.MAX_RADIX=36 则,parseInt(String s, int > radix)参数中 radix的范围是在2~36之间,超出范围会抛异常。其中s的长度也不能超出7,否则也会抛异常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值