java基础

作者: 冰西瓜大郎 | 来源:发表于2018-04-13 17:35 被阅读0次

    1.面向对象的特征
    答案:继承、多态、抽象、封装
    继承:子类可以继承父类,但是只能继承一个
    多态:重写(子类重写父类的方法),重载(同一个类中方法参数类型或者个数不一样)
    抽象:把事务抽象出来,数据抽象(类的属性),方法抽象(类的方法)
    封装:类,可以把属性、方法封装起来,允许可信的其他类调用;

    2.final, finally, finalize 的区别
    final可以修饰类(表示该类是最终类,不可被继承)、方法(表示该方法是最终方法,不可被重写,但是可以重载)、变量(表示该变量是最终变量,不可修改)
    finally用在try catch后面,最终要执行。即使try中return返回。
    finalize可以为任何一个类添加,主动回收内存,在垃圾回收前调用。finalize原理。

    3.int 和 Integer 有什么区别
    int属于基本类型,而Integer属于包装类型。java在编译Integer i5 = 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127)
    Integer i5 = 127;
    Integer i6 = 127;
    i5 == i6 return true;
    如果
    Integer i5 = 128;
    Integer i6 = 128;
    i5 == i6 return flase

    4.重载和重写的区别:
    重载是同一个类中,方法名相同,形参个数和类型不同的描述。
    重写(覆盖)是子类重写父类的方法(形参和返回值必须相同,子类必须重写父类的abstract方法,不能重写父类的final方法)

    5.抽象类和接口有什么区别
    抽象类是用abstract修饰的类,一定有抽象方法,可以有非抽象方法;抽象方法必须被子类实现;抽象类被子类继承
    接口是接口,所有方法都是抽象方法,被类实现。

    6.说说反射的用途及实现
    反射机制是指在JVM运行时,对于任何一个对象,都能动态知道它的类、属性和方法。应用:ide使用时,按点自动加载出方法,属性;还有各种框架比如spring,
    先在xml中配置好,等到需要使用时在加载。
    三种实现方式:
    对象的getClass()方法;
    forname()方法,Class.forName("全限定类名")
    Person.class 从类中获取。

    7.说说自定义注解的场景及实现
    各种框架Spring、springMVC等,验证属性完整性等
    实现:@interface xxx {},通过反射检测是否使用注解,getAnnottion

    8.HTTP 请求的 GET 与 POST 方式的区别
    http格式:请求行、请求头、空行、消息体
    状态行、响应头、空行、消息体
    GET产生一个数据包;POST产生两个数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

    9.session 与 cookie 区别
    session是一种上下文机制,作用于服务端,可以存在数据库、集群或者文件中。用户首次发起请求,服务端会产生一个SessionID,用来保存用户的登录信息。
    同时,cookie作用于客户端,用来跟踪用户的状态,分为浏览器cookie和文件cookie。用户再次请求时,服务端会检查cookie是否带有sessionid。
    cookie 存在本地文件中,可能不安全。而session是存在服务端的。

    10.说说session的分布式处理
    问题起因:现在的web-server都是分布式部署,nginx代理。如果第一个请求,分发到1号web-server上;客户端再次请求就不应定分发到1号服务器上,session保存就没有用。
    解决方案:
    1.session同步复制。(所有的web-server都赋值一份相同的,保存到各个服务器上。优点是简单。缺点显而易见,所有的web服务器都需要复制,占用带宽;而且数据量受内存限制)
    2.客户端存储法。客户端cookie
    3.反向代理hash一致性。(ip一致性,nginx将ip一致的请求发送到一个服务器上;七层:根据应用id来分发。)
    4.后端存储。数据库或者缓存。 web-server重启或者扩容都不会有session丢失,没有安全隐患。缺点:需要增加一次网络调用。

    11.HashMap的工作原理
    通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,
    HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,
    并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,
    如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。

    12.hashmap和hashtable的区别:(两者都是无序的)
    hashmap非线程安全,允许value为null
    hashtable是线程安全,不允许null
    单线程hashmap快。Synchronize

    13.ConcurrentHashMap:
    线程安全,hashtable升级。
    1.7版本,最小粒度是segment数组和hashentry,put、get要进行两次hashcode()计算。
    1.8版本,最小粒度是hashentry

    14.JDBC 流程
    第一步;加载Driver类,注册数据库驱动
    第二部:通过DriverManager,使用url,用户名和密码建立连接;
    第三步:通过connection,使用sql语句打开Statement对象
    传入参数,之所以这样是为了防止sql注入
    preparedStatement.setInt(1,18)
    第四步:执行语句,将结果返回resultset
    第五步:关闭连接

    15.MVC 设计思想
    Model View Controller

    16.equals 与 == 的区别
    基本数据类型使用== 比较的是他们的值;引用数据类型==比较的是他们的堆内存地址,因此比较引用数据类型的值需要用equals

    17.runnable和callable有什么区别?
    callable是1.5版本新增的,最大的区别是实现callable接口的线程能返回执行结果;而实现runnable接口的线程无法返回执行结果。call()方法能够允许抛出异常,而run()只能内部处理异常。

    集合:
    1.List 和 Set 区别:
    list允许重复元素,set不允许重复元素

    2.List 和 Map 区别
    list存放单个元素,map存放key-value键值对。hashmap、treemap,treemap有序。

    3.Arraylist 与 LinkedList 区别
    Arraylist 与 LinkedList 区别:
    Arraylist基于动态数组,LinkedList基于链表。
    一般来说,ArrayList的查找速度比LinkedList快,但是增加、删除元素LinkedList快。

    Arraylist和Vector区别:
    Arraylist和Vector都是基于数组的List,但是Vector是线程安全的,资源开销大。
    两者的区别还有:如果数组的大小不够,需要扩展的大小不一样。Arraylist是50%+1,Vector是扩展一倍。

    HashMap 和 Hashtable 的区别:
    两者都是基于哈希表来实现键值映射的工具类。
    hashtable是线程安全的。hashmap支持value为null,hashtable不行。
    hashmap扩容是2倍,hashtable

    HashSet 和 HashMap 区别:
    HashSet实现的set接口,HashMap实现map接口。一个存储对象,一个存储键值对。
    Set通过add添加元素,map使用put添加元素。

    4.HashMap 和 Hashtable 的区别
    Hashtbale是线程安全,而HashMap是非线程安全。HashMap支持null值,HashTable不支持。两个扩容方式不一样:Hashmap是直接括两倍,hashtable是2n+1

    5.HashSet 和 HashMap 区别
    HashMap存的是键值对,hashtable存的是对象,实现了set接口,是collection子集

    6.HashMap 和 ConcurrentHashMap 的区别
    ConcurrentHashMap是线程安全的,Hashmap非线程安全

    7.HashMap的实现原理:
    简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,
    也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。

    线程:
    1.创建线程的方式及实现
    实现Runnable接口(callable接口),或者继承Thread。

    1.什么是线程?
    线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。程序员可以通过它进行多处理器(并发)编程,也可以使用
    多线程对运算密集型任务提速,

    2.线程和进程有什么区别?
    线程是进程的子集,一个进程可以有多个线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。
    每个线程都有单独的栈内存在存储本地数据。

    3.如何java中实现线程?
    三种方式,分别是实现Runnable接口、Callable接口,或者集成Thread.

    4.用Runnable还是Thread?
    因为java不支持多继承,但是支持调用多个接口,因此建议使用Runnable接口。

    5.Java中Runnable和Callable有什么不同?
    Runnable没有返回值,不能抛出异常;Callable有返回值且能抛出异常。Callable是JDK1.5增加的。

    6.Java中CyclicBarrier和CountDownLatch有什么不同?
    两个都可以实现一组线程等待其他线程。但是CountDownLatch不能重新使用。

    7.java的内存模型是什么?
    java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性的行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的
    变动能被其他线程可见提供了保证,他们之间是先行发生关系,这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如:先行发生关系确保了:
    *线程内的代码能够按先后顺序执行,这被称为程序次序规则。
    *对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则;
    *前一个对volatile的写操作在后一个volatile的读操作之前。
    *一个线程内的任何操作必须在这个线程的start()调用之后,也要作线程启动规则。
    *一个线程内的任何操作都会在线程终止之前,线程终止规则。
    *一个对象的中介操作必须在这个对象构造完成之后,也叫对象终结规则。
    *可传递性;

    8.Java中的volatile变量是什么?
    是一个特殊的修饰符,只有成员变量才能使用它。在java并发程序缺少同步类的情况下,多线程对成员变量的操作对其他线程是透明的。volatile变量可以保证
    下一个读取操作会在前一个写操作之后发生。
    *保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
    *进制进行指令重排序。

    9.什么是线程安全?Vector是一个线程安全类吗?
    线程安全:如果一个代码会在多个线程中运行的,其结果与单个线程运行结果一致,且其他的变量的值也和预期的是一样的,就是线程安全。Vector是线程安全的集合。

    10.Java中什么是竞态条件? 举个例子说明。
    竞态条件会导致程序在并发情况下出现一些bugs。举例:两个线程对一个文件进行操作,如果文件a不存在,就创建一个新的;一个先判断不存在,创建;另一个也会这么多,就出现的文件的重复创建,覆盖。

    11.Java中如何停止一个线程?
    jdk1.0本来有stop、suspend等方法,但是由于潜在的死锁威胁因此被弃用。当线程执行完线程会自动结束,可以用volatile布尔值来中断线程。

    12.一个线程运行时发生异常会怎样?
    如果该异常被捕获或抛出,则线程继续运行;如果没有没有被捕获,线程将会停止。Tread.UncaughtExceptionHandler是用于处理未捕获一场造成
    线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候,JVM会使用Thread.getUncaughtExceptionHandle()来查询线程的UncaughtExceptionHandler,
    并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。

    13.如何在两个线程间共享数据?
    共享数据场景有两种:
    *卖火车票。
    解决方案:创建一个Runnable,这个Runnable里有共享数据。如果每个线程执行的代码相同,那么可以使用同一个runnable对象,这个runnable有那个共享数据,例如,卖票系统就是这么做的.
    *银行存钱问题。
    解决方案:如果每个线程执行的代码不同,那么要使用不同的runnable对象,有如下两种方式可以实现runnable对象间的数据共享
    实现两个runnable对象,将共享数据分别传递给两个不同线程.
    将这些Runnable对象作为一个内部类,将共享数据作为成员变量.

    http://www.cnblogs.com/dolphin0520/p/3958019.html

    MySQL 索引使用的注意事项
    ◆索引不会包含有NULL值的列
    只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
    ◆使用短索引
    对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
    ◆索引列排序
    MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
    ◆like语句操作
    一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
    ◆不要在列上进行运算
    select * from users where YEAR(adddate)<2007; 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
    select * from users where adddate<‘2007-01-01’;
    ◆不使用NOT IN和<>操作

    相关文章

      网友评论

        本文标题:java基础

        本文链接:https://www.haomeiwen.com/subject/jghhkftx.html