Java面试题1

  1. 请写出mysql中inodb事务的特性(ACID)和事务隔离级别。

    事务是指单个逻辑工作单元的一系列操作,要么成功,要么失败,是数据库环境中最小工作单元。主要有4个特性(ACID):

    1)原子性:是指事务是不可分割的最小单元。

    2)一致性:是指一个事务执行之前和执行之后的数据总量保持一样。

    3)隔离性:是指事务之间互不打扰。

    4)持久性:是指一个事务一旦被提交,那么对数据库中数据的改变就是永久性的。

    如果事务没有隔离就会出现以下几个问题:

    1)脏读取:是指在一个事务处理过程中读取了另一个未提交事务中的数据。

    2)不可重复读:是指读取了前一事务提交的数据。

    3)幻读:事务非独立执行时发生的一种现象。

    隔离级别解决以上的问题:

    1)Serializable(串行化):可避免脏读、不可重复读、幻读的发生。

    2)Repeatable read(可重复读):可避免脏读、不可重复读的发生。

    3)Read committed(读已提交):可避免脏读的发生。

    4)Read uncommitted(读未提交):最低级别,任何情况都无法保证。

    注意:级别越高,效率越低

  2. Arraylist 与 LinkedList 区别?

    ArrayList与LinkedList都是单例集合的实现类,且线程都是非安全的,首先从几个方向比较不同:

    1)ArrayList的数据结构是动态数组,LinkedList的数据结构是双向链表。

    2)ArrayList的随机访问效率比较高,使用get和set的方法优于LinkedList。但增删的效率比较低。

    3)LinkedList的增删效率比较高,使用add和remove的方法优于ArrayList。但是随机访问的效率低。

  3. 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版本比较老,执行的效率也比较低。

  4. 说说 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是线程安全的。

  5. error和 exception的区别,CheckedException,RuntimeException的区别?

    Error是指Error类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。

    Exception是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生,分为RuntimeException(运行时异常)和CheckedException(编译异常)ArrayIndexOutOfBoundsException(数组下标越界)、NullPointerException(空指针异常)、ArithmeticException(算术异常)、MissingResourceException(丢失资源)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。而RuntimeException之外的异常我们统称为非运行时异常,也就是编译异常,类型上属于Exception类及其子类,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。

  6. 如何删除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()收集

  7. 数组有没有length()方法?String有没有length()方法?

    数组是没有length()这个方法的,有length这个属性,可以计算数组的长度,String是有length()这个方法的,用来计算字符串的长度。

  8. Collection和Collections的区别?(5分)

    1)Collection是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作。Collection接口时Set接口和List接口的父接口。

    2)Collections是一个集合框架的帮助类,里面包含一些对集合的排序,搜索以及序列化的操作。

  9. 请简述在Java中,关键字:throws、throw、try、catch、finally分别如何使用?

    异常的关键字有try,catch,finally,throw,throws .try:包裹可能抛出异常的代码块。 catch:捕获抛出的异常。 finally:在try或catch中抛出异常后,无论异常是否被捕获,都会执行finally中的代码块。 throw:手动抛出一个异常对象。 throws:声明方法可能会抛出的异常。

  10. 请写出java使用JDBC连接数据的代码(数据库驱动可以自选)

  11. /**
         * 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();
                }
            }
       }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值