位置: 编程技术 - 正文
推荐整理分享JAVA 面向对象和集合知识点总结(6.15更新)(java面向对象和Java有区别吗),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:java面向对象的概念,java面向对象和面向过程的区别,java面向对象和c++面向对象,java面向对象和c++面向对象,java面向对象和c++面向对象,java面向对象和Java有区别吗,java面向对象和Java有区别吗,java面向对象和Java有区别吗,内容如对您有帮助,希望把文章链接给更多的朋友!
转载请注明出处: 在Android编程或者面试中经常会遇到JAVA 面向对象和集合的知识点。自己结合实际的编程以及阅读网上资料总结一下。
java面向对象==和equal()的区别基本数据类型。 byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。 复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在JVM中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为也是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。String的equal() (1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。 (2)若果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false。String、StringBuffer、StringBuilder的区别String 字符串常量(对象不可变,线程安全) private final char value[]; StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) char[] value; 如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。 在大部分情况下 StringBuilder > StringBuffer> String
final, finally, finalize的区别final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。Overload和Override的区别方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
java 继承extends关键字,子类扩展了父类,也具有父类的全部成员变量和方法,但是Java的子类不能获得父类的构造器。 Java没有C++中的多继承特征,每个类最多只有一个直接父类(单继承) 当调用子类构造器来初始化子类对象时,父类构造器总会在子类构造器之前执行。 创建任何Java对象,最先执行的总是java.lang.object类的构造器,从该类所在继承树最顶层类的构造器开始执行,然后依次向下执行。
Java多态如果Java引用变量的编译时类型和运行时类型不一致是,就可能出现多态。 运行时该引用变量的方法总是表现出子类方法的行为特征。(出现重写) Java中多态的实现方式:接口实现,继承父类进行方法重写(父类引用指向子类对象),同一个类中进行方法重载。
抽象类和接口的区别接口和抽象类的概念不一样。接口是对动作的抽象(吃),抽象类是对根源的抽象(人)。 一个类只能继承一个类(抽象类),但是可以实现多个接口(吃,行)。 1. 接口可以多继承,抽象类不行 2. 抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。 3. 接口中基本数据类型为public static 而抽类象不是,是普通变量类型。 4. 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。 5. 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
内部类作用放在一个类的内部的类我们就叫内部类。 作用 1. 内部类可以很好的实现隐藏,方便将存在一定逻辑关系的类组织在一起。 一般的非内部类,是不允许有private与protected权限的,但内部类可以。 2. 内部类拥有外围类的所有元素的访问权限。 3. 可是实现多重继承,每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整。 4. 可以避免修改接口而实现同一个类中两种同名方法的调用。 5. 方便编写线程代码。
java对象序列化概念 序列化:把Java对象转换为字节序列的过程。 反序列化:把字节序列恢复为Java对象的过程。 只有实现了Serializable和Externalizable接口的类的对象才能被序列化。 读取对象的顺序与写入时的顺序要一致。 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。用途 对象的序列化主要有两种用途: 1) 把对象转换成平台无关的二进制流永久地保存到硬盘上,通常存放在一个文件中; 2) 在网络上传送对象的字节序列。java集合HashSet类hashSet用Hash算法来存储集合中的元素,具有很好的存取和查找性能。 特点: 1. 无序 2. 不是同步的 3. 集合元素值可为null 4. 不允许包含相同的元素 存入一个元素: HashSet调用该对象的hashCode()方法得到hashCode值,根据该hashCode值确定该对象的存储位置。 访问一个元素: HashSet先计算该元素的hashCode值,然后直接到该hashCode值对应的位置去取出该元素。 如果元素相同则添加失败add()返回false。 HashSet集合判断两个元素相同的标准是两个对象equals()方法比较相等,并且hashCode值也相等。 如果两个对象的hashCode值相同,equals()返回false时,会在同一个位置用链式结构来保存。导致性能下降。
ArrayList和Vector有何异同点ArrayList和Vector在很多时候都很类似。 1. 两者都是基于索引的,内部由一个数组支持。 2. 两者维护插入的顺序,我们可以根据插入顺序来获取元素。 3. ArrayList和Vector的迭代器实现都是fail-fast的。 4. ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。 以下是ArrayList和Vector的不同点。 1. Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。 2. ArrayList比Vector快,它因为有同步,不会过载。 3. ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。
HashMap类和Hashtable类HashMap和Hashtable判断两个key相等的标准是两个key的equals()方法比较返回true,并且hashCode值也相等。 对同一个Key,只会有一个对应的value值存在。 如何算是同一个Key? 首先,两个key对象的hash值相同,其次,key对象的equals方法返回真 所以用做key的对象必须重写equals()和hashCode()方法,保证两个方法的判断标准一致——两个key的equals方法返回真,hashCode值也相同。
HashMap和Hashtable的区别HashMap允许key和value为null,而HashTable不允许。HashTable是同步的(线程安全),而HashMap不是(线程不安全)。所以HashMap适合单线程环境,HashTable适合多线程环境。HashMap比HashTable的性能高点。HashMap和Hashtable中key-value对无序。但在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。HashMap提供对key的Set进行iterator遍历,因此它是fail-fast的,但Hashtable提供对key的Enumeration进行遍历,它不支持fail-fast。(fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。)Hashtable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。HashTable中hash数组默认大小是,增加的方式是 old*2+1。HashMap中hash数组的默认大小是,而且一定是2的指数。hashCode()和equals()方法有何重要性hashCode是根类Obeject中的方法。 默认情况下,Object中的hashCode() 返回对象的位jvm内存地址。也就是说如果对象不重写该方法,则返回相应对象的为JVM内存地址。HashMap使用Key对象的hashCode()和equals()方法去决定key-value对的索引。当我们试着从HashMap中获取值的时候,这些方法也会被用到。如果这些方法没有被正确地实现,在这种情况下,两个不同Key也许会产生相同的hashCode()和equals()输出,HashMap将会认为它们是相同的,然后覆盖它们,而非把它们存储到不同的地方。同样的,所有不允许存储重复数据的集合类都使用hashCode()和equals()去查找重复,所以正确实现它们非常重要。equals()和hashCode()的实现应该遵循以下规则: 2.1 如果o1.equals(o2),那么o1.hashCode() == o2.hashCode()总是为true的。 2.2 如果o1.hashCode() == o2.hashCode(),并不意味着o1.equals(o2)会为true。在Java中,HashMap是如何工作的?HashMap在Map.Entry静态内部类实现中存储key-value对。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。Entry存储在LinkedList中,所以如果存在entry,它使用equals()方法来检查传递的key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个新的entry然后保存。当我们通过传递key调用get方法时,它再次使用hashCode()来找到数组中的索引,然后使用equals()方法找出正确的Entry,然后返回它的值。 其它关于HashMap比较重要的问题是容量、负荷系数和阀值调整。HashMap默认的初始容量是,负荷系数是0.。阀值是为负荷系数乘以容量,无论何时我们尝试添加一个entry,如果map的大小比阀值大的时候,HashMap会对map的内容进行重新哈希,且使用更大的容量。容量总是2的幂,所以如果你知道你需要存储大量的key-value对,比如缓存从数据库里面拉取的数据,使用正确的容量和负荷系数对HashMap进行初始化是个不错的做法。
HashMap源码剖析跟着兰亭风雨走就行了,很强大: 1. 类的继承性是指从已有的一个类来extends子类,子类具有了父类的所有特征,同时,子类也可以有新的特性。 2. 类的封装是指类把所有的操作都封闭起来,仅仅提供接口出来让其他人使用,使用的人没有必要懂得类里面的操作,只需要懂得操作接口就可以了。同时,封装也提高了程序的可替换性。 3. 类的多态性是一个对象的某项功能可以处理不同类型的问题,或者一个子类可以将父类的某个功能替换成新的功能,具体到编程的方面来说实现类的多态有override和overload,也就是覆写和重载。
修饰符staticstatic 可修饰属性、方法和代码块:
static修饰的属性为一个类的共享变量,属于整个类,在不实例化对象的情况下就能访问。static修饰方法表明此方法为类方法(静态方法),静态方法不需要有对象,可以使用类名调用,静态方法不能访问非静态成员,包括成员的变量和方法,因为此时是通过类调用的,没有对象的概念。this是不可用的。当static修饰代码块时(注:此代码块要在此类的任何一个方法之外),那么这个代码块在代码被装载进虚拟机生成对象的时候可被装载一次,以后再也不执行了,一般静态代码块被用来初始化静态成员。HashMap和TreeMap在性能上有什么样的差别呢?Java里的TreeMap用一个红黑树来保证key/value的排序。红黑树是平衡二叉树。保证二叉树的平衡性,使得插入,删除和查找都比较快,时间复杂度都是O(log n)。不过它没有HashMap快,HashMap的时间复杂度是O(1)。 但是TreeMap的优点在于它里面键值是排过序的,这样就提供了一些其他的很有用的功能。
Vector、ArrayList和LinkedList比较1.Vector是线程同步的,所以它也是线程安全的,而ArrayList和LinkedList是非线程安全的。如果不考虑到线程的安全因素,一般用ArrayList和LinkedList效率比较高。 2.ArrayList和Vector是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 3.如果集合中的元素的数目大于目前集合数组的长度时,Vector增长率为目前数组长度的%,而ArrayList增长率为目前数组长度的%.如果在集合中使用数据量比较大的数据,用vector有一定的优势;反之,用ArrayList有优势。 3.如果查找一个指定位置的数据,Vector和ArrayList使用的时间是相同的,花费时间为O(1),而LinkedList需要遍历查找,花费时间为O(i),效率不如前两者。 4.而如果移动、删除一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑使用LinkedList,因为它移动一个指定位置的数据所花费的时间为0(1)。 5.对于在指定位置插入数据,LinedList比较占优势,因为ArrayList要移动数据。
快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。 快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。
Enumeration接口和Iterator接口的区别有哪些?Enumeration速度是Iterator的2倍,同时占用更少的内存。Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。集合使用小总结涉及到堆栈,队列等操作,应该考虑用List;需要快速插入,删除元素,应该使用LinkedList;需要快速随机访问元素,应该使用ArrayList。程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高;非线程安全的数据结构能带来更好的性能。多个线程可能同时操作一个类,应该使用同步的类。对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。使用Map时,查找、更新、删除、新增最好使用HashMap或HashTable对Map进行自然顺序或自定义键顺序遍历时,最好使用TreeMap;推荐两个我看过的总结:个Java面试题和答案 Java基础知识总结
Android Studio常用快捷键 alt+insert生成构造方法和setgetalt+1打开和关闭导航目录alt+shift+up/down上下移动行ctrl+d复制一行ctrl+y删除行ctrl+q打开帮助文档ctrl+o/ioveride/implementctrl+shift+space
[TMOOC]PhoneGap开发环境搭建 视频地址:
Android界面开发 从Android界面开发谈起分类:android--:人阅读评论()收藏举报androidlayoutdialogbutton设计模式menu这篇文章没有打算有一个很好的逻辑去介绍android
友情链接: 武汉网站建设