- 继承:继承是从已有类获得的类的信息建立新类的过程。提供继承信息的被成为父类(基类),获得继承信息的被称为子类
- 封装:一般认为封装是吧数据和操做数据的方法绑定起来,对数据的访问只能经过已定义的接口。
- 多态性:多态性是指容许不一样子类型的对象对同一消息作出不一样的响应。简单来收就是用一样的方法作出不一样的事情。
分为:方法重载(overload),方法重写(override)- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象(方法抽象),抽象只关注对象有哪些属性和行为,不关注行为的细节是什么。
- &运算符有两种用法:1.按位与 2.逻辑与
- &&运算符是短路与运算。逻辑与跟短路与的区别是很是巨大的,虽然两者都要运算符左右两端的布尔值为true 整个表的试的值才是true,可是:
&&之因此称为短路运算是由于,若是&&左边的表达式的值为false,右边的表达式会直接短路掉,不会运算。逻辑与或运算符和短路或运算符(||)的差异也是如此。
不对,若是这两个对象x和y知足x.equals(y)==true,他们的哈希码(hashCode)应当相同。html
String类是final类,不能够被继承。java
区别:重载是编译时的多态性,重写是运行时的多态性。重载发生在一个类中,同名的方法若是有不一样的参数列表,则视为被重载;重写发生在子类和父类之间,重写的子类要求和父类的方法返回值的类型一致。重载对返回值没有特殊要求。
方法重载的规则:数据库
- 方法名一致,参数列表中的参数顺序,类型,个数不一样。
- 重载与方法的返回值无关,存在于父类和子类,同类中
- 能够抛出不一样的异常,能够有不一样的修饰符。
方法重写的规则:编程
- 参数列表必须彻底与被重写的方法一致(父类的方法),返回值类型必须彻底与父类的返回值一致。
- 构造方法不能被重写,声明为final的方法不能被重写,声明为static的方法不能被重写,但能够被再次声明。
- 访问权限不能比父类重写的访问权限低。
- 重写的方法可以抛出任何非运行时异常(UncheckedException)。
char类型能够存储一个中文汉字,由于java中使用的编码是Unicode,一个char类型占2个字节(16比特),因此放一个汉字是没有问题的。api
抽象类:数组
- 抽象类能够定义构造器
- 能够有抽象方法和具体方法
- 接口的成员全都是public的
- 抽象类中能够定义成员变量
- 有抽象的方法的类必须声明为抽象类,而抽象类中未必要有抽象方法
- 抽象类中能够包含静态方法
- 一个类只能继承一个抽象类
接口:安全
- 接口不能定义构造器
- 方法所有都是抽象方法
- 抽象类中的成员能够是private,默认,protected,public
- 接口定义的成员变量实际上都是常量
- 接口中不能有静态方法
- 一个类能够实现多个接口
相同点:网络
- 不能被实例化
- 能够将抽象类和接口类型作为引用类型
- 一个类若是继承了某个抽象类或者某个接口都须要对其中的抽象方法所有实现,不然该类须要被声明为抽象类。
==和equals最大的区别就是 一个是方法(equals),一个是运算符;
==:若是比较的是数值,则比较两个数值是否相等;若是比较的是引用类型,则比较的是引用类型的变量指向的地址是否相等。
equals():用来比较方法两个对象的内容是否相等l数据结构
break和continue都是用来控制循环的语句。
break用于彻底结束一个循环,跳出循环体执行循环后面的语句
continue用于跳过本次循环,执行下次循环多线程
靠的是父类或接口定义的引用变量能够指向子类具体实现类的实例对象,而程序调用的方法运行期间才能动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法
共同点:Error和Exception的父类都是Throwable类;
不一样点:
- error类通常值与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足;对于这类错误致使的应用程序中的,仅靠程序自己没法恢复和预防,遇到这类错误,建议让程序终止。
- Exception 类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异常;编译能经过,可是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用 try{}catch(){} 捕获,要么用 throws 字句声明抛出,交给它的父类处理,不然编译不会经过。
- java.lang.NullPointerException 空指针异常;出现缘由:调用了未经初始化的对象或者是不存在的对象。
- java.lang.ClassNotFoundException 指定的类找不到;出现缘由:类的名称和路径加载错误;一般都是程序试图经过字符串来加载某个类时可能引起异常。
- java.lang.NumberFormatException 字符串转换为数字异常;出现缘由:字符型数据中包含非数字型字符。
- java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操做数组对象时发生。
- java.lang.IllegalArgumentException 方法传递参数错误。
- java.lang.ClassCastException 数据类型转换异常
- java.lang.NoClassDefFoundException 未找到类定义错误。
- SQLException SQL 异常,常见于操做数据库时的 SQL 语句错误。
- java.lang.InstantiationException 实例化异常。
- java.lang.NoSuchMethodException 方法不存在异常。
throw:
- throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
- throw 是具体向外抛出异常的动做,因此它抛出的是一个异常实例,执行 throw 必定是抛出了某种异常.
throws:
- throws 语句是用在方法声明后面,表示若是抛出异常,由该方法的调用者来进行异常的处理
- throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道须要捕获的异常的类型。
- throws 表示出现异常的一种可能性,并不必定会发生这种异常。
- final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
- finally:异常处理语句结构的一部分,表示老是执行。
- finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,能够覆盖此方法提供垃圾收集时的其余资源回收,例如关闭文件等
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。
四舍五入的原理是在参数上加 0.5 而后进行取整。
数组没有 length()方法,而是有 length 的属性。
String 有 length()方法。JavaScript中,得到字符串的长度是经过 length 属性获得的,这一点容易和 Java 混淆。
- String 是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的
- StringBuffer/StringBuilder 表示的字符串对象能够直接进行修改。
- StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法彻底相同,区别在于它是在单线程环境下使用的,由于它的全部方法都没有被synchronized 修饰,所以它的效率理论上也比 StringBuffer 要高。
整型:
byte:1个字节,范围(-128~127)
short:2个字节,范围(-32768~32767)
int:4个字节,范围(-2147483648~2147483647)
long:8个字节,范围(-2^63 ~ 2^63-1)浮点型:
float:4个字节,范围(-3.403E38~3.403E38)
double:8个字节,范围(-1.798E308~1.798E308)
字符型:
char:2个字节,范围(一个字符),如:a,b ,家,0
布尔型:
boolean:1个字节,只有两个值 true 与 false
String 是引用类型,底层用 char 数组实现的。
int 的包装类是Integer
为了编程的方便仍是引入了基本数据类型,为了可以将这些基本
数据类型当成对象操做,Java 为每个基本数据类型都引入了对应的包装类型
可变不可变:
- String:字符串常量,在修改时不会改变自身;若修改,等于从新生成新的字符串对象。
- StringBuffer:在修改时会改变对象自身,每次操做都是对 StringBuffer 对象自己进行修改,不是生成新的对象;使用场景:对字符串常常改变状况下,主要方法:append(),insert()等。
线程是否安全:
- String:对象定义后不可变,线程安全。
- StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操做字符串缓冲区大量数据。
- StringBuilder:是线程不安全的,适用于单线程下操做字符串缓冲区大量数据。
共同点:
- StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。
- StringBuilder、StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如 super.append(...)。只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,若是程序不是多线程的,那么使用StringBuilder 效率高于 StringBuffer。
按照流的方向:输入流(inputStream)和输出流(outputStream)。
按照实现功能分:节点流和处理流
按照处理数据的单位:字节流和字符流。
- 字节输入流转字符输入流经过 InputStreamReader 实现,该类的构造函数能够传入 InputStream 对象。
- 字节输出流转字符输出流经过 OutputStreamWriter 实现,该类的构造函数能够传入 OutputStream 对象。
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。能够对流化后的对象进行读写操做,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操做时所引起的问题。
序 列 化 的 实 现 : 将 需 要 被 序 列 化 的 类 实 现 Serializable 接 口 , 该 接 口 没 有 需 要 实 现 的 方 法 , implements Serializable
只是为了标注该对象是可被序列化的,而后使用一个输出流来构造 一个
ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream 对象的
writeObject(Object obj)方法就 能够将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流
原文连接:http://www.javashuo.com/article/p-pvmqdxkq-dx.html
ArrayList、HashSet、HashMap不是安全的;在集合中 Vector 和 HashTable 却是线程安全的。
Collections 工具类提供了相关的 API,可让上面那 3 个不安全的集合变为安全的。
Collections.synchronizedCollection(c )
Collections.synchronizedList(list)
Collections.synchronizedMap(m)
Collections.synchronizedSet(s)注:上面几个函数都有对应的返回值类型,传入什么类型返回什么类型。打开源码其实实现原理很是简单,就是将集合的核心方法添加上了 synchronized 关键字。
ArrayList 内部是用 Object[]实现的。
并发集合常见的有 ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque等。并发集合位 于 java.util.concurrent 包 下。
在 java 中有普通集合、同步(线程安全)的集合、并发集合。普通集合一般性能最高,可是不保证多线程的安全性和并发的可靠性。线程安全集合仅仅是给集合添加了 synchronized 同步锁,严重牺牲了性能,并且对并发的效率就更低了,并发集合则经过复杂的策略不只保证了多线程的安全又提升的并发时的效率。
ArrayList:底层结构是数组,底层查询快,增删慢。
LinkedList:底层结构是链表型的,增删快,查询慢。
voctor:底层结构是数组 线程安全的,增删慢,查询慢。
结构特色 :
- List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合;
- List 中存储的数据是有顺序,而且容许重复;Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是能够有重复的
- Set 中存储的数据是无序的,且不容许有重复,但元素在集合中的位置由元素的 hashcode 决定,位置是固定的
实现类:
- List 接口有三个实现类(LinkedList:基于链表实现,链表内存是散乱的,每个元素存储自己内存地址的同时还存储下一个元素的地址。链表增删快,查找慢;ArrayList:基于数组实现,非线程安全的,效率高,便于索引,但不便于插入删除;Vector:基于数组实现,线程安全的,效率低)。
- Map 接口有三个实现类(HashMap:基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null键;HashTable:线程安全,低效,不支持 null 值和 null 键;LinkedHashMap:是 HashMap 的一个子类,保存了记录的插入顺序;SortMap 接口:TreeMap,可以把它保存的记录根据键排序,默认是键值的升序排序)。
- Set 接口有两个实现类(HashSet:底层是由 HashMap 实现,不容许集合中有重复的值,使用该方式时须要重写 equals()和 hashCode()方法;LinkedHashSet:继承与 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMp)。
区别 :
- List 集合中对象按照索引位置排序,能够有重复对象,容许按照对象在集合中的索引位置检索对象,例如经过list.get(i)方法来获取集合中的元素;
- Map 中的每个元素包含一个键和一个值,成对出现,键对象不能够重复,值对象能够重复;
- Set 集合中的对象不按照特定的方式排序,而且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序
- HashMap 是线程不安全的,HashMap 是一个接口,是 Map的一个子接口,是将键映射到值得对象,不容许键值重复,容许空键和空值;因为非线程安全,HashMap 的效率要较 HashTable 的效率高一些.
- HashTable 是线程安全的一个集合,不容许 null 值做为一个 key 值或者 Value 值
- HashTable 是 sychronize,多个线程访问时不须要本身为它的方法实现同步,而 HashMap 在被多个线程访问的时候须要本身为它的方法实现同步
- 数组是将元素在内存中连续存储的;它的优势:由于数据是连续存储的,内存地址连续,因此在查找数据的时候效 率比较高;它的缺点:在存储以前,咱们须要申请一块连续的内存空间,而且在编译的时候就必须肯定好它的空间的大小。在运行的时候空间的大小是没法随着你的须要进行增长和减小而改变的,当数据两比较大的时候,有可能会出现越界的状况,数据比较小的时候,又有可能会浪费掉内存空间。在改变数据个数时,增长、插入、删除数据效率比较低
- 链表是动态申请内存空间,不须要像数组须要提早申请好内存的大小,链表只需在用的时候申请就能够,根据须要来动态申请或者删除内存空间,对于数据增长和删除以及插入比数组灵活。还有就是链表中数据在内存中能够在任意的位置,经过应用来关联数据(就是经过存在元素的指针来联系)
- 数组应用场景:数据比较少;常常作的运算是按序号访问数据元素;数组更容易实现,任何高级语言都支持;构建 的线性表较稳定。
- 链表应用场景:对线性表的长度或者规模难以估计;频繁作插入删除操做;构建动态性比较强的线性表。
- ArrayList 和 Vector 使用了数组的实现,能够认为 ArrayList 或者 Vector 封装了对内部数组的操做,好比向数组 中添加,删除,插入新的元素或者数据的扩展和重定向。
- LinkedList 使用了循环双向链表数据结构。与基于数组的 ArrayList 相比,这是两种大相径庭的实现技术,这也决定了它们将适用于彻底不一样的工做场景;LinkedList 链表由一系列表项链接而成。一个表项老是包含 3 个部分:元素内容,前驱表和后驱表
- HashMap 对象的 key、value 值都可为 null。
- HahTable 对象的 key、value 值均不可为 null。