学习网址地址:Java String 类 | 菜鸟教程
基础语法
- 类名首字母大写
- 方法名首字母小写,多个单词后的每个单词首字母大写
- 大写字母表示常量
- 转化类型,由低级到高级:
byte,short,char—> int —> long—> float —> double
对象和类
- 对象是类的一个实例,有状态和行为,状态是静止的,比如颜色,名字,行为是动态的,比如摇尾巴;类是一个模版,描述对象的行为和状态
- 每个类都有构造方法,若没有显式定义,则编译器会提供一个默认构造方法
- 在创建对象时,至少要调用一个构造方法,其与类名同名。构造方法可有多个
- 访问类中的方法:对象.方法名();访问变量:对象.变量名;
- 一个源文件中只能有一个public类,可有多个非public类
运算符
- 算术运算符:+,-,*,/,%,++,--。++A与A++的区别,前者先自增再进行表达式运算;后者先表达式运算,再自增
- 关系运算符:==,!=,>,<,>=,<=
- 位运算符:&,|全0则为0,^相同位置相同为0,否则为1,~按位取反,<<按位左移运算符,>>按位右移运算符,>>>按位右移补0运算符
- 逻辑运算符:&&,||,!
- 短路逻辑运算符,短路后不会再执行第二个操作
- 赋值运算符:+=
- 条件运算符(三元运算符):?:
variable x = (expression) ? value if true : value if false
- instanceof运算符:检查该对象是否是一个特定类型(类类型或接口类型) name instanceof String
- 运算符优先级
循环结构
- while循环:while(条件执行语句)
- do while循环:循环语句至少执行一次,while表达式为真时继续执行
- for循环:for(初始化;布尔表达式;更新)
- 增强for循环:for(声明语句:表达式)
- break关键字:跳出整个语句块,跳出最里层循环,继续执行循环下面的语句
- continue关键字:让程序跳转到下一次循环
条件语句
- switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可选 //你可以有任意数量的case语句 default : //可选 //语句 }
字符串
- 字符串长度:string.length()
- 字符串连接:string1.concat(string2)
- 字符串包好某些字符:contains
- 字符串判空:isEmpty
- 转大写:toUpperCase
- 转小写:toLowerCase
- 替换字符串的某些值,replace,replaceAll
- 字符串分割,split
- 字符串子串:substring
- 字符串修改,需使用StringBuffer和StringBuilder类,String.insert(位置,内容)在某个位置添加某个内容,delete(起始位置,结束位置)删除起始-结束位置的内容
- StringBuffer:append追加,reverse反转,delete删除,insert插入,replace替换
- StringBuilder: indexOf 返回第一次出现的指定子字符串在该字符串中的索引; indexOf(String str, int fromIndex)从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引,lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引, length() 返回长度(字符数),subSequence(int start, int end)返回一个新的字符序列,该字符序列是此序列的子序列或者substring
数组
- 数组赋值:fill
- 数组排序:sort 升序
- 数组比较:equals
- 查找数组元素:binarysearch
异常
try执行代码catch异常类型finally执行的代码,finally无论有没有异常,都会执行
JAVA面向对象
继承
子类继承父类的特征和行为,但子类的方法更具体
class 父类{},class 子类 extends 父类{}
一个子类只有一个父类,但子类可以拥有多个接口,implements实现多接口继承
super关键字访问父类的成员,引用当前对象的父类
this关键字是指向自己的引用
final关键字代表为最终类,不被继承,或者用于修饰方法,不被子类重写
重写是方法名相同,返回值和形参都不改变;而重载(重要点是参数不同)是方法名相同,参数不同,返回类型可相同也可不同
多态是同一个行为具有多个不同表现形式或形态的能力,换句话说也就是同一个接口,不同的实例执行不同的操作
重要基础梳理
-
多态的三个必要条件:继承、重写、父类引用指向子类的对象
-
重载和重写:重载--一个类中,方法名相同,参数不同的方法;重写--子类重写父类的方法,型参必须相同,返回值可以不同,但是必须是父类返回值的派生类
- 类的类型变量:局部变量--方法、构造方法或语句块中定义的变量,声明和初始化都在块中,方法结束后,变量自动销毁,栈分配内存空间;成员(实例)变量--成员变量定义在类中,方法体之外的变量,创建对象的时候实例化,被类中的方法访问;类(静态)变量--在成员变量基础上,声明为static类型
- 访问控制修饰符:default--在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法;private--在同一类内可见。使用对象:变量,方法;public--对所有类可见。使用方法与default一样,protected--对同一包内的类和所有子类可见,使用对象与private一样
- 访问控制和继承:负类声明为public,子类必须public;负类声明为protected,子类必须声明为protected或者public;负类的private方法不能被子类继承
- 非访问控制修饰符:static、final、abstract、synchronize。static修饰的静态变量和静态方法,静态变量无论实例话多少对象,都只有一份拷贝,局部变量不能声明为静态变量;静态方法不能使用类的非静态变量;final变量一旦赋值,不能被重新赋值,final方法可以被子类继承,但不能被子类重写,final类不能被继承;abstract方法,子类必须实现负类的抽象方法,否则子类还是抽象类,abstract抽象类不能被实例化,只为了拓展用;synchronized 修饰符声明的方法同一时间只能被一个线程访问
- switch语句中的变量类型只可以实byte、short、int或char;从java se7开始支持string
- 继承:子类拥有负类非private的属性、方法;子类可拥有自己的属性和方法,扩展负类,子类可以重写负类的方法,但只可以单继承
- 多态:多态是同一个行为具有不同表现形式的能力,多态就是不同实例执行不同操作。多态的实现形式:重写、接口、抽象类和抽象方法
- 封装:修改属性的可见性来限制对属性的访问,对每个属性值提供公共访问的接口
- 接口:接口是抽象方法的集合。
- 接口与类的区别:接口不能实例化对象,没有构造方法,不是被类继承,而是被实现,没有成员变量(除了static和final变量),都是抽象方法,支持多继承
- 抽象类和接口的区别:抽象类可以有方法体,方法的具体功能,但接口不行;抽象类的成员变量各种,但接口没有,即使有也是static和final变量;接口中不能含有静态方法和代码块,而抽象类可以有;抽象类单继承,接口可多继承
- hashset:基于hashmap实现,是一个不允许重复元素的集合,无序
- 泛型:提供了编译时类型安全检测机制,在编译时检测到非法类型。泛型本质是参数化类型,将操作的数据类型被指定为一个参数
- java多线程编程:线程是资源分配的基本单位,一条线程(任务调度的最小执行单位)指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每个线程并行执行不同的任务
- 线程的生命周期:新建状态、就绪状态、运行状态、阻塞状态、死亡状态。新建状态使用new thread类或者其子类建立一个线程对象,线程就处于新建状态;就绪状态是调用start方法,进入就绪状态,处于就绪队列中,等待JVM里的线程调度器调度;就绪状态的线程获取到cpu资源,就可以执行run方法,此时线程处于运行状态,此时状态最为复杂,可变为阻塞状态、就绪状态和死亡状态;执行了睡眠、挂起等方法,失去所占用的资源,线程就会变为阻塞状态,在后续睡眠时间到和资源获取成功后重新进入就绪状态。阻塞可分为三种:等待阻塞、同步阻塞和其他阻塞,等待阻塞是运行时执行wait方法,使线程进入阻塞状态,同步阻塞是获取同步锁失败,其他阻塞比如调用sleep;一个运行状态的线程完成任务或者其他条件种植发生时,就切换到终止状态
- 创建线程三个方法:实现runnable方法、继承thread类、callable和future创建线程。runnable只需要执行一个方法调用run函数和start函数;创建一个新的类,该类继承thread类,并创建一个该类的实例,需要重写run方法和start方法,run方法是新线程的入口点;
- JDK8 新增特性:lambda表达式,lambda允许把函数作为一个方法的参数;方法引用,提供非常有用的语法,直接引用已有java类或对象的方法或构造器,与labmada联合使用,减少冗余代码;默认方法,默认方法就是在接口里面有了一个实现的方法
- 异常:分为运行时异常和被检查异常,运行时异常不需要捕获或声明抛出,大部分是逻辑出现了问题,比如(null pointer excetion)被检查异常必须抛出(IOexception)
- java三大特性:继承、封装、多态。继承--子类在父类的基础上扩展新的属性和方法,单继承,多实现;封装--将事物抽象成一个对象,对象的属性私有,提供公共的方法供外界调用;多态--通过继承(多个子类对同一方法重写)和接口(实现接口并覆盖接口)实现多态,不同的实例执行不同的操作
- java与C++的区别:c++支持多继承,并有指针的概念,由程序员自己管理内存;java时单继承,可用接口实现多继承,java不提供指针来直接访问内存,程序内存更加安全;并且java有JVM自动内存管理机制,不需要程序员手动释放无用内存
- 多态实现原理:多态的底层实现是动态绑定,在运行时才把方法调用与方法实现关联起来。静态绑定时编译时确定,比如方法重载
- static和final关键字:static关键字可以修饰变量和方法,变量是所有对象共享一份,随着类的加载而加载,先于对象之前创建,类名.变量名调用,静态方法必须调用静态变量,使用类名.方法名调用;final可修饰类、方法、变量,final修饰的变量不可修改,final修饰的方法不可重写,final修饰的类不可被继承
- java反射原理及使用场景:java反射是指在运行状态中,任意一个类都能够知道这个类的所有属性和方法,并能够调用它的任意一个方法;反射原理--获取反射类的字节码,然后将字节码中的方法、变量、构造函数等映射成相应的method、field、constructor等;反射应用场景--开发通用框架,比如spring等都是配置化的,为保证框架通用型,配置文件运行时动态加载不同的对象或类,调用不同的方法;动态代理,在切面编程AOP中,需拦截特定的方法,通常会选择动态代理,常用的JDK和CGLIB,jdk时spring默认动态代理,需要实现接口,cglib通过asm框架序列化字节流,可配置、性能差;自定义注解,注解需使用反射机制起到标记作用,根据注解标记去调用注解解释器,执行行为
- ArrayList和Linklist的区别:ArrayList底层基于数组实现,适用于查找场景,和在最后一个元素后进入插入和删除的场景;Linklist底层基于双向链表实现,适用于动态插入和删除的场景。但这两者都是线程不安全的,若要保证线程安全需使用vector实现,底层通过同步修饰符保证线程安全,但效率较差
- Hashmap:1.7基于数组+链表实现,1.8基于数组+链表+红黑树实现,当链表长度大于阈值,数组长度大于64时,链表转化为红黑树,减少搜索时间,解决了url参数dos攻击问题
- 序列化和反序列化:序列化:将java对象转化成字节序列的过程;反序列化:将字节序列转化为java对象的过程。优点:实现数据的持久化,通过序列化可以将数据永久保存到硬盘上redis的RDB;利用序列化可实现远程通信,在网络上上传对象的字节序列
- string不可变的原因:使用数组存储,使用了final修饰
- 设计模型与原则:单例模式、工厂模式、抽象工厂模式。单例模式只能生成一个实例,可全局访问,优点是唯一访问(生成唯一的序列化场景,或者spring的bean类型)和提高性能(频繁实例创建销毁耗时耗资源),缺点是不适合有状态且需变更的;工厂模式是定义一个用户创建产品的接口,由子类决定生产何种产品,优点:解藕,提供参数就可获取产品,缺点是每增加一个产品就增加一个产品类;抽象工厂模式提供一个接口,用于创建相关或者依赖对象的家族,并由此进行约束,优点:类的内部对产品进行约束,缺点是增加一个新产品,几乎所有工厂类都需要修改
- wait和sleep的区别:wait方法在synchronizd保护的代码中使用,而sleep没这要求;wait方法会主动释放monitor锁,sleep不会;wait方法若不被中断和唤醒不会主动恢复,sleep是睡眠时间到期后会主动恢复;wait是object类的方法,sleep是thread的方法
- Spring IOC:控制反转,将原本在程序中手动创建对象的控制权交由spring框架来管理,实现模块之间的解藕
- Spring AOP:AOP是面向切面编程,把与业务无关,但与业务模块具有共同调用的逻辑封装起来,减少代码冗余力量。Spring AOP是基于动态代理的,如果要代理的对象实现了某个接口,会使用JDK代理,否则会使用CGLIB,生成一个被代理对象的子类来代理
- bean的生命周期:单列对象的生命周期和容器相同,多列对象出生使用对象时spring框架创建,活着是只要在使用就活着,死亡是长时间不用,java的垃圾回收机制回收
- 声明bean的注解:@component,标注任意类spring组件;@service,在业务逻辑层使用(service层),@Repository,在数据访问层使用(dao层);@Controller,在展现层使用,控制器的声明(controller层)
- Mybatis和hibernate的区别:都是对象关系映射框架。在开发方面,hibernate的sql语句已经封装,可以直接使用,可加速系统开发,Mybatis属于半自动化,sql需要手动完成,稍微繁琐,但是对于复杂语句多的场景下,Mybatis相对来说更好;sql优化方面,hibernate自动生成sql语句,会多消耗一些性能,Mybatis手动编写sql,可以避免不需要的查询,提升性能;对象管理方面,hibernate提供完成的对象-关系映射关系,无需关心底层实现,Mybatis需自行管理映射关系
- spring中的设计模型:单列设计模型,bean都是默认单例;工厂设计模式,通过beanfactory、APPlicationContext创建bean对象;代理设计模式,Spring AOP功能的实现;观察者模式,Spring事件驱动模型就是典型的观察者模型;适配器模式
- Spring cloud:微服务解决方案
- String和Stringbuilder的区别:String提供数值不可改变的字符串,因为底层使用了final修饰,stringbuilder提供的字符串可改变
- java中堆和栈的区别:堆用来保存对象,栈用来保存方法帧和局部变量;栈通常被堆小,也不会多个线程间共享,而堆是整个JVM所有线程共享
- 垃圾回收的基本原理:当对象被创建时,垃圾回收器(GC)就开始检测使用情况,当长期未使用,不可达时就会回收
- 内存泄露:就是指一个不再被程序使用的对象或变量一直被占据在内存中
- MVC的各部分有哪些技术,如何实现的:model-view-controller,model代表的是应用的业务逻辑,通过javabean实现,view时应用的表示面(由JSP页面产生),controller提供应用的处理过程控制(一般是Servlet)
- JDBC访问数据库的基本步骤:加载驱动;通过DriverManager对象获取连接对象Connection;通过连接对象获取会话;通过会话进行数据的增删改查,封装对象;关闭资源
- Spring的理解:轻量:Spring 是轻量的,基本的版本大约2MB;控制反转,将原本在程序中手动创建对象的控制权交由spring框架来管理,实现模块之间的解藕;面向切面的编程(AOP):将应用业务逻辑和系统服务分开。具体通过动态代理实现,如果要代理的对象实现了某个接口,会使用JDK代理,否则会使用CGLIB,生成一个被代理对象的子类来代理;容器:Spring 包含并管理应用中对象的生命周期和配置;MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品;事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA);异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常
- Spring依赖注入:依赖注入是IOC的一个方面。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。
- 依赖注入的方法:构造器依赖注入和setter方法依赖注入
- Spring beans:形成spring应用的主干的java对象,被IOC容器初始化、装配和管理
- bean的作用域:singleton: bean在每个Spring ioc 容器中只有一个实例;prototype:bean的定义可以有多个实例;request:每次http请求都会创建一个bean,request内有效;session:在一个HTTP Session中,一个bean定义对应一个实例;global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例
- jvm调优步骤:第1步:分析GC日志及dump文件,判断是否需要优化,确定瓶颈问题点;
第2步:确定JVM调优量化目标;
第3步:确定JVM调优参数(根据历史JVM参数来调整);
第4步:调优一台服务器,对比观察调优前后的差异;
第5步:不断的分析和调整,直到找到合适的JVM参数配置;
第6步:找到最合适的参数,将这些参数应用到所有服务器,并进行后续跟踪 - JVM内存区域分为五个部分,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器
- JVM的GC有三种:Minor GC(年轻代区域的回收)、major GC(老年代区域的回收)、full GC(年轻代、老年代、永久代区域的回收)