关于一些 java初级的问题

排序:
*、判断两个对象是否相等  是通过equals方法还是 “==”? 有什么区别?
“==”是看两个对象是否是同一个对象,也就是两个对象引用是否指向同一个对象
 equals()是比较两个对象的内容是否相等

1.mysql模糊查询怎么做?

SELECT * FROM user WHERE name LIKE ';_三_';
 只找出“唐三藏”这样name为三个字且中间一个字是“三”的;
SELECT * FROM user WHERE name LIKE ';%三%';
将会把name为“张三”,“三脚猫”,“唐三藏”等等有“三”的全找出来
SELECT * FROM user WHERE name LIKE ';[^张李王]三';
 将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
SELECT * FROM [user] WHERE u_name LIKE '[张李王]三'
将找出“张三”、“李三”、“王三”(而不是“张李王三”);


2.数据库悲观锁和乐观锁?
每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁
每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据

3.如果有用户反应页面加载太慢,排除程序运行中大量访问数据库的情况,怎么提高访问速度。
      1)、html页面  想办法做面纯静态页面
      2)、使用数据库缓存池(框架)技术    解决连接数据耗时的问题

4.如果有100元,a取走了50,b取走了20怎么保证最后余额是30元。
      java程序中就必须使用  同步  syn chro ni zed
      数据库中 必须 使用事务

5,socket是什么,有什么用,什么情况下使用。
      socket  网络套接字,用于网络编程, 客户端与服务器之间进行通信用的
     socket用来与外部设备通信用的,
      只要用于网络上传递、交互数据的都要用到socket编程

6,基础数据类型有哪些
   byte, char,short,int,long, float,double, boolean,enum 枚举

7,数据库怎么加锁
    1)、  select * from  表  for  update       共享锁(只能读,不能update)
     2)、  insert,update,delete  自动加锁(排它锁 [悲观锁])

8,什么情况下使用多线程?
     在一个方法中,会有多个子线程同一时间进行操作
       如:登录聊天、导出 excel报表、生成pdf文档、生成 图片信息,生成静态页面

9、反射,什么情况下使用
(当我们不确定要创建的实例 的目标类具体是哪个类,就需要动态的通过反射来来创建)。

这个动态调用的时候要用的,(在你不知道要调用什么方法的时候用的)
比如说我第一次 想调用方法1第二次想调方法2,难道你要写两个调用吗,如果有很多方法呢
       reflect    (在程序运行的过程中,对一个类进行实例化、赋值、取值等一系操作)

10、单例模式怎么写
  public class Singleton {  
      private Singleton instance = null;  
       static {  
       instance = new Singleton();  
      }  
      private Singleton (){}
      public static Singleton getInstance() {  
       return this.instance;
 
      }  
 }       
        
11、递归用过没,什么情况用了递归
      一个方法多次调用自己,需要使用递归
1)把一个问题转化为一个新的问题,而这个新的问题的解决方法仍与原问题的解法相同,只是所处理的对象有所不同,这些被处理的对象之间是有规律的递增或递减;
2)可以通过转化过程使问题得到解决
3)必定要有一个明确的结束递归的条件
12、用过hbulider没
   用过
13、用过mysql没,怎么实现分页
MySQL:select * from 表 limit 前几笔 后几笔;

sqlserver:select a.*
    from(
     select t.*,row_number()over(over by t.id)as x_id
     from temp_student t
    )a
    where a.x_id between 1 and 5;
14、用过oracle没,怎么实现分页
oracle: select a.id,a.name
    from(
     select t.*, rownum as x_id
     from temp_student t
     where rownum<=15
    )a
    where a.x_id>10
15.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

 Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。
 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。


16.JDK、JRE和JVM的区别是什么?
 
 1、jre是java的运行环境,jdk是java的工具包,jvm是能够执行java字节码的虚拟机,jdk包括jre和工具包,jre包括类库和jvm

17.接口和抽象类的区别是什么?
 
1)类可以实现很多个接口,但是只能继承一个抽象类
2)类如果要实现一个接口,它必须要实现接口声明的所有方法。类可以不实现抽象类声明的所有方法,
3)接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
4)抽象类可以在不提供接口方法实现的情况下实现接口。

Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。

18.什么是值传递和引用传递?

  对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。
对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。



19.创建线程有几种不同的方式?你喜欢哪一种?为什么?
  有三种方式可以用来创建线程:
?继承Thread类
?实现Runnable接口
?应用程序可以使用Executor框架来创建线程池
 实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下, 这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。



20、Java集合类框架的基本接口有哪些?
 
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。


21、什么是迭代器(Iterator)?
    Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的
迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。


22、Java中的HashMap的工作原理是什么?
    Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和  equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键 值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。

23、hashCode()和equals()方法的重要性体现在什么地方?
     Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的


24、HashMap和Hashtable有什么区别?
   
  HashMap允许键和值是null,而Hashtable不允许键或者值是null。
  Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
  HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举  ( Enumeration)。
   一般认为Hashtable是一个遗留的类。


25、Java中垃圾回收有什么目的?什么时候进行垃圾回收?
  垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。

25.throw和throws有什么区别?
   throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理,所以方法的调用者才能够确保处理可能发生的异常,多个异常是用逗号分隔的。    


