-
请写出mysql中inodb事务的特性(ACID)和事务隔离级别。
事务是指单个逻辑工作单元的一系列操作,要么成功,要么失败,是数据库环境中最小工作单元。主要有4个特性(ACID):
1)原子性:是指事务是不可分割的最小单元。
2)一致性:是指一个事务执行之前和执行之后的数据总量保持一样。
3)隔离性:是指事务之间互不打扰。
4)持久性:是指一个事务一旦被提交,那么对数据库中数据的改变就是永久性的。
如果事务没有隔离就会出现以下几个问题:
1)脏读取:是指在一个事务处理过程中读取了另一个未提交事务中的数据。
2)不可重复读:是指读取了前一事务提交的数据。
3)幻读:事务非独立执行时发生的一种现象。
隔离级别解决以上的问题:
1)Serializable(串行化):可避免脏读、不可重复读、幻读的发生。
2)Repeatable read(可重复读):可避免脏读、不可重复读的发生。
3)Read committed(读已提交):可避免脏读的发生。
4)Read uncommitted(读未提交):最低级别,任何情况都无法保证。
注意:级别越高,效率越低
-
Arraylist 与 LinkedList 区别?
ArrayList与LinkedList都是单例集合的实现类,且线程都是非安全的,首先从几个方向比较不同:
1)ArrayList的数据结构是动态数组,LinkedList的数据结构是双向链表。
2)ArrayList的随机访问效率比较高,使用get和set的方法优于LinkedList。但增删的效率比较低。
3)LinkedList的增删效率比较高,使用add和remove的方法优于ArrayList。但是随机访问的效率低。
-
ConcurrentHashMap 和 Hashtable 的区别
ConcurrentHashMap 和 Hashtable都是多例集合的实现类,且线程都是安全的。首先从几个方向比较:
1) 分段锁设计:ConcurrentHashMap 将数据分为多个段(Segment),每个段维护一个独立的 Hash表,每次操作只需要锁定一个段,相对于 HashTable 整个数据结构加锁来说,降低了锁的粒度,提高了并发度。
2)ConcurrentHashMap没有使用 synchronized 关键字,HashTable 使用 synchronized 关键字来保证线程安全,而ConcurrentHashMap 使用了 CAS 算法(compare and swap),这是一种乐观锁的策略,可以大幅提高并发访问效率。
3) ConcurrentHashMap 在实现迭代器时,不会将整个数据结构锁住,而只会锁住 一个小的段,这样可以在多线程并发迭代时,仍然能够保证效率。
4)ConcurrentHashMap 支持更高的并发度,也就是可以支持更多的线程同时操作, 而 HashTable 在多线程并发访问时,由于其整个数据结构都需要被锁定,所以并发度相对较低。
5)Hashtable版本比较老,执行的效率也比较低。
-
说说 List,Set,Map 三者的区别?
1)list,set,map都是集合的子接口,而List、Set是单例集合,继承Collection接口,Map是多例集合。
2)List特点:元素有放入顺序,元素可重复 ,主要的实现类有vector类,ArrayList类,LinkedList类。Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,主要的实现类有HashSet类,LikedHashSet类,TreeSet类。map是存放键值对的接口,主要的实现类有HashMap,TreeMap,hashtable。
3)Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
4)LinkedList、ArrayList、HashSet,HashMap是非线程安全的,Vector,HashTable,ConcurrentHashMap,CopyOnWriteArrayList是线程安全的。
-
error和 exception的区别,CheckedException,RuntimeException的区别?
Error是指Error类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
Exception是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生,分为RuntimeException(运行时异常)和CheckedException(编译异常)ArrayIndexOutOfBoundsException(数组下标越界)、NullPointerException(空指针异常)、ArithmeticException(算术异常)、MissingResourceException(丢失资源)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。而RuntimeException之外的异常我们统称为非运行时异常,也就是编译异常,类型上属于Exception类及其子类,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
-
如何删除list中的重复项,并不影响排序?(5分)
主要总结了5种方式:
1)利用TreeSet集合特性排序+去重:TreeSet可以将字符串类型的数据按照字典顺序进行排序,首字母相同则看第二位
2)借助Set的特性进行去重:由于Set的特性是无需且不可重复,我们利用这个特性进行两部操作 (1)把list放入set中 (2)把set还回list里
3)利用LinkedHashSet集合去重:LinkedHashSet虽然可以去重,但是根据他的特性,他不能对数据进行排序,只能维持原来插入时的秩序
4)使用list.contains()对全部元素进行判断
5)使用Java8特性去重:把list集合->Stream流,然后对流用distinct()去重,再用collect()收集
-
数组有没有length()方法?String有没有length()方法?
数组是没有length()这个方法的,有length这个属性,可以计算数组的长度,String是有length()这个方法的,用来计算字符串的长度。
-
Collection和Collections的区别?(5分)
1)Collection是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作。Collection接口时Set接口和List接口的父接口。
2)Collections是一个集合框架的帮助类,里面包含一些对集合的排序,搜索以及序列化的操作。
-
请简述在Java中,关键字:throws、throw、try、catch、finally分别如何使用?
异常的关键字有try,catch,finally,throw,throws .try:包裹可能抛出异常的代码块。 catch:捕获抛出的异常。 finally:在try或catch中抛出异常后,无论异常是否被捕获,都会执行finally中的代码块。 throw:手动抛出一个异常对象。 throws:声明方法可能会抛出的异常。
-
请写出java使用JDBC连接数据的代码(数据库驱动可以自选)
-
/** * 1、加载驱动 * 2、连接数据库DriverManager * 3、获得执行sql的对象preparedStatement<----防止sql注入 * 4、获得返回的结果集 * 5、释放连接 */ Connection connection; @Before public void connection() throws ClassNotFoundException, SQLException { // 加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 连接数据库 connection = DriverManager.getConnection("jdbc:mysql:///java42", "root", "123456"); } @Test public void selectAll() throws SQLException { // 执行sql语句 PreparedStatement preparedStatement = connection.prepareStatement("select * from customer"); ResultSet resultSet = preparedStatement.executeQuery(); ArrayList<Customer> customers = new ArrayList<>(); while (resultSet.next()){ int id = resultSet.getInt("id"); String pname = resultSet.getString("name"); String sex = resultSet.getString("sex"); int age = resultSet.getInt("age"); String email = resultSet.getString("email"); Customer customer = new Customer(); customer.setAge(age); customer.setSex(sex); customer.setName(pname); customer.setEmail(email); customer.setId(id); customers.add(customer); } System.out.println(customers); } @After public void release(){ if(resultSet != null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement != null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }