1.什么是线程局部变量?
线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险
2.Java 中 ++ 操作符是线程安全的吗?
不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
3.a = a + b 与 a += b 的区别
+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。如果加法操作的结果比 a 的最大值要大,则 a+b 会出现编译错误,但是a += b 没问题。
4.3*0.1 == 0.3 将会返回什么?true 还是 false?
false,因为有些浮点数不能完全精确的表示出来
5.int 和 Integer 哪个会占用更多的内存?
Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。
6.为什么 Java 中的 String 是不可变的(Immutable)?
在Java中,String底层不可变的原因是因为在String类的实现中,使用了字符数组(char array)来存储字符串内容,并且在创建String对象时将字符数组声明为final,从而保证了字符串内容的不可修改性。
7.我们能在 Switch 中使用 String 吗?
从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法
糖。内部实现在 switch 中使用字符串的 hash code。
7. 64 位 JVM 中,int 的长度是多数?
无论何时都是32位或者4个字节
8.怎么获取 Java 程序使用的内存?堆使用的百分比?
可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory()方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。
9.Java 中堆和栈有什么区别?
JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。
10.“a==b”和”a.equals(b)”有什么区别?
如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。
11.final、finalize 和 finally 的不同之处?
final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该
变量的值在初始化后不能被改变。finalize 方法是在对象被回收之前调用的方法,
给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。finally
是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,
无论在 try 块中是否有发生异常。
12.poll() 方法和 remove() 方法的区别?
poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会报异常。
13.Java中的LinkedList是单向链表还是双向链表?
双向链表
14.Java中,编写多线程程序的时候你会遵循哪些最佳实践?
a)给线程命名,这样可以帮助调试。
b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步。
c)如果可以,更偏向于使用volatile而不是synchronized。
d)使用更高层次的并发工具,而不是使用wait()和notify()来实现线程间通信,如BlockingQueue,CountDownLatch及Semeaphore。
e)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。
15.说出5个JDK1.8引入的新特性?
- Lambda表达式,允许像对象一样传递匿名函数
- StreamAPI,充分利用现代多核CPU,可以写出很简洁的代码
- Date与TimeAPI,最终,有一个稳定、简单的日期和时间库可供你使用
- 扩展方法,现在,接口中可以有静态、默认方法。
- 重复注解,现在你可以将相同的注解在同一类型上使用多次。
16.列举 IoC 的一些好处(依赖注入)
Spring 中的 IoC 的实现原理就是工厂模式加反射机制。
- 它将最小化应用程序中的代码量。
- 它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或 JNDI 查找机制。
- 它以最小的影响和最少的侵入机制促进松耦合。
- 它支持即时的实例化和延迟加载服务
17.什么是 spring bean?
- 它们是构成用户应用程序主干的对象。
- Bean 由 Spring IoC 容器管理。
- 它们由 Spring IoC 容器实例化,配置,装配和管理。
- Bean 是基于用户提供给容器的配置元数据创建。
18.spring bean 容器的生命周期是什么样的?
1、Spring 容器根据配置中的 bean 定义中实例化 bean。2、Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。3、如果 bean 实现BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用setBeanName()。4、如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。5、如果存在与 bean 关联的任何
BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法。6、如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调用它。7、最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调
用 postProcessAfterInitialization() 方法。8、如果 bean 实现DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。9、如果为bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。
19.什么是 Aspect?
aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中。
20.Spring Boot 有哪些优点
1.减少开发,测试时间和努力。
2、使用 JavaConfig 有助于避免使用 XML。
3、避免大量的 Maven 导入和各种版本冲突。
4、提供意见发展方法。
5、通过提供默认值快速开始开发。
6、没有单独的 Web 服务器需要。这意味着你不再需要启动 Tomcat,Glassfish或其他任何东西。
7、需要更少的配置 因为没有 web.xml 文件。只需添加用@ Configuration 注释的类,然后添加用@Bean 注释的方法,Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired 添加到 bean 方法中,以使 Spring 自动装
入需要的依赖关系中。
8、基于环境的配置 使用这些属性,您可以将您正在使用的环境传递到应用程序:-Dspring.profiles.active = {enviornment}。在加载主应用程序属性文件后,Spring 将在(application{environment} .properties)中加载后续的应用程序属性文件。
21.使用 Spring Cloud 有什么优势?
使用 Spring Boot 开发分布式微服务时,我们面临以下问题
1、与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,
安全问题。
2、服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉
及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
3、冗余-分布式系统中的冗余问题。
4、负载平衡 --负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机
集群,网络链路,中央处理单元,或磁盘驱动器的分布。
5、性能-问题 由于各种运营开销导致的性能问题。
6、部署复杂性-Devops 技能的要求
22.负载平衡的意义什么?
在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程