Java常用基础知识(二)

1、Sql中truncate,delete以及drop的区别
truncate:删除所有表数据,不删除表结构;
delete:可根据条件删除表数据
drop:删除表的结构、被依赖的约束(constrain)、触发器(trigger)、索引(index);


2、限制获取结果的条数:
mysql:SQL结尾加上limit n(n代表条数)
oracle:SQL结尾加上WHERE ROWNUM <= n(n代表条数)


3、请阐述spring IOC思想。
控制反转。简而言之就是将对象实例交给容器统一进行管理。


4、Statement 和 PreparedStatement之间的关系和区别?
关系:PreparedStatement继承自Statement,都是接口
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高


5、写一段JDBC连接数据库的代码,CONNECTION最后要关闭。

    // 1、加载驱动        
        Class.forName("com.mysql.jdbc.Driver");

        // 2、创建数据库连接对象
        String url = "jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);

        // 3、创建数据库命令执行对象
        PreparedStatement psPreparedStatement = conn.prepareStatement("select * from t_user");
        // Statement stmtStatement=conn.createStatement();

        // 4、执行数据库命令
        ResultSet rSet = psPreparedStatement.executeQuery();
        //ResultSet rs=stmtStatement.executeQuery("select * from t_user");
        //5、处理执行结果
        while(rSet.next()){
            int id=rSet.getInt("id");
            String usernameString=rSet.getString("username");
            String passwordString=rSet.getString("password");
        }

            rSet.close();
            psPreparedStatement.close();
            conn.close();
    }

6、简述下反射机制:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。


7、JSP的9个内置对象,写出其中的四个
1、request对象
2、response对象
3、session对象
4、application对象(application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。)


