小白一枚,第一次写,也是逼下自己养成记录美好生活的习惯吧,O(∩_∩)O哈哈!!
最新项目不是特别忙,特意抽出点时间刷了部分面试题和编程题为了将自己的基础巩固下, 毕竟以前自学的Java,基础功不扎实。只能利用空余时间自行弥补吧~~下面是中途记录的一些比较偏理论的一些笔记,希望对大家面试有帮助。另外笔记没有group by ‘类型’ order by ‘顺序’,请不要介意。。
-
Question:a.hashCode()有什么用,与a.equals(b)有什么关系?
hashCode() 是相应对象的整形的hash值,根据java规范,两个使用equals()方法来判断对象相等必须具有相同的hash值 -
Question:“ab”和”a.equals(b)”有什么区别?
如果a 和b都是对象,则ab是比较两个对象的引用,只有当a 和b指向的是堆中的同一对象才会返回true,而a.equals(b)是进行逻辑比较,当内容相同时候,返回true,所以通常
需要重写该方法来提供逻辑一致性的比较,例如,String重写equals()方法,所以可以用于两个不同数量,但是包含的字母相同的比较。 -
Question:java String类型 作为参数是什么传递
String类型的传递是引用传递,也就是所谓的地址传递,因为在java里,String是对象类型,作为参数肯定是引用传递,之所以有值传递的效果,是因为在String内部实现的时候,用char[]来存储字符串的,所以String相当于char[]包装类,那java中,包装类的一个特征就是值操作时体现对应的基本类型的特质。 -
Question:java final 关键字的用法
1.用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变,对于成员变量来讲,我们必须在声明时或者构造方法对它赋值。
2.用来修饰方法参数,表示在变量的生存期的值不能被改变。
3.修饰方法,表示该方法无法被重写
4.修饰类,表示类无法被继承。 -
Question:Synchronized关键字加到static静态方法和非静态方法区别
Synchronizd 关键字加到static 静态方法是给类Class加上锁,而加到非static静态方法是给对象加锁,但不是同一个锁。结果,static方法多线程是同步执行方法,但是非static方法多线程异步执行,这是异步的原因是因为持有不同的锁,一个是对象锁,一个是class锁,而class锁可以对类的所有实例起作用。 总结就是 static-类锁-同步 ,非static-同步锁-异步 -
Question:String,StringBuffer,StringBuilder区别
1.首先在运行速度上或者执行速度来说,StringBuilder>StringBuffer>String,String最慢的原因,String为字符常量,StringBuilder和StringBuffer均为字符串变量,则String对象一旦创建之后对象不可修改,但后两着对象是变量,是可以更改的。
2.线程安全方面来说:StringBuilder是线程不安全的,而StringBuffer是线程安全的。如果一个StringBuffer对象在字符串缓冲区被多个线程使用时候,StringBuffer中很多方法可以带有synchronize关键字,所以StringBuffer可以保证线程安全。但是StringBuilder方法则没有关键字,所以不能保证线程安全,有可能出现一些错误的操作,所以要进行多线程操作,那么就要使用StringBuffer,但是单线程情况下,还是建议使用速度比较快的StringBuilder。
3.总结一下,String:使用少量的字符串操作的情况,StringBuilder:使用与单线程在字符缓冲区进行大量操作的情况,StringBuffer:使用于多线程在字符串缓冲区进行大量的操作。 -
什么是SpringMVC?简单介绍下你对SpringMVC的理解?
SpringMVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一个模板,无需中间整合层来整合,它和Struts2一样属于表现层的框架,在web模型中,MVC是一种很流行框架,通过吧Model,VIew.Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。 -
Question:SpringMVC的流程?
1.用户发送请求到前端控制器DispatcherServlet;
2.DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle
3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5.执行处理器(Handler,也加后端控制器)
6.Handler执行完成之后返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传到ViewResolver视图解析器进行解析
9.ViewResolver解析后返回具体VIew
10.DispaterServlet对view进行视图渲染,(即就是填充操作)
11.DispatcherServlet相应用户。 -
Question:高并发解决方案
1.html静态化,纯静态化的html效率最高,消耗最小,所以我们尽可能使我们的网站上的页面采用静态页面,例如CMS信息发布系统,信息发布系统可以实现简单的信息录入自动生成静态页面,还能具备频道管理,权限管理,自动抓取的功能,对于大型系统来说,拥有一套高效,可管理的CMS必不可少。
2.图片和服务器进行分离操作。 对于大型的Web服务器来说,图片是最消耗资源的,于是又必要的将图片于页面进行分离,这是基本上大型网站都会采用的一种策略,他们都有独立的,甚至很多台图片服务器,这样的架构可以降低提供页面访问请求的服务器压力,并且可以保证系统不会因图片问题而崩溃。
3.数据库集群,库表散列。我们在应用程序中安装业务和应用或者功能模板将数据库进行分离,不同的模板对应不同的数据库和表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户Id进行表散列,这样就能提供低成本提升系统的性能并且有很好的扩展性。Sohu的论坛就是采用这样的架构,将论坛的用户,设置,帖子等信息进行数据库分离,然后对帖子,用户按照板块,和id进行散列和数据库和表,最终可以在配置文件中进行简单的配置能让系统随时增加一台低成本的数据库进行补充系统性能。
4.缓存。架构方面的缓存,对Apache比较熟悉的人都能知道 Apache提供自己的缓存模板,也可以使用外加的Squid模板进行缓存,这两种方式可以有效的提高Apache的相应能力。
5.镜像。镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地狱带来的用户访问速度差异,比如ChinaNet和EDUNet之间的差异就促使很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,有很多专业的现成的解决架构和产品可选,也有廉价的通过软件实现的思路,LInux 上的rsync 工具
6.负载均衡。负载均衡是大型网站解决高并发和大量请求采用的高端解决办法 -
Question:Session和Cookie
Session 原理:
1.session是保存在服务器端,理论上是没有限制,只要内存足够大。
2.浏览器第一次访问服务器会创建一个session对象并返回一个JSessionID = ID的值,创建一个Cookie对象 key为JSSIONID,value为ID的值,将这个Cookie写回浏览器
3.浏览器第二访问服务器的时候携带Cookie信息JSessionID = ID的值,如果该JSessionId的session已经销毁,那么会重新创建一个Session,再返回一个新的JSession通过Cookie返回浏览器。
4.针对一个web项目,一个浏览器是共享一个Session,就算有两个web项目部署在同一个服务器上,针对两个项目的session是不同的,例如在tomat上同时部署了两个项目,分别是web1,web2,当你在一个浏览器上同时访问web1时创建的session是A1,访问web2创建的session是A2。
5.Session是基于cookie技术实现的,重启浏览器后再次访问原有的连接依然会创建一个新的session,因为cookie在关闭浏览器后就是消失,但是原来服务器的session还在,只有等到销毁的时间会自动销毁。
6.如果在浏览器端禁用cookie,那么每次访问都会创建一个新的session,但是我们可以通过服务器端程序重写URL,如果页面多连接多,会增加不必要的工作量。
Cookie:
通俗讲,是访问某些网站后在本地存储的一些网站相关信息,下次访问的时候会减少的一些步骤,更准确的说,Cookie是服务器在本地机器存储的一小段文本并随每一个请求发送至同一个服务器,是在客户端保持状态的方案。Cookie的主要内容包括:名字,值,过期时间,路劲和域。使用抓包工具就可以看见。Key Value形式,过期时间可设置的,如果不设置,则浏览器关掉就消失了,存储在内存之中,否则就按设置的时间来存储在硬盘上,过期户自动清除,
区别和联系:
1.cookie数据放在客户的浏览器上,session数据放在服务器上
2.Cookie不是很安全,别人可以分析放在本地的cookie,并进行cookie欺骗,考虑到安全应当使用session.
3.Session会在一定时间内保存在服务器上,但访问增多,会比较占用你服务器的性能,考虑到减轻服务器方面,应当使用cookie。
4.单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点能保存20个cookie
5.可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。 -
Question:消息队列的概念
消息队列的主要特点就是异步处理,主要目的是请求响应时间和解耦,所以主要的使用场景就是将比较耗时而且不需要即时(同步)返回的结果作为消息放入队列,同时因为使用了消息队列,只要保证信息格式不变,发送方和接收方并不需要彼此联系,也不会对方的影响,即解耦合。 -
Question:开发中遇到的浏览器,分别是什么内核?
1.使用Trident的是IE,国内的绝大数浏览器,Trident就是ie内核
2.使用WebKit的有苹果的safari,谷歌。 -
Question:JDK中比较重要的包
1.java.lang:包含了Java语言的核心类,如String/Math/System/Thread等,使用该包下的类是不需要显示导入
2.Java.util:包含大量的工具类,如集合框架,日期处理。
3.Java.net:关于Java网络编程的一些类和接口
4.Java.io:关于Java输入输出的相关类和接口
5.Java.text:java格式化相关类
6.Java.sql:定义Java进行JDBC数据库编程相关类和接口
7.Java.awt:定义了图形用户界面设计的相关类和接口 -
Question:JVM?
首先我们熟悉一下一个一般性的java程序工作过程,一个java源程序文件,会被编辑为字节码文件(为class扩展名),每个Java程序都需要运行在自己的jvm上,然后告知JVM程序的入口,再通过字节码解释加载运行,那么程序开始后,如何涉及到各内存区域?
概括来说,JVM初始运行的时候都会分配好方法区和堆,而JVM每遇到一个线程,就为其分配一个程序计数器,虚拟机栈和本地方法栈,当线程终止的时候,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也将被释放掉。这也是为什么我把内存区分为线程共享和非线程共享的原因,非线程共享那三个区域的生命周期于所属线程相同,而线程共享的区域与Java程序运行生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域的原因。 -
Question:关系范式:
1NF:指列的原子性,及列不可再分为其他及列
2NF:包含1NF,外加:(1)表必须有主键;(2)未包含在主键列必须完全依赖于主键
3NF:包含2NF,外加:非主键列必须直接依赖于主键,不可存在传递依赖。 -
Question:jetty 和 tomcat 的区别和应用场景
Jetty 满足公有云分布式环境的需求,而tomcat更符合企业级环境,Jetty 更轻量级,这是相对于tomcat而言,由于tomcat除了遵从Java Servlet规范之外,自身还扩展了大量javaee特性用来满足企业级需求,所以tomcat是叫重量级的,而且配置相比较jetty也复杂多。但是对于大量的普通互联网应用而言,并不需要用到tomcat其他高级特性,所以在这种情况下,使用tomcat是浪费资源的,这种劣势情况下,换成jetty,每个应用服务器剩下几兆内存,对于大的分布式环境则是节省大量资源,而且,jetty的轻量级也使在高并发请求场景下更为快速。当支持大规模企业级应用,jetty也许便需要扩展,在这场景下tomcat便是优的。 -
Question:Java反射机制
1.运行时判断任意一个对象所属的类
2.在运行时候构造任意一个类的对象
3.在运行时候判断任意一个类所具有的成员变量和方法。
4.运行调用任意一个对象的方法:生成动态代理。 -
Question:数据库的优化
优化方法,
软优化:
1.查询语句优化
2.优化子查询
3.使用索引
4.分解表
5.增加中间表
6.增加冗余字段
7.分析表,检查表,优化表
硬优化:
1.硬件三件套(cpu,内存,磁盘)
2.参数设置
3.分库分表+读写分离 -
Question:如果事务T获得了数据项Q上的排它锁,则T对Q(既可读又可写)
共享锁:又称读锁(S锁),若事务T对数据对象加上S锁,则其他事务只能再对A加上S锁,但不能加X锁,只能T释放了A上的S锁。只能读不能写
排它锁:又称写锁(X锁),若事务T对数据对象加上X锁,则只允许T读取和修改A,其他事务都不能再对A加任何类型的锁,直到T释放A上的锁,它防止任何其他事务获取资源对象上的锁,直到事务的末尾将资源上的原始释放为止。能读能写 -
Question:继承问题
1.Thread可以被继承,用于创建新的线程
2.Number类可以被继承,Integer,Float,Double都继承自Number类
3.Double类声明为 public final class Doubleextends Number implements Comparable (不能被继承)
4.Math类的声明为public final class Math extends Object (不能被继承)
5.Class Loader 可以被继承,用户可以自定义类加载器 -
Java1.8中抽象类和接口:
抽象类:
1.抽象类中可以有构造方法
2.抽象类中可以存在普通属性,方法,静态属性和方法
3.抽象类中可以存在抽象方法
4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法
5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的
接口:
1.在接口中只有方法的声明,没有实现
2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上 public static final
3.在接口中的方法,永远都被public来修饰
4.接口中没有构造方法,也不能实例化接口的对象
5.接口中可以实现多继承
6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中接口方法,则定义类的为抽象类。。 -
Question:在视图上不能完成的操作是()
视图是从一个或者几个基本表导出的表,他与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放对应的数据,这些数据仍然放在原来的基本表中。基本表中的数据发胜变化,从视图中查询中的数据也随之变化。视图一经定义,就可以和基本表一样被查询,删除,也可以在一个视图之上定义新的视图,但对视图的修改(插入,删除,更新)操作则有一定的限制,所以不能在视图上定义基本表。。 -
Question 关于hashMap的特点:
1,hashMap的实例有两个参数影响其性能:‘初始容量’和‘加载因子’
2,hashMap的实现不是同步的,意味着它不是线程安全的
3,HashMap通过拉链法解决哈希冲突
4,hashMap的key-value都是存储在Entry数组中的。 -
Question 重写问题
class Car extends Vehicle
{
public static void main (String[] args)
{
new Car(). run();
}
private final void run()
{
System. out. println (“Car”);
}
}
class Vehicle
{
private final void run()
{
System. out. println(“Vehicle”);
}
}
首先final 声明的方法是不能被覆盖的,但在这里并不错误,因为方法是private,也就是子类没有继承父类的run方法,因此子 类的run方法与父类的run方法无关,并不是覆盖。
New car().run()也是调用子类的方法。。 -
Question:传输
使用ObjectOutputStream和ObjectInputStream可以将对象进行传输,声明为static和transient不能为串行化,因为static代表类的状态,transient代表对象的临时数据 -
Question:线程方法
1.start是启动线程对象,使之从新建状态进入就绪状态
2.Sleep 让线程休整一段时间,在此期间线程不再消耗cpu资源
3.Suspend使线程挂起,停止执行,如果想恢复线程,必须由其他线程调用resume方法。
4.Run 方法来执行线程中具体的内容。 -
Question:关于gc垃圾回收
1.垃圾回收在jvm中优先级相当相当低
2.垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但什么时候回收,回收那些,开发人不能控制
3.垃圾回收机制只是回收不再使用的JVM内存,如果程序拥有严重的bug,内存照样溢出
4.进入DEAD的线程,它还可以恢复,GC不会回收
5.File类可以存储文件属性,能够建立文件,能够获取目录信息,但是读写文件的话需要用数据流(OutputStream和InputStream) -
Question :forward和redirect
1.从地址栏显示来说,forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL响应的内容读取过来,然后把内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来的,所以他的地址栏还是原来的地址。Redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新请求这个地址,所以地址栏显示新的URL.
2.从数据共享角度说,forward转发页面和转发到的页面都可以共享request里面的数,
而外重定向不行。
3.从运用地方来说,forward一般用于用户登录跳转,根据角色定位到相应的模块,redirect则一般用于注销返回主页面和跳转到特定页面。
4.效率来说,f:高,r:低。。 -
JVM 内存可简单分为三个区:
1、堆区(heap):用于存放所有对象,是线程共享的(注:数组也属于对象)
2、栈区(stack):用于存放基本数据类型的数据和对象的引用,是线程私有的(分为:虚拟机栈和本地方法栈)
3、方法区(method):用于存放类信息、常量、静态变量、编译后的字节码等,是线程共享的(也被称为非堆,即 None-Heap)
Java 的垃圾回收器(GC)主要针对堆区 -
Question:Mysql的四种事务隔离级别:
1.读未提交,有两个事务,事务A和事务B,事务A里面更新了一条记录并提交,事务B可以读取到事务A未提交的数据,一般不用,如果事务B使用了事务A未更改的数据,并在此基础上做了运算,并改了数据库,如果事务A回滚,将会导致数据不一致性(存在脏读问题)
2.读已提交,这是很多数据库默认的事务隔离级别,但是不是mysql事务的默认隔离级别,这种隔离级别可以解决脏读问题,但是无法解决可重复读以及幻读问题,两个事务,事务A和事务B,事务A更新了某条记录并提交,事务B在事务A操作数据之前读过一次数据,在事务A更新该数据并提交后再读一次,读到的结果不一样(也称不可重复读)。
3.可重复读,有两个事务,事务A和事务B,事务A更新了某条记录并提交,事务B在事务A操作之前读取过一次数据,然后在事务A更新此数据后有读了一次,读到的结果是一样的,针对这种隔离级别,网上很多资料都说是幻读的现象。 其他数据库也可能如此,但是mysql的innodb存储引擎却通过多版本并发解决幻读这个问题,笔者在实际测试过程中,发现事务A插入或者删除数据,事务B仅仅是执行select操作,不执行insert,update等更改数据的操作,那么就不存在幻读的问题,。
4.串行读,最高的事务隔离级别,在实际生产中很少使用,因为这种隔离级别在高并发方面性能不足。 -
Question:实现一个你最熟悉的设计模式?
单例模式,确保一个类只有一个实例。
Public class Singletion{
Public static final Singletion singletion = new Singletion();
Private Singletion(){
}
Public static Singletion getsingletion(){
Return singleton
}
}
优点:避免实例的重复创建,比较节约内存。 -
Question: 以下声明合法的是
A default String s
B public final static native int w( )
C abstract double d
D abstract final double hyperbolicCosine( )
A,变量不能被default修饰
B native修饰方法,native修饰的方法简单来说就是:一个java方法调用了一个非Java代码的接口。定义Native方法时候,并不提供实现体,因为实现体是非java语言在外面实现的,native可以和任何修饰符连用,abstract除外,因为native暗示这个方法有实现体的,而abstract却显示指明这个方法没有实现体
C abstract修饰方法和类
D -
Question : 接口继承问题
1.子类的构造器 第一行默认都是super(),默认调用直接父类的无参构造,一旦直接父类没有无参构造,那么子类必须显试声明调用父类或者自己的哪一个构造器
2.接口只能继承接口,但是可以多继承,类都是单继承,但是继承有传递性
3.一个类一旦没有显试的定义任何函数,那么jvm会默认给你一个无参构造,无参构造第一行默认是super(); -
Question:Java器
Java用来运行一个.class文件
Javac.exe 是编译java文件
Java.exe是执行编译好的.class文件
Javadoc.exe是生成Java说明文档
Jdb.exe是Java调试器
Javaprof.exe是剖析工具。 -
Question:面向对象的五大原则
s( Single-Resposibility Principle ): 单一职责原则
o( Open-Closed principle ): 开放封闭原则
l( Liskov-Substituion Principle ): 里氏原则
i( Interface-Segregation Principle ): 接口隔离原则
d( Dependecy-Inversion Principle ): 依赖倒置原则
一个单词:立方体(solid),很好记!! -
Question:静态
非静态内部类:
1.可以访问外围类的非静态数据,包括私有数据
2.可以访问外围类的静态数据,包括私有数据
静态内部类
1.可以访问外部的静态数据,包括静态私有数据
2.不能访问外围的非静态数据 -
Question : 关于静态加载的问题
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println(“构造块”);
}
static
{
System.out.println(“静态块”);
}
public static void main(String[] args)
{
B t = new B();
}
}
并不是静态块最先初始化,而是静态域,而静态域包含静态变量,静态块,和静态方法,其中需要初始化的是静态变量和静态块,而他们两个初始化的顺序是靠他们两的位置决定的,所以初始化顺序是t1,t2 静态块。 -
Question:Java中的传递
简单来说,基本数据类型和String类型是值传递,对象和数组都是引用传递,值传递不改变原来的值,而引用传递直接改变,因此,本体的String中的str没有发生改变,而数组ch的第一位发生改变。