java面试问题

1.equals与==的区别:

a.==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同

2.Hashcode的作用,与 equal 有什么区别

a.同样用于鉴定2个对象是否相等的,java集合中有 list 和 set 两类,其中 set不允许元素重复实现,那个这个不允许重复实现的方法,如果用 equal 去比较的话,如果存在1000个元素,你 new 一个新的元素出来,需要去调用1000次 equal 去逐个和他们比较是否是同一个对象,这样会大大降低效率。hashcode实际上是返回对象的存储地址,如果这个位置上没有元素,就把元素直接存储在上面,如果这个位置上已经存在元素,这个时候才去调用equal方法与新元素进行比较,相同的话就不存了,散列到其他地址上

3.接口和抽象类的区别

a.一个类只能继承单个类,但是可以实现多个接口
b.接口强调特定功能的实现,而抽象类强调所属关系
c.抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象的

4.用什么方法解析XML最好、

a.DOM:消耗内存:先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机不够牛逼,可能手机直接死机

5.wait和sleep的区别

a.sleep是继承thread而wait是object的

b.sleep是不会释放锁的,是暂时让线程进入休眠状态,wait释放锁

6.java中堆和栈的区别和内存机制

a.基本数据类型比变量和对象的引用都是在栈分配的
b.堆内存用来存放由new创建的对象和数组
c.类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中
d.实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置”,实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存
e.局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

7.java垃圾回收的是那些

a.一些没有被引用的对象

8.java中的集合有多少种它们的区别是什么

a.首先可以分为list set map

List:
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。ArrayList,LinkedList是不同步的,而Vestor是同步的。
ArrayList是List的子类,允许存放重复元素,有序。集合中元素被访问的顺序取决于集合的类型。如果对 ArrayList进行访问,迭代器将从索引0开始,每迭代一次,索引值加1(查询快)
LinkedList是一种可以在任何位置进行高效地插入和删除操作的有序序列。允许null元素,LinkedList使用双向链表实现存储(增删改快)
VectorVector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差(安全,性能差)
Set:
HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方法,所以没有顺序。这里所说的没有顺序是指:元素插入的顺序与输出的顺序不一致。不是同步的,集合元素可以是null,但只能放入一个null
TreeSet:有序,
LinkedHashSet:当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
Map:
TreeMap:有序
Hashtable:单向链的二维数组,value不能为空,线程安全的,所有方法均用synchronized修饰
与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空(安全慢)
HashMap:可以放入空值,按插入的顺序存储,线程不安全,最多只允许一条记录的键为Null;允 许多条记录的值为 Null;
LinkedHashMap:存了记录的插入顺序,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应 用。

hashtable:初始化长多是11  每次的扩容是2n+1

hashmap:初始长度是16 每次扩容是16*0.75*2 

影响Hashmap效率:初始化容量 负载系数

ConcurrentHashMap:线程安全的,用于替代HashTable,采用分段加锁的方式实现,提升了效率
9.什么是redis
Redis  是一个基于内存的高性能key-value 数据库
10.redis支持的数据类型有那些
Redis通过Key-Value的单值不同类型来区分, 以下是支持的类型:
Strings
Lists
Sets 求交集、并集
Sorted Set 
hashes

11. redis相比memcached有哪些优势?

a. memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

b. redis的速度比memcached快很多

c. redis可以持久化其数据

12. redis常见性能问题和解决方案:

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

13.

堆栈空间

堆栈的特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。

队列:什么是队列?又该怎么理解呢?

①队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

②队列中没有元素时,称为空队列。

③建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。

④队列采用的FIFO(first in first out),新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素,释放一个元素。所谓的动态创建,动态释放。因而也不存在溢出等问题。由于链表由结构体间接而成,遍历也方便。(先进先出)

堆、栈区别总结:

1.堆栈空间分配

 ①栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

 ②堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

2.堆栈缓存方式

①栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

②堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

3.堆栈数据结构区别

①堆(数据结构):堆可以被看成是一棵树,如:堆排序。

②栈(数据结构):一种先进后出的数据结构。

14. spring事物

Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:
    获取连接 Connection con = DriverManager.getConnection()
    开启事务con.setAutoCommit(true/false);
    执行CRUD
    提交事务/回滚事务 con.commit() / con.rollback();
    关闭连接 conn.close();
使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成。 那么Spring是如何在我们书写的 CRUD 之前和之后开启事务和关闭事务的     呢?解决这个问题,也就可以从整体上理解Spring的事务管理实现原理了。下面简单地介绍下,注解方式为例子
    配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。
    spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配     置    注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。

15.数据库事务

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

16.怎么配置spring事务

    1.传统的jdbc DataSource是安全的但是每个请求都要打开一个连接,连接不是安全的一般的数据源由容器进行管理,包括连接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等这些J2EE商业容器都提供了这个功能。

 Spring声明式事务处理也主要使用了IoC,AOP思想,提供了TransactionInterceptor拦截器和常用的代理类TransactionProxyFactoryBean,可以直接对组件进行事务代理。

17.设计模式

单例模式的特点:1.只能有一个实例 2.单例类必须自己创建自己唯一的实例 3.单例类必须给所有其他对象提供这一实例。