8、编程题:写个文件复制

 public static void copyFileByStream(File source, File dest) throws IOException {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(source);
            os = new FileOutputStream(dest);
            byte[] buffer = new byte[1024];
            int length ;
            while ((length = is.read(buffer)) > 0){
                os.write(buffer, 0, length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            is.close();
            os.close();
        }
    }

9、子查询中的in和exsists什么时候使用?
EXISTS检查是否有结果,判断是否有记录,返回的是一个布尔型(TRUE/FALSE)。
IN是对结果值进行比较,判断一个字段是否存在于几个值的范围中。理论上EXISTS 比 IN 快
但是还是要具体场景。凡事无绝对哈


10、请写出每种基本类型的默认值?取值范围?分别给出一个定义的例子。
默认值 取值范围
字节型 : 0 -2^7—-2^7-1

字符型 : ’ \u0000’ 0—-2^16-1

short : 0 -2^15—-2^15-1

int : 0 -2^31—-2^31-1

long : 0 -2^63—-2^63-1

float : 0.0f -2^31—-2^31-1

double : 0.0d -2^63—-2^63-1

boolean: false true\false

Tables 默认值 取值范围
byte 0 -2^7—-2^7-1
char ’ \u0000’ 0—-2^16-1
short 0 -2^15—-2^15-1
int 0 -2^31—-2^31-1
long 0 -2^63—-2^63-1
float 0.0f -2^31—-2^31-1
double 0.0d -2^63—-2^63-1
boolean false true、false

11、static关键字是什么意思?Java中是否可以覆盖(override)一个static的方法?

static关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。


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


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


14、Java中的HashMap的工作原理是什么?
Java中的HashMap是以键值对(key-value)的形式存储元素的。是一个无序且线程不安全的容器。
当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。


15、数组(Array)和列表(ArrayList)有什么区别?
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的,即不需要定义初始大小。


16、ArrayList和LinkedList有什么区别?
ArrayList和LinkedList都实现了List接口;
ArrayList底层为数组(有序),而LinkedList底层是双向链表(无序),但是其添加删除元素时不需要重新计算大小和更新索引,所以操作速度更快。
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。


17、什么是Java优先级队列(Priority Queue)?
PriorityQueue是一个基于优先级堆的无界队列,它的元素默认是按照自然顺序(队列头最小)排序的。也可以在创建的时候传入比较器(Comparator)指定排序。
其不是线程安全的并且无法将null入队。
附上比较器的实现:

    //匿名Comparator实现
    //返回结果 >0(c1>c2)、  =0(c1=c2)、  <0(c1<c2)
    public static Comparator<Customer> idComparator = new Comparator<Customer>(){

        @Override
        public int compare(Customer c1, Customer c2) {
            return (int) (c1.getId() - c2.getId());
        }
    };

18、异常处理完成以后,Exception对象会发生什么变化?

Exception对象会在下一个垃圾回收过程中被回收掉。


19、解释下Servlet的生命周期。
对每一个客户端的请求,Servlet调用它的init()方法,完成Servlet的初始化。
然后,Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求。
最后,调用Servlet的destroy()方法把Servlet销毁。


20、HTTP响应的结构是怎么样的?
状态码(Status Code)、HTTP头部(HTTP Header)、主体(Body)


21、Thread类中的start()和run()方法有什么区别?
当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。


22、wait()与sleep()的区别
sleep()来自Thread类,和wait()来自Object类.调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait方法线程会释放对象锁。
sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒.而wait()需要配合notify()或者notifyAll()使用。


23、为什么要使用线程池
避免频繁地创建和销毁线程,达到线程对象的重用。另外,使用线程池还可以根据项目灵活地控制并发的数目。


24、什么时候需要加volatile关键字?它能保证线程安全吗?
volatile不是保护线程安全的。
volatile关键字用在多线程同步中,可保证读取的可见性,JVM只是保证从主内存加载到线程工作内存的值是最新的读取值,而非 cache 中。


25、 如果⼀个接⼝有2个不同的实现, 那么怎么来Autowire⼀个指定的实现?
通过定义(beanname)对象名或者


26、Spring的声明式事务 @Transaction注解⼀般写在什么位置? 抛出了异常 会自动回滚吗?有没有办法控制不触发回滚?
一般写在业务层的方法上。默认情况下抛出uncheck异常才会回滚。 可以通过rollbackFornoRollbackFor配置具体的异常类型是否回滚。


27、SpringBoot没有放到web容器⾥为什么能跑HTTP服务?
其内部已经有嵌入式的tomcat服务器。


28、springmvc和struts2的区别
Struts2 的核心是基于一个Filter即StrutsPreparedAndExcuteFilter
SpringMvc的核心是基于一个Servlet即DispatcherServlet(前端控制器)。
Struts2是类级别上的拦截,一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文。
而且Struts过滤后是去Struts配置文件中找Action,而SpringMVC过滤后是去controller中找对应于@RequestMapping注解的url绑定的方法。


29、怎样拦截SpringMVC的异常,然后做自定义的处理?
利用@ControllerAdvice做统一异常处理器处理。


30、如何获取spring IOC容器。
通过实现‘ApplicationContextAware’接口,并实现其setApplicationContext()方法,就可在容器初始化完成后获取到spring IOC容器。


31、Class.forName(String className)这个方法的作用
答:通过类的全名获得该类的类对象


32、Java 中的 final关键字有哪些用法?
(1)修饰类:表示该类不能被继承;
(2)修饰方法:表示方法不能被重写;
(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。


33、【0.6332 】的数据类型是float还是double?
默认为 double型,如果为 float型需要加上f显示说明,即 0.6332f


34、用最有效率的方法算出 2 乘以 8 等於几?
2 << 3,因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位即可,而位运算 cpu 直接支持的,效率最高,所以,2 乘以 8 等於几的最效率的方法是 2 << 3 。


35、是否可以继承 String 类?
String 类是 final 类,不可以被继承。


36、String s=new String(“xyz”);创建了几个字符串对象?
答:两个对象,一个是静态存储区的"xyz",一个是用new创建在堆上的对象。


37、什么是 Java 序列化,如何实现 Java 序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。


38、List、Map、Set 三个接口存储元素时各有什么特点?
答:
1)List是有序的 Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素,这类似于 Java 的数组。
2)Set是一种不包含重复的元素的 Collection,即任意的两个元素 e1 和 e2 都有e1.equals(e2)=false,Set 最多有一个 null 元素。
3)Map接口 :请注意,Map 没有继承 Collection 接口,Map 提供 key 到 value 的映射


