Java基本数据类型(8种)
- 整型:byte、short、int、long 对应字节(8 16 32 64)
- 浮点型:float、double 对应字节(32 64)
- Boolean型:boolean 对应字节(1)
- 字符型:char 对应字节(64)
string、stringBuffer、stringBuilder
- string
若连接后得到的字符串在静态存储区中早已存在,那么使用“+”优于stringBuilder
- string能被继承吗?
不能,因为string被final修饰,string为常量,定义后不能修改
- stringBuffer与stringBuilder的区别
stringBuffer(字符串常量)---线程安全
stringBuilder(字符串常量)---线程非安全
Array和ArrayList的区别
- Array可以容纳基本类型和对象,而ArrayList只能容纳对象
- Array是指定大小的,ArrayList是大小固定的
- Array没有提供ArrayList那么多功能
适用与Array的场景
- 如果列表的大小已经指定,大部分情况是存储和遍历它们
- 对于遍历基本数据类型,尽管Collection使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢
ArrayList和LinkedList的区别:(使用迭代进行遍历)
- ArrayList和LinkedList均实现了List接口
- ArrayList:实现了所有可选操作列表,包括null
- 特点:
查询快、增删慢(快:集合的特点,内存地址是连续的,只要知道一个,后面的都可以得到
慢:删除或增加后,该索引后的所有数据进行copy,所以较慢)
- LinkedList:链表数据结构
- 特点:查询慢,增删快(快:只是修改记录的前一个元素记录的内存地址发生改变
慢:挨个查询进行比较)
- LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储两个引用
类的实例化
- 类:指描述一种事物的定义,是一个抽象的概念,是一些事物具有相同的特性的集合
- 实例:该种事物的一个具体的个体,是具体的东西
- 例:”动物“是一个类,”猫“和”狗“就是实例
- 实例化的顺序
父类静态变量>父类静态代码块>子类静态变量>子类静态代码块>父类非静态变量(实例成员)>父类构造函数>子类非静态变量(子类实力成员变量)>子类构造函数
- 构造函数
是一种特殊的方法,主要用来创建对象时初始化对象,即为对象成员变量赋值
- 构造函数的重载
特别的类有多个构造函数,使用参数个数不同或或参数的类型进行区分
- 特点:函数名与类名完全相同,无返回值,无修饰符(包括void)不能被直接调用,须new
Map类(key--value型)
- HashMap
依赖于哈希表实现,存储位置根据键的哈希码计算的
- TreeMap
使用红黑树(二叉树),根据键的数据进行排序存储的(默认升序)
- 区别
HashMap是线程非安全的,TreeMap是线程安全的
抽象类和接口的区别
- 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象
- 抽象类要被子类继承,接口要被类实现
- 接口只能做方法申明,抽象类可以做方法申明,也可以做方法实现
- 接口是定义的变量,只能是公共的静态的常量,抽象类中的变量是普通变量
- 抽象类与抽象接口中的所有方法,必须被子类(实现类)全部实现,否则子类也为抽象类,接口
- 抽象方法只能申明,不能实现
- 抽象类中可以没有抽象方法
- 如果一个类中有抽象方法,那么这个类只能是抽象类
- 抽象方法要被实现,所以不能是静态的,也不能是私有的
- 接口可以继承接口,并可以多继承,但类只能单继承
equals与==的区别
==是判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同
Object有哪些公用方法
- 方法equals测试的是两个对象是否相等
- 方法clone进行对象拷贝
- 方法getClass返回和当前对象相关的class对象
- 方法notify、notifall、wait都是用来对给定对象进行线程同步的
Override与Overload的含义机区别
Overload顾名思义是重新加载
它可以表现类的多重性,在函数里面可以有相同的函数名但是参数名、返回值、类型不能相同、或者说可以改变参数、类型、返回值但是函数名不变
Overrider是重写
在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数,当子类在调用这一个函数时自动调用子类的方法,而父类相当于被覆盖了
多态
- 抽象的讲:多态就是同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息即为函数调用)
- 实现的原理是动态绑定,程序调用的方法在运行期才动态绑定,追朔源码可以发现,jvm通过参数的自动转型来找到公用的方法
面向对象是什么
面型对象是一种思想,世间万物都可以看作是一个对象,这里是讨论面向对象编程(oop),java是一个支持并发,基于类和面向对象的计算机编程语言
面向对象软件开发的优点
- 代码开发模块化
- 代码复用性强
- 增强代码的可靠性和灵活性
- 增加代码的可读性
面向对象的四大基本特性
- 抽象
提取现实世界中某事物的关键特性,为该事物构建模型的过程
- 封装
可以使类具有独立性和隔离性,保证类的高内聚,只暴露给外部或子类必须的属性和方法
- 继承
对现有类的一种复用机制
- 多态
多态是在继承的基础上实现的,三要素(1. 继承 2. 重写 3. 父类引用指向子类对象)父类引用指向不同的子类对象时,调用相同的方法,呈现出不同的行为,就是类的多态性,多态可分为编译时、运行时
抽象、封装、继承和多态是面向对象的基础
面向对象的七大设计原则
SOLID原则(单一原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则)
迪莱特原则
组合伏于继承原则(合成复用原则)
什么是值传递和引用传递
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响变量本身
引用传递是对于对象型变量而言的,传递的是该对象的一个引用,因此外部对象对引用对象所做的改变会反映到多有的对象上
一般认为Java内的传递都是值传递,Java实例对象的传递是引用传递
面向对象与面向过程的区别
- 面向对象
把构成问题事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述事物在整个解决问题的步骤中的行为
- 面向过程
分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
面向对象是以功能划分,面向过程是以步骤划分
Java的优点
- 简单
只提供基本方法,减少了编程的复杂性
- 高效
可以用面向对象的方法描述用户的每一个动作
- 面向对象
- 平台无关性
- 交互式特性
面向对象的网络编程语言,支持TCP/IP协议,使得交互式更为容易
- 多线程机制
Java能够并行处理多项任务
- 动态的内存管理机制
自动垃圾回收管理机制进行内存管理
- 安全性
- Java是解释型的(jvm)
Java创建对象的几种形式
- new 最常见的一种方法
- 调用对象的clone()方法
- 运用反射手段,调用Java.lang.class或者Java.lang.reflect.Constructor类的newInstance()实例方法
- 运用反序列化手段,调用Java.io.ObjectInputStream对象的readObject()方法
1和3都会明显的显示调用函数,2是在内存上对已有对象的影印,所以不会调用构造函数,4是从文件中还原类的对象也不会调用构造函数
是否可以从一个静态的(static)方法内部发出对非静态(non-static)方法的调用
不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,因此在调用静态方法时可能对象并没有初始化
静态变量和实例变量的区别
- 静态变量
被static修饰符修饰的变量,也称为类变量,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝
- 实例变量
必须依赖存于某一实例,需要先创建对象然后通过对象才能访问到它,静态变量可以实现让多个对象共享内存,在Java开发中,上下文类和工具中通常会有大量的静态成员
如何实现对象克隆
- 两种方式
- 实现cloneable接口并重写Object类中的clone()方法
- 实现Serializable接口通过对象的序列化和反序列化实现克隆,可以实现真正的clone
构造函数
构造函数用于初始化对象的状态,与方法类似,构造函数还包含在创建对象时执行的语句集合(即指令)
每次使用new关键字创建对象时,都会调用至少一个构造函数,用以将初始值分配给同一类的数据成员,(构造函数在对象或实例创建时被调用)
构造函数的编写规则
- 类的构造函数必须与它所在的类名具有相同的名称
- Java中的构造函数不能是抽象的(abstract)、最终的(final)、静态的(static)的同步的(synchronized)
- 访问修饰符可以用在构造函数申明中来控制它的访问即哪个其他类可以调用构造函数
Class.forName(String className)这个方法的作用
通过类的全名获得该类的类对象
AOP、OOP、IOC、DI
- AOP(面向切面编程)
将通用需求功能从不相关的类中分离出来,同时能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改行为即可
- OOP(面向对象编程)
是一种计算机编程架构
- IOC(控制反转)
控制指的是程序相关类之间的依赖关系,传统观念设计授内阁通常由调用者来创建被调用着的实例,在spring里,创建被调用者的工作不再由调用者来完成,而是由spring容器完成,依赖关系被反转了,成为控制反转,目的是为了获得更好的扩展性和良好的可维护性
- DI(依赖注入)
创建被调用者的工作由spring容器完成,然后注入调用者,因此也称依赖注入,控制反转和依赖注入是同一个概念
Java中final关键字有哪些用法
- 修饰类
表示该类不能被继承
- 修饰方法
表示方法不能被重写
- 修饰变量
表示变量只能一次赋值以后值不能被修改(常量)
什么时候用assert
assert(断言)常用的调试方式,保证程序最基本、关键的正确性,在软件发布后,assertion检查通常是关闭的
final,finally,finalize的区别
- final 修饰符(修饰类、修饰方法、修饰变量)
- finally
通常放在try……catch后,只要jvm不关闭都执行,内一般写释放外部资源的代码
- finalize
Object中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或执行其他清理工作