Java基础
**
这几周开始看Java的知识,发现有一个有趣的现象就是,前两天刚看过的知识点,过一天又忘掉了。而且很多东西堆在脑子里像浆糊一样。所以边学习边总结是很重要的,因为面试会问啊,这是基础中比较重要的地方,所以我决定自己好好总结一篇自己的博客,也算是给自己的学习之路做记录。
**
之后会继续不断更新的,希望会对大家有所帮助,哪里写的不对,希望可以留言评论,我会及时整改。
OOD:
面向对象设计(Object-Oriented Design,OOD)方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一>步的规范化整理,以便能够被OOP直接接受。
OOP:
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计>算机程序是由单个能够起到子程序作用的单元或对象组合而成。
JAVA当中是没有全局变量的
局部变量声明在方法、构造方法或者语句块中;
局部变量在方法、构造方法、或者语句块被执行的时候创建,当他们执行完成之后,变量将被销毁
访问修饰符不能用于局部变量;
局部变量只在声明它的方法、构造方法或者语句块中可见;
局部变量是在栈上分配的。
局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用
1、定义的位置不一样
局部变量:在方法的内部
成员变量:在方法的外部,直接写在类当中
2、作用范围不一样
局部变量:只有方法当中才可以使用,出了方法就不能在使用
成员变量:整个类全都可以使用
3、默认值不一样
局部变量:每日有默认值,如果想要使用,必须手动进行赋值
成员变量:如果没有复制,会有默认值,规则和数组一样
4、内存的位置不一样
局部变量:位于栈内存
成员变量:位于堆内存
5、生命周期不一样
局部变量:随着方法进栈而诞生,随着方法出栈而死亡
成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失
ublic calss Demo01variableDifference{
String name;//成员变量
public void methodA(){
int num=20;//局部变量 默认值为NULL
System.out.println(num);
System.out.println(name);
}
public void methodB(int param){
//方法的参数就是局部变量
System.out.println(param);//参数也是局部变量,为什么不赋值就可以输出?
//因为参数在方法调用的时候,必然会被赋值的。不传参数就会报错。
int age;
//System.out.println(age);//错误写法 未赋值不能使用,必须赋值
// System.out.println(num);//错误写法
System.out.println(name);/
}
}
return语句主要有两个作用:
1、用来返回方法指定类型的值(这个值总是确定的)
2、结束这个方法的执行(仅仅一个return语句)
根据方法的定义,每一个方法都有返回类型,该类型可以是基本类型,也可以是对象类型,同时每个方法都必须有一个结束标志,因此return起到了这个作用。在返回类型为void()的方法里面,有个隐含的return语句,因此,在void方法里面可以省略不写
SQL转日期用Convert函数
SQL转字符串用to_char()
SQL中的not null是不允许插入null,但是可以插入空值(MySQL)
左连接和内连接的区别:左连接如果满足或者不满足where条件的话,都会返回左表的数据。内连接如果不满足where条件的话不会返回数据。
字符串拼接有几种方式:
1、利用 “+” 号拼接。
2、用concati来拼接。
3、利用String Buffer 中的append来拼接。
4、利用String Builder 中的append来拼接
Java中的全限定名称:包名 + 类名
类加载的过程:加载–验证–准备–解析–初始化
常见的端口号有哪些
1、Mysql的默认端口是3306,可以编辑用户目录下的 .my.cnf 文件进行修改;
2、Oracle默认端口号为:1521;
3、Redis默认端口号为:6379;
4、Tomcat默认端口号为:8080;
Java之高内聚低耦合
高内聚:指的指模块内元素彼此之间结合的紧密程度。各元素之间联系越紧密,则内聚性就高。
低耦合:指的就是各个代码块间联系紧密程度。模块之间联系越紧密,其耦合性就越强,模块的独立性就越差。相反其耦合性就越弱。
Java的三大特性
封装:封装指的是将属性私有化,根据需要提供setter和getter方法来访问属性。增强了属性的安全性和简化编程,减少耦合性。通过外部接口即可访问类中的属性。
继承:继承是发生在父子类当中,子类继承父类,可以重写父类的方法和属性。在Java当中是单继承多实现。
多态:在继承的基础上,父类的引用指向子类的对象。向上转型和向下转型,向上转型是安全的,向下转型是不安全的,重写和重载也都是多态的体现。
接口和抽象类的区别:
(1)抽象类可以有构造方法,接口中不能有构造方法。
(2)抽象类中可以有普通成员变量,接口中没有普通成员变量
(3)抽象类中可以包含静态方法,接口中不能包含静态方法
(4) 一个类可以实现多个接口,但只能继承一个抽象类。
(5)接口可以被多重实现,抽象类只能被单一继承
形参和实参的区别
形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。 实参出现在主调函数中,进入被调函数后,实参变量也不能使用
值传递和引用传递
值传递:指的是在方法调用时,传递的时参数是按值的拷贝传递。 特点:传递的是值的拷贝,也就是传递后就互不相关了。
引用传递:指的是在方法调用时,传递的参数时按引用进行传递, 其实传递的是引用的地址,也就是变量所对应的内存空间的地址,
特点:传递的是值的引用,也就是说传递前和传递后都指向用一个引用(也就是同一个内存空间)。
重写和重载
构造器可以被重载但是不能被重写。
方法重载:
1、同一个类中
2、方法名相同,参数列表不同(参数顺序、个数、类型)
3、方法返回值、访问修饰符任意
4、与方法的参数名无关方法重写:
1、有继承关系的子类中
2、方法名相同,参数列表相同(参数顺序、个数、类型),方法返回值相同
3、访问修饰符,访问范围需要大于等于父类的访问范围
4、与方法的参数名无关
String和StringBuilder、StringBuffer的区别?
String:String 的值被创建后不能修改,任何对 String 的修改都会引发新的 String 对象的生成。
StringBuffer:跟 String 类似,但是值可以被修改,使用起来是比较安全的。
StringBuilder:StringBuffer 的非线程安全版本,没有使用 synchronized,具有更高的性能,推荐优先使用。
String s = “abc” 和 String s = new String(“abc”) 区别?
这两个语句都会先从字符串常量池当中检查是否已经存在"abc",如果已存在,会直接只用字符串常量池当中的这个abc,
如果字符串常量池当中没有的话,就会在字符串常量池中创建一个。
另外一个是通过new关键字在字符串常量池当中创建一个相同的实例对象,值一样,内存地址不一样。
== 和 equals 的区别是什么?
==:运算符,用于比较基础类型变量和引用类型变量。 equals:是用来比较值。
final可以修饰类、成员变量和成员方法
被final修饰的类,不能被继承 被final修饰的方法,不能被重写
被final修饰的成员变量,不能被重新赋值(接口中的成员变量默认为public static final修饰的静态常量)
String类为final修饰类,不能被继承
String str = new String(“abc“)到底new了几个对象?两个或者一个
1、两个:如果常量池里面没有“abc”这个字符串,那虚拟机就会在堆内存中new出一个String对象,还会在常量池中new一个abc字符串对象;
2、一个:如果常量池中已经有"abc"这个字符串,也就是说你在前面已经new过一个值为“abc”的字符串,那虚拟机就只会在堆内存中new一个String对象,并将常量池中“abc”的地址指向你刚刚new的String对象
成员变量和方法的区别?
成员变量有两种:实例变量和类变量(也称静态变量,静态域)。
成员方法有三种:实例方法,类方法(也称静态方法),构造方法(无返回值,方法名和类名一致)。
类变量的特点:
它是该类所有实例共享的属性,在内存中只有一个地方存储这个变量(在方法区)。在类加载的准备阶段,
分配到方法区,初始化阶段正式赋值。所有实例都可以修改这个类变量的值。(前提是没有被final修饰)
访问类变量不用实例化对象,直接通过类可以使用。生命周期取决于类的生命周期。
类方法的特点:
直接通过类就可以调用。 类方法可以直接调用类变量和类方法。 类方法不可以直接调用实例变量和实例方法。 类方法没有this,因为没有实例。
实例变量和实例方法的特点:
都必须通过实例对象才可以访问。(实例变量位于堆中,生命周期取决于实例的生命周期)
Java编译后的.class文件包含了哪些内容?
编译后的.class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在.class文件之中,中间没有添加任何分隔符;根据Java虚拟机规范的规定,class文件格式采用一种类似于C语言的伪结构来存储数据,包含无符号数和表。Class文件的结构没有分隔符,无论你是数量还是顺序,都是严格规定的,哪个字节代表什么含义、长度多少、先后顺序如何,都不允许改变。
Java如何进行高效的数组拷贝?
Arrays.copyOf()或 System.arraycopy(),是自己new数组, 然后for循环复制效率的两倍左右
为什么快,因为它们是native方法;Object是所有类都可以继承,所有可以通过this和super来调用
this只能在当前类中调用,super是可以在其他类中调用
调用show()方法,User对象已经通过无参构造初始化了。
数组不能直接打印,可以用arrags.toString()方法和Steady.of和forEach来进行遍历。
wait():导致线程进行阻塞状态;
notify():调用wait方法的线程,解除阻塞状态;
notifyAll():解除所有wait对象
continue():是中断一下,后面的还会继续执行。
break():是停止循环。
return():是终止main方法。
sleep()与interrupt()
sleep():指定睡眠时间,按照毫秒来计算
interrupt():唤醒正在睡眠的程序
创建线程的四种方式
1、继承Thread类。 2、实现Runnable接口。 3、实现Callable接口。 4、通过线程池创建线程。
Runnable和Callable区别
Runnable接口run方法没有返回值,Callable接口run方法有返回值
并发编程的三要素:
1、原子性:原子性是不可再分的最小单元,指的是一个或多个操作要么全成功要么全失败。 2、可见性:一个线程做修改另一个线程是可见的。
3、有序性:线程的执行顺序按照代码的先后顺序来执行。
并发与并行
并发:多个线程在同一个CPU上,轮替执行任务,叫做并发。 并行:在同一时间内,多个线程同时执行多个任务。叫做并行。
串行:有很多任务,由一个线程按照顺序去依次执行。
进程与线程
进程:进程是程序的一次执行过程,在执行的过程中会有很多的线程来完成各自的工作。
线程:线程是进程当中的一个单元,负责当前进程中的任务执行,一个进程中至少有一个线程来执行任务,一个进程当中可以运行多个线程。
run()方法和start()方法的区别
每个线程都是通过某个特定的Thread对象对于的run()方法来完成其操作的,run方法称为线程体,通过调用Thread类的start方法来启动一个线程。
start()方法用于启动线程,run()方法用于执行线程的运行代码,run()可以反复调用,而start()方法只能被调用一次。
start()方法来启动一个线程,真正实现了多线程的运行。调用start()方法无需等待run()方法体代码执行结束,可以直接继续执行其它的代码;调用start()方法线程进入就绪状态,随时等该CPU的调度,然后可以通过Thread调用run()方法来让其进入运行状态,run()方法运行结束,此线程终止,然后CPU再调度其它线程。
为什么调用start()方法会执行run()方法,为什么不能直接调用run()方法
这是一个常问的面试题,newThread,线程进入了新建的状态,start方法的作用是使线程进入就绪的状态,当分配到时间片后就可以运行了。start方法会执行线程前的相应准备工作,然后在执行run方法运行线程体,这才是真正的多线程工作。
如果直接执行了run方法,run方法会被当作一个main线程下的普通方法执行,并不会在某个线程中去执行它,所以这并不是多线程工作。 小结:
调用start方法启动线程可使线程进入就绪状态,等待运行;run方法只是thread的一个普通方法调用,还是在主线程里执行。
对线程池的理解:
常用的数据库连接池C3P0、DBCP、阿里(Druid)
线程时一种多线程的处理形式,每个线程接受到任务的时候会从创建线程到就绪到运行到阻塞到死亡,
如果把他交给线程池来管理的话,使用线程池就会大量的减少线程的创建和死亡次数,使线程可以重复使用;
常见的线程池和使用场景
单线程化线程池:指挥用唯一的工作线程来执行任务,所有任务按照指定顺序来执行。 定长线程池:可控制线程最大并发数,,超出的线程会在队列中等待。
可缓存线程池:可回收空闲线程,若没有空闲线程则创建新的线程。
关闭线程池Shutdown()和ShutdownNow()两个方法来实现
shutdown:线程池不在接受新的任务,也不会停止当前任务;
shutdownNow:对正在执行的任务全部发出interrupt(),停止执行,对还为开始执行的任务全部取消。
并且返回还没开始的任务列表。
HashMap 和Hashtable 的区别?
HashMap 允许 key 和 value 为 null,Hashtable 不允许。
HashMap 的默认初始容量为 16,Hashtable 为 11。
HashMap 的扩容为原来的 2 倍,Hashtable 的扩容为原来的 2 倍加 1。
HashMap 是非线程安全的,Hashtable是线程安全的。
连接JDBC的七大步骤
1、加载驱动
2、获取链接
3、创建SQL执行器
4、SQL预编译
5、执行SQL
6、执行结果
7、关闭连接
localhost也叫host:本地服务器
127.0.0.1在windows系统上面的解释是本机地址(本机服务器); localhost(local)是不经过网卡传输,这点很重要,他不受网络防火墙和网卡相关的限制;
127.0.0.1是通过网卡传输依赖网卡并受到网络防火墙和网卡相关的限制; 一半设置程序时,本地服务器用localhost最好,因为localhost不会解析成IP,也不会占用网卡和网络资源;
前端知识
HTML 是用来描述网页的一种语言。HTML 指的是超文本标记语言 (Hyper Text Markup Language)
HTML 不是一种编程语言,而是一种标记语言 (markup language)
标记语言是一套标记标签 (markup tag)
HTML 使用标记标签来描述网页
matches():方法用于检测字符串是否匹配给定的正则表达式
==和===的区别
==是比较值,===是比较的类型和值
重定向和转发的区别
区别 forward(转发) SendRedirect(重定向)
根目录 包含项目访问地址 没有项目的访问地址
地址栏 不会发生变化 会发生变化
从哪里跳转 服务器端进行的跳转 浏览器端进行的跳转
请求域中数据 不会丢失 会丢失
如果要保留请求域中的数据,使用转发,否则使用重定向;以后访问数据库,增删改使用重定向;查询使用转发;
数据库
Oracle中的lpad的用法,用来填充,10位的话会默认用空格来填充。
``
SELECT LPAD('ORACLE',10,'AA') FROM DUAL;
结果返回 AAAAAORACLE
SQL语句的执行顺序
1、最先执行from tab。
2、where语句是对条件加以限定。
3、分组语句【group by…… having】。
4、聚合函数。
5、select语句。
6、order by排序语句。
数据库的三大范式
第一范式(1NF):列不可再分
1.每一列属性都是不可再分的属性值,确保每一列的原子性
2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据
第二范式(2NF)属性完全依赖于主键
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,
以存储各个实例的惟一标识。这个惟一属性列被称为主键
第三范式(3NF)属性不依赖于其它非主属性 属性直接依赖于主键
数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。
像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。
总结:在设计数据库结构的时候要尽量遵循三大范式来写,如果不遵循,要有绝对的理由。
事务的隔离级别
A(原子性) C(一致性) I(隔离性) D(持久性)
Spring框架
对Spring的理解
IOC(控制反转)把创建对象的权限交给了Spring容器来管理;
AOP(面向切面变成)降低模块之间的耦合性,把核心业务和增强功能分隔开,
在核心业务执行不受影响的情况下,选择性的插入新的功能,达到功能扩展的目的。
yml与properties的优先级问题
yml的优先级会高于properties,所以如果同时存在这两种配置的话,
yml优先加载,properties后加载,就会把yml覆盖掉。
@Autowired:默认的是byType方法,如果匹配不上,就会byName。
@Autowired:不能唯一装配时,需要@Autowired + @Qualifier 不能单独使用。
@Autowired 无法按照类型找,可以用 @Qualifier 指定id来查找。
@Resource 和 @Autowired的区别
都是用来自动装配的,都可以放在属性字段上。@Autowired 通过byType的方式实现,
而且必须要求这个对象存在(常用)
@Resource 默认通过byName的方式来实现,如果找不到名字,则通过byType的方式实现,
如果两个都找不到的情况下,就会报错(常用)
执行的顺序不同@Autowired 默认bytype @Resource 默认byname方式来实现
SpringBoot
什么是SpringBoot
Spring Boot 是Spring开源组织下的子项目,主要是简化了Spring的开发,从繁到简,可以快速上手。
Spring Boot优点
1、约定大于配置。
2、开箱即用,远离Spring繁琐的配置。
3、没有代码生成,也没有XML的配置。
Spring Boot 的核心注解
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,
主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。