26、final、finally代码块和finalize()方法有什么区别?

   finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收之前由Java虚拟机来调用的


27、Comparable和Comparator接口是干什么的?列出它们的区别
    java提供了只包含一个compareTo()方法的comparable接口,这个方法可以对两个对象排序,返回负数,0正数,代表小于大于等于
    java提供了一个compare()和equals()两个方法的comparator接口,compare()用来给两个对象排序,返回负数0正数,代表小于等于大于,equals()需要输入一个对象作为参数,用来决定输入的参数是否和comparator相等,只有输入参数也是comparator并且输入的参数和当前的comparator的排序结果相同,才返回true。

 

28、如何确保N个线程可以访问N个资源同时又不导致死锁?
指定获取锁的顺序,并强制线程按照指定的顺序获取锁。所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

 
29、数据库优化
    表分区,建立索引
 
30、项目中用到的设计模式、优化(要回答到很具体的点上)、算法等
 public class Singleton {  
      private Singleton instance = null;  
       static {  
       instance = new Singleton();  
      }  
      private Singleton (){}
      public static Singleton getInstance() {  
       return this.instance;
 
      }  
 }    
31、内连接 子查询 外连接  写一个案例出来
  内连接:select * from t_book,t_bookType where t_book.bookTypeId=t_bookType.id;
外联结左:select * from student left join course on student.ID=course.ID
      右:select * from student right join course on student.ID=course.ID
单行子查询:
        select ename,deptno,sal
        from emp
        where deptno=(select deptno from dept where loc='NEW YORK');

多行子查询:
        SELECT ename,job,sal
        FROM EMP
        WHERE deptno in ( SELECT deptno FROM dept WHERE dname LIKE 'A%');

多列子查询:
        SELECT deptno,ename,job,sal
        FROM EMP
        WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMP GROUP BY deptno);

32、union 和 union all 区别
     union all是直接连接,取到得是所有值,记录可能有重复   union 是取唯一值,记录不能重复

33、事务的特性和作用是什么
      
    原子性:事务是数据库的逻辑工作单位,他所做的对数据修改操作要么全部执行要么完全不执行            一致性:在一个事务执行之前和执行之后数据库都必须处于一致状态;
    分离性:并发的事务是相互隔离的;
    持久性:当系统或者介质发生故障时,确保已经提交的事务的更新不能丢失;

34、什么是死锁
      
多个程序占据对方所需资源,且都等待对方放弃,形成死锁;

35、数据库中的视图作
(1.简单性 2.安全性 3.逻辑独立性)
   1.简化了用户操作 2.可以使用户以不同的方式查询同一数据 3.对机密数据提供安全保护
36、序列化的几种方式(Serializable Externalizable)
二进制序列化,xml序列化

37、synchronized与Lock区别
  synchronized 自动解锁 lock 是手动
38、编写一个java 动态代理代码
1.新建委托类
public interface Operate {

    public void operateMethod1();

    public void operateMethod2();

    public void operateMethod3();
}

public class OperateImpl implements Operate {

    @Override
    public void operateMethod1() {
        System.out.println("Invoke operateMethod1");
        sleep(110);
    }

    @Override
    public void operateMethod2() {
        System.out.println("Invoke operateMethod2");
        sleep(120);
    }

    @Override
    public void operateMethod3() {
        System.out.println("Invoke operateMethod3");
        sleep(130);
    }

    private static void sleep(long millSeconds) {
        try {
            Thread.sleep(millSeconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
2. 实现 InvocationHandler 接口

public class TimingInvocationHandler implements InvocationHandler {

    private Object target;

    public TimingInvocationHandler() {}

    public TimingInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long start = System.currentTimeMillis();
        Object obj = method.invoke(target, args);
        System.out.println(method.getName() + " cost time is:" + (System.currentTimeMillis() - start));
        return obj;
    }
}
3. 通过 Proxy 类静态函数生成代理对象

public class Main {
    public static void main(String[] args) {
        // create proxy instance
        TimingInvocationHandler timingInvocationHandler = new TimingInvocationHandler(new OperateImpl());
        Operate operate = (Operate)(Proxy.newProxyInstance(Operate.class.getClassLoader(), new Class[] {Operate.class},
                timingInvocationHandler));

        // call method of proxy instance
        operate.operateMethod1();
        System.out.println();
        operate.operateMethod2();
        System.out.println();
        operate.operateMethod3();
    }
}


       
       
39、什么情况下使用存储过程
 如果代码太多,又要多次调用,就用存储过程./当对数据库进行复杂操作时
     如果需要返回多个值和不返回值,就使用存储过程;如果只需要返回一个值,就使用函数。
  2、存储过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值。
  3、可以再SQL内部调用函数来完成复杂的计算问题,但不能调用存储过程。

40、try{}时硕有一个return语句,那么紧跟在这个try后的finally{}里的code是否执行,什么时候被执行,在return前还是后?

41、请编写一个单例类,必须保证在实例化该类时使用同步锁
public class Singleton {  
      private Singleton instance = null;  
       static {  
       instance = new Singleton();  
      }  
      private Singleton (){}
      public static Singleton getInstance() {  
       return this.instance;
 
      }  
 }    

你可能感兴趣的:(关于一些 java初级的问题)