Java 常见知识点总结

1. equals 与hashcode

这两个方法都是Object 类的方法
public boolean equals(Object obj){
      return (this==obj)
}
public native int hashCode();

对象在不重写的情况下使用的是 object类的equals 与 hashcode,从Object 的源码可以看出,equals 默认情况下默认比较的是两个对象的引用,判断两个对象的应用是否指向的是同一个对象;而hashcode 也是根据对象地址生成一个整数值。

  • 当两个对象equals 为true 时,hashcode 一定相等;
  • 但是,当两个对象 hashcode 相等时,equals 不一定相等;

2. HashMap 原理

3. Math 常见函数

  /** 
 1. abs求绝对值 
   */  
    System.out.println(Math.abs(-10.4));    //10.4  
    System.out.println(Math.abs(10.1));     //10.1  
   /**
    *  ceil天花板的意思,向上取整
    */
     System.out.println(Math.ceil(-10.1));   //-10.0  
     System.out.println(Math.ceil(10.7));    //11.0  
     System.out.println(Math.ceil(-0.7));    //-0.0  
   
   // floor地板的意思,向下取整
   System.out.println(Math.floor(-10.1));  //-11.0  
   System.out.println(Math.floor(10.7));   //10.0  
   System.out.println(Math.floor(-0.7)); // -1
    // round 四舍五入,其实质 时 Math.float(x+0.5);
    //加 0.5 向下 取整
    System.out.println(Math.round(10.1));   //10  
    System.out.println(Math.round(10.7));   //11  
    System.out.println(Math.round(10.5)); //11 
    System.out.println(Math.round(-1.5)); // -1 
    //Math.rint()返回最接近该值的那个整数
    //注意如果存在两个这样的整数,则返回其中的偶数
    Math.rint(2.2) = 2.0;
	Math.rint(-2.2) = -2.0;
	Math.rint(2.7) = 3.0;
	Math.rint(-2.7) = -3.0;
	Math.rint(2.5) = 2.0;
	Math.rint(-2.5) = -2.0;
	Math.rint(3.5) = 4.0;
	Math.rint(-3.5) = -4.0

4. Integer 与 int

  1. 包装类型可用于泛型,而基本类型不可
 List<int> list= new ArrayList();// 提示编译错误;
 
 List<Integer> list= new ArrayList<>(); //正确

为什么呢?
因为泛型在编译时会进行类型擦除,最后只保留原始类型,而原始类型只能是Object 类及其子类。

  1. 基本类型比包装类型更高效
    基本类型在栈中存储的具体数值,而包装类型存储的是堆中引用

在这里插入图片描述
很显然,相对基本类型而言,包装类型需要占用更多的内存空间,假如没有基本类型的话,对于数值这种经常使用的数据来说,每次都要通过new 一个包装类型就显得非常笨重。
3. 两个包装类型的值可以相同,但却不相等
例如:

Integer i1= new Integer(10);
Integer i2= new Integer(10);
System.out.println(i1==i2); //false 
System.out.println(i1.equals(i2)); // true

Integer 对Object 类的equals 进行了重写,比较的是 值 是否相等;
而 == 比较的 两个对象的引用,很显然是不相等的;

  1. 自动装箱 、自动拆箱
Integer i1= new Integer(10); //手动装箱
int i2= i1.inValue();  // 手动拆箱

javaSE 5 之后为了减少开发人员的工作量,提供了自动装箱与 自动拆箱

Integer i1= 10//自动 装箱

int i2 = i1;// 自动拆箱

// 反编译之后,
Integer i1= Integer.valueOf(10); 
int i2= i1.intValue();

自动装箱是通过 Integer.valueOf()完成的;自动拆箱是 通过Integer.intValue() 完成的。

常见面试题

1) 基本类型与包装类型
int a= 100;
Integer b= 100;
System.out.println(a==b); //true
基本类型与包装类型==比较时,这时候b会自动拆箱,所以为true
2)两个包装类型
Integer c=100;
Integer d= 100;
System.out.println(c==d); // true;
自动装箱时,如果数字的范围在 -128 - 127 之间时,会使用缓存(IntegerCache)中的对象,而不是重新new 一个对象,所以返回true 
3)不在 -128 - 127 之间的数字
Integer e= 200;
Integer f= 200;
System.out.println(e==f); //false 
超过此范围,会重新new 对象,== 比较的是地址值,所以为false

5 Java 集合

在这里插入图片描述
Java 集合框架主要包括两种类型的集合 :
1).Collection 存储单个元素;
2) Map 存储键值对集合

  1. Collection 接口分为三个 子接口 :List 、 Set 、Queue

List : 存储的元素是有序的,允许存储重复元素
Set :存储的元素是无序的,不允许存储重复元素
Queue : 队列(实现先进后出)无实现类

  1. List 接口下常用的实现类:
    ArrayList : 底层是数组实现,性能方面是:查询快,增删慢;该集合是线程不安全的,多线程情况下,不要使用;
    LinkedList:该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。例如:
    List list=Collections.synchronizedList(newLinkedList(…));

  2. Set
    HashSet : 该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
    LinkedHashSet : 具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。
    TreeSet : 该类实现了Set接口,可以实现排序等功能。

  3. Vector 具体实现
    该类和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。

  4. Stack
    栈是Vector的一个子类,它实现了一个标准的后进先出的栈。

  5. Map
    HashMap :
    HashTable:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值