Object 类的常见方法有哪些?Object 类是一个特殊的类,是所有类的父类。它主要提供了以下 11 个方法:
123456789101112131415161718192021222324252627282930313233343536373839404142434445/** * native 方法,用于返回当前运行时对象的 Class 对象,使用了 final 关键字修饰,故不允许子类重写。 */public final native Class<?> getClass()/** * native 方法,用于返回对象的哈希码,主要使用在哈希表中,比如 JDK 中的HashMap。 */public native int hashCode()/** * 用于比较 2 个对象的内存地址是否相等,String 类对该方法进行了重写以用于比较字符串的值是否相等。 */public boolean equals(Object obj)/** * native 方法,用于创建并返回当前对象的一份拷贝。 */protected native Object clone() thr ...
== 和 equals() 的区别== 对于基本类型和引用类型的作用效果是不同的:
对于基本数据类型来说,== 比较的是值。
对于引用数据类型来说,== 比较的是对象的内存地址。
因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
equals() 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,因此所有的类都有equals()方法。
Object 类 equals() 方法:
1234public boolean equals(Object obj) { return (this == obj);}
equals() 方法存在两种使用情况:
类没有重写 equals()方法:通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 Object类equ ...
Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。使用泛型参数,可以增强代码的可读性以及稳定性。
编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。比如 ArrayList<Person> persons = new ArrayList<Person>() 这行代码就指明了该 ArrayList 对象只能传入 Person 对象,如果传入其他类型的对象就会报错
1ArrayList<E> extends AbstractList<E>
并且,原生 List 返回类型是 Object ,需要手动转换类型才能使用,使用泛型后编译器自动转换。
Java 集合概览Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Collection 接口,下面又有三个主要的子接口:List、Set 和 Queue。
Java 集合框架如下图所示:
Java 集合框架概览
注:图中只列举了主要的继承派生关系,并没有列举所有关系。比方省略了AbstractList, NavigableSet等抽象类以及其他的一些辅助类,如想深入了解,可自行查看源码。
说说 List, Set, Queue, Map 四者的区别?List(对付顺序的好帮手): 存储的元素是有序的、可重复的。
Set(注重独一无二的性质): 存储的元素不可重复的。
Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
Map(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),”x” 代表 key,”y” 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。
集合框架底层数据结构总结先来看一下 Collection 接口下面的集合。
ListArrayList:Object[] 数组Vector:Object[] 数组LinkedList:双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
SetHashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素LinkedHashSet: LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)
QueuePriorityQueue: Object[] 数组来实现二叉堆ArrayQueue: Object[] 数组 + 双指针
再来看看 Map 接口下面的集合。
MapHashMap:JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法 ...
HashMap 和 Hashtable 的区别线程是否安全:HashMap 是非线程安全的,Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
效率: 因为线程安全的问题,HashMap 要比 Hashtable 效率高一点。另外,Hashtable 基本被淘汰,不要在代码中使用它;
对 Null key 和 Null value 的支持: HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个;Hashtable 不允许有 null 键和 null 值,否则会抛出 NullPointerException。
初始容量大小和每次扩充容量大小的不同: ① 创建时如果不指定容量初始值,Hashtable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。② 创建时如果给定了容量初始值,那么 H ...
ArrayList 源码分析ArrayList 简介ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。
ArrayList 继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。
1234public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ }
List : 表明它是一个列表,支持添加、删除、查找等操作,并且可以通过下标进行访问。
RandomAccess :这是一个标志接口,表明实现这个接口的 List 集合是支持 快速随机访问 的。在 Arra ...
ArrayList 中可以存储任何类型的对象,包括 null 值。不过,不建议向ArrayList 中添加 null 值, null 值无意义,会让代码难以维护比如忘记做判空处理就会导致空指针异常。
示例代码:
1234ArrayList<String> listOfStrings = new ArrayList<>();listOfStrings.add(null);listOfStrings.add("java");System.out.println(listOfStrings);
输出:
1[null, java]
北京(上)大家好,我是大白,以程序员的视角看北京系列终于和大家见面了。因为北京适合程序员工作的企业实在太多了,所以怎样给大家介绍北京适合程序员的工作机会一直让我十分头疼。如果写的太简单,我跟大家说北京有百度、腾讯、阿里、美团等等,大家一定觉得我是在废话,但把所有企业一次性全介绍了工作量太大,并且文章也看不出重点了。所以我最终决定,北京拆成三篇来讲,一篇介绍北京的国企央企研究所、一篇介绍北京的大型互联网公司和大型外企、一篇介绍北京的中小型互联网公司。
我发现在互联网公司工作的程序员都对国企央企以及研究所十分好奇,但是因为这些单位的信息比较封闭,所以大家对于这些企业的工作方式以及薪酬情况都都不清楚。为了能给北京系列开个好头,第一篇文章我就以我熟悉的北京的国企央企研究所来给大家介绍了。想提前声明一点,虽然我有很多同学和朋友在北京国企央企以及研究所,但是同一个公司,不同的部门或者不同的组差别都太大了。尤其是研究所,每个系列都有数量庞大的下属研究所,并且下属的研究所独立性都特别高,所以风格差别很大。我只能把我见到的情况给大家做一个介绍,具体去到哪个研究所哪个团队还得你们自己去详细打听。只能说我 ...