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