文章目录
- String类为什么是final的
- Java 中方法的参数传递,是值传递 还是 引用传递?
- 解释单例模式,写一个单例模式
- 请你说说int和Integer的区别
- String/StringBuffer/StringBuilder 他们的区别
- 线程创建启动的方式都有哪些
- 说说多线程并发怎么处理
- 请说说ArrayList与LinkedList的区别
- Set 和List 的区别
- ArraysList 初始容量JDK1.6与JDK1.8有什么区别
- 请说说HashSet的实现原理
- 请说说你常用的集合框架
- 请说说Hashtable的实现原理
- 递归和循环有什么区别?
- Jdk1.8的新特性有哪些
- 事务的特性有哪些
- PreparedStatement和Statement的区别
- 使用连接池和不使用连接池的区别
String类为什么是final的
- 为了实现字符串池
- 为了线程安全
- 为了实现String可以创建HashCode不可变性
Java 中方法的参数传递,是值传递 还是 引用传递?
Java语言的方法调用只支持参数的值传递
- 基本类型的数据作为参数传递的是值
- 数组和集合类型数据传递的是地址值
- 对象类型的数据传递的是对象的地址值
解释单例模式,写一个单例模式
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例
请你说说int和Integer的区别
int属于基本数据类型,
Integer属于引用数据类型,
int的初始值是0,integer的初始值是null,
integer是int的包装类,属于面向对象思维编程,创建Integer需要使用new的方式为其进行内存分配
String/StringBuffer/StringBuilder 他们的区别
String是不可改变的对象。
每次改变其实都是创建了一个新的对象,然后将指针指向新的String对象,所以经常改变内容的字符串尽量不要用String,
因为每次都会生成新的对象,对系统性能有影响
StringBuffer是(线程安全的)可以改变的对象,一般来讲速度稍快于String对象。
StringBuilder是(线程不安全的)可改变的对象,提供与StringBuffer兼容的API,单线程推荐使用,速度比StringBuffer快
线程创建启动的方式都有哪些
三种:
- 继承Thread类
继承、重写run()、new MyThread().start(); - 实现Runnable接口
实现、重写run()、new Thread(t,”名字”).start();
3.使用Callable和Future创建线程
实现callable接口,重写call()方法
2、3优缺点:多线程共享同一个target对象,创建的多个线程可以共享线程类的实例变量。
实现callable接口,重写call()方法
说说多线程并发怎么处理
请说说ArrayList与LinkedList的区别
共性:
ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同。
区别:
List接口的实现方式不同
ArrayList实现了List接口,以数组的方式来实现的,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好。
LinkedList是采用链表的方式来实现List接口的,因此在进行insert和remove动作时效率要比ArrayList高。适合用来实现Stack(堆栈)与Queue(队列)。
Set 和List 的区别
set和list都是集合接口
简要说明
set --其中的值不允许重复,无序的数据结构
list --其中的值允许重复,因为其为有序的数据结构
ArraysList 初始容量JDK1.6与JDK1.8有什么区别
在jdk1.6中的确是为10,
然而在1.8中,如果只是new ArrayList() ,容量其实是0,
请说说HashSet的实现原理
HashSet概述:
HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素
HashSet的实现:
对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成
请说说你常用的集合框架
请说说Hashtable的实现原理
采用Entry数组+链表的方式实现
递归和循环有什么区别?
递归是函数体中调用自己,如果不加控制,将无休止的调用自己,直到堆栈溢出。
循环是反复执行某一段区域内的代码,如果不加控制,就会形成死循环。
所以不管是递归还是循环,都要设定一定的条件,以结束递归或循环。
实际问题中,有一些问题是递归的,这样的问题使用递归程序解决感觉会自然些,程序也会简单些,但是,递归要经常调用函数,开销(内存、时间)大,有些问题就不适宜使用,循环不需要调用自身,甚至可以不调用函数,效率高,不过,要将递归问题改成非递归,可能就要动动脑筋
Jdk1.8的新特性有哪些
- Lambda表达式
- 函数式接口
- 方法引用和构造器调用
- Stream API
- 接口中的默认方法和静态方法
- 新时间日期API
事务的特性有哪些
原子性(Atomicity):
操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
一致性(Consistency):
事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定
隔离性(Isolation):
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
持久性(Durability):当事务正确完成后,它对于数据的改变是永久性的。
PreparedStatement和Statement的区别
Statement执行不带参数的简单SQL语句,并返回它所生成结果的对象,每次执行SQL语句时,数据库都要编译该sql语句
PreparedStatement用来执行带参数的预编译的SQL语句
PreparedStatement的优点:
- 效率高
- 代码可读性和可维护性好
- 安全性好
使用连接池和不使用连接池的区别
在数据量很小的情况下,并且做好数据库连接的释放.是可以的.
为什么要用连接池:
访问数据库时,比较费时的就是建立一条稳定的连接.
也许你查询一次数据库花的时间是2ms,而建立一个数据库连接的时间是200ms.
使用数据库连接池的好处就是将连接缓存起来,用的时候直接拿,而不需要每次都重新连接.
一定程度上提高的效率.