39、XML 包括哪些解释技术,区别是什么?
包括:DOM(Document Object Modal)文档对象模型,SAX(Simple API for XML)。
DOM 是一次性将整个文档读入内存操作,如果是文档比较小,读入内存,可以极大提高操作的速度,但如果文档比较大,那么这个就吃力了。所以此时 SAX 应用而生,它不是一次性的将整个文档读入内存,这对于处理大型文档就比较就力了


40、同步方法和同步代码块的区别是什么?
在 Java 语言中,每一个对象有一把锁。线程可以使用 synchronized 关键字来获取对象上的锁。
方法和代码块加锁的区别在于粒度不同。


41、什么是线程池(thread pool)?
答:在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。


42、 JDBC 中如何进行事务处理?
答:Connection 提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用 commit()显式提交事务;如果在事务处理过程中发生异常则通过 rollback() 进行事务回滚。除此之外,较新的 JDBC 标准还引入了Savepoint(保存点)的概念,允许事务回滚到指定的保存点。


43、 事务的 ACID 是指什么?
答:
1)原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
2)一致性(Consistent):事务结束后系统状态是一致的;
3)隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
4)持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。


44、 Java中如何实现代理机制(JDK、CGLIB)
JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口。
CGLIB动态代理:代理类是目标类的子类, 用到MethodInterceptor接口


45、 synchronized和Lock的区别

主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。Lock的锁定是通过代码实现的,而synchronized是在JVM层面上实现的,synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。Lock锁的范围有局限性,块范围,而synchronized可以锁住块、对象、类。


46、什么叫守护线程,用什么方法实现守护线程
守护线程是为其他线程的运行提供服务的线程。(如GC)
setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为守护模式,false为用户模式。


47、IO和NIO区别
IO是面向流的,NIO是面向缓冲区的。
IO的各种流是阻塞的,NIO是非阻塞模式。
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。


48、Hibernate的session有两个这样的方法“update”和“save”,他们区别在那里?
Hibernate的对象有三种状态,分别是:瞬时态(transient)、持久态(persistent)、游离态(detached)
瞬时态的实例可以通过调用save()、persist()或者saveOrUpdate()方法变成持久态
游离态的实例可以通过调用 update()、saveOrUpdate()、lock()或者replicate()方法变成持久态
save()和update()方法的区别在于前者是将瞬时态对象变成持久态,后者是将游离态对象变成持久态
merge()方法可以完成save()和update()方法的功能,它的意图是将新的状态合并到已有的持久化对象上或创建新的持久化对象。


49、”static” 关键字是什么意思?Java 中是否可以覆盖(override) 一个 private 或者是 static 的方法?
static 关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java 中 static 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态绑定的。


50、加载的含义:
通常,加载发生在创建类的第一个对象时,但访问static域或static方法时,也会发生加载。static的东西只会初始化一次。
加载过程:加载一个类的时候,首先去加载父类的静态域,然后再加载自身的静态域,之后去初始化父类的成员变量,后加载父类的构造方法,最后初始化自身的成员变量,后加载自身的构造方法。(先初始化成员变量,后加载构造函数的原因是,构造函数中可能要用到这些成员变量)


51、for和foreach循环效率:
for可以不逐个遍历,如每隔一个遍历;也可以从前向后遍历,从后向前遍历;有条件判断,使用已知次数的循环遍历;
foreach只能逐个遍历;只能从前向后遍历;没有执行条件限制,不能向迭代变量赋值;适合集合的遍历;


52、递归
就是方法调用自身,对于递归来说,一定有一个出口,让递归结束,只有这样才能保证不出现死循环。


52、OOP的原则有:
单一职责:一个类只做它该做的事(高内聚);
开放封闭:对扩展开放,对修改关闭;
里氏替换:任何时候都可用子类型替换父类型;
依赖倒置:面向接口编程(抽象类型可被任何一个子类所替代);
合成聚和复用:优先使用聚合或合成关系复用代码;
接口隔离:一个接口只应描述一种能力,接口应该是高内聚的(小而专一);
迪米特法则:最少知识原则,一个对象应对其他对象尽可能少的了解。


猜你喜欢

转载自blog.csdn.net/qq_33404395/article/details/81486594