代理模式:
  代理模式的三种角色:
抽象角色(声明真实对象和代理对象的共同接口)
  代理角色(代理角色中提供与真实对象相同的接口以便在任何时候可都能代理真实对象,同时附加其他操作,相当于真实对象进行封装) 
  真实角色:代理角色所代表的真对象,是我们最终要引用的对象
  好处:就是对外部提供统一的接口方法而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用的情况下,进行系统扩展。
工厂模式: 
  主要解决:接口选择的问题
  如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
  优点:如果想创建对象,只要知道名字即可;扩展性高,如果想要增加一种产品,只需扩展一个工厂类即可;不关心其内部的具体实现,只关心接口的作用即可 
  缺点:每次增加一个工厂类,需要增加个具体类和对象实现工厂,当时的系统中类的个数成倍增加,在一定层都上增加了系统的复杂度,同时也增加了系统具体类的依赖。
观察者模式:
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

18.sleep()和wait()的区别
1.sleep()不会释放锁,wait()释放锁
2.sleep()是thread的,wait()是Object的

3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

4.sleep需要捕获异常wait不需要

19.tomcat集群冲突有什么影响


1    集群冲突的话就只能运行一个tomcat而不能运行多个tomcat,所以要改端口号,不让集群有冲突!

2  DNS轮询 当集群中某台服务器停止之后,用户由于dns缓存的缘故,便无法访问服务,必须等到dns解析更新,或者这台服务器重新启动。还有就是必须把集群中的所有服务端口暴露给外界,没有用apache做前置代理的方式安全,并且占用大量公网IP地址,而且tomcat还要负责处理静态网页资源,影响效率

3  R-proxy(反向代理)当其中一台tomcat停止运行的时候,apache仍然会转发请求过去,导致502网关错误。但是只要服务器再启动就不存在这个问题。

4   mod_jk 当停止掉的tomcat服务器再次启动的时候,Apache检测不到,仍然不会转发请求过去

20.spring的实现原理
1   Spring内部最核心的就是IOC了,动态注入,让一个对象的创建不用再new,可以自动的生产,这其实利用了java的反射,反射其实就是在运行时动态的去创建,调用对象,Spring就是在运行时,跟XML Spring的配置文件来动态创建对象和调用对象里的方法。

2   Spring还有一个核心就是AOP,这个是面向切面编程,可以为某一对象进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块扩充的功能,这些都是通过配置类达到的

3   Spring目的:就是让对象与对象之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置,内部通过反射去动态组装对象)

21.数据库拆表原则

1.能不分就不分

2.数据量太大,正常的运维影响正常业务访问

3.表设计不合理,需要对某些字段垂直拆分

4.某些数据表出现了无穷增长

5.安全性和可用性的考虑

6.业务耦合性考虑

18.Spring Cloud

        (1).Spring Cloud是什么

       它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署

       (2).SpringCloud的优缺点

                1.耦合度低,不会影响其他的模块开发

                2.可以并行开发

                3.配置简单基本上都是基于注释

                4.语言方便

                5.每个服务都可以有自己独立的数据库当然也可以共用

                6.暴露接口组件进行调用

        缺点:

                部署比较麻烦

                数据处理麻烦 可能是多库

                集成测试麻烦

SpringBoot和SpringCloud的区别

        springboot专注于单体应用的开发

        SpringCloud 是全局的微服务协调整理的,将一个个单体整合起来.

        SpringCloud为各个微服务之间提供了配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务

        SpringBoot可以离开SpringCloud,SpringCloud离不开SpringBoot

Ribbon  

是在客户端进行实现的通过discoveryClient  从注册中心读取到目标服务信息,对同一接口进行的%获取目标集群的索引,返回目标服务的信息.

Nginx 

 是在服务器实现的

upstream设置 Zuul 服务集群通过 location 拦截请求并转发到 upstream ,默认使用轮询机制对Zuul 集群发送请求。

@LoadBalanced注解的作用

        开启客户端的负载均衡

Hystrix

        断路器状态:打开状态. 半打开状态. 关闭状态

        如果是网路问题,发生等待后续又有很多的请求过来. 就会造成雪崩了...

        降级 熔断  隔离 监控

        降级:调用失败就返回一个空的方法

        熔断:调用接口失败就会进入提前定义好的熔断方法.返回错误信息

        隔离:隔离服务之间相互影响

        监控: 服务成功会把成功的秒数和数据进行记录下来

        

设计模式:

        单例模式:某个类只有一个类提供一个全局的站点进行访问

        简单工厂:一个类根据传递进来的参数进行决定创建一个什么类型的产品实例

        工厂方法:定义一个创建对象的接口,让子类决定实例哪个类

        抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。

        建造者模式:封装一个复杂的对象构建过程,并按照步骤进行构造

        原型模式:通过复制现有的对象来创建新的.

        适配器模式:将一个类的方法接口转换成客户希望的另外一个接口

        装饰模式:动态的给对象添加新的功能

        代理模式:为其他对象提供一个代理以便控制这个对象的访问

        策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换

        观察者模式:对象间的一对多的依赖关系

         

   
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值