美文网首页
java-基础

java-基础

作者: 隔壁丨王大爷 | 来源:发表于2018-09-19 12:41 被阅读48次

    为啥有时会出现4.0-3.6=0.40000001这种现象?

    float,double等精度丢失问题 - 铅笔 - 博客园

    String不可变

    String类被final修饰,不可继承

    string内部所有成员都设置为私有变量

    不存在value的setter

    并将value和offset设置为final。

    当传入可变数组value[]时,进行copy而不是直接将value[]复制给内部变量.

    获取value时不是直接返回对象引用,而是返回对象的copy.

    不可变类的设计方法

    1. 类添加final修饰符,保证类不被继承。

    2. 保证所有成员变量必须私有,并且加上final修饰

    3. 不提供改变成员变量的方法,包括setter

    4.通过构造器初始化所有成员,进行深拷贝(deep copy)

    5. 在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝

    JDBC流程,用什么跟数据库通信

    JDBC及操作数据库步骤 - CSDN博客

    反射的实现与作用

    反射的用途和实现 - CSDN博客

    伪共享

    Java中的伪共享(false sharing)以及应对方案 - CSDN博客

    abstract interface区别

    含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

    接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

    下面比较一下两者的语法区别:

    抽象类可以有构造方法,接口中不能有构造方法。   

    抽象类中可以有普通成员变量,接口中没有普通成员变量   

    抽象类中可以包含非抽象的普通方法,接口中的可以有非抽象方法,比如deaflut方  法 

    抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然

    eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

    抽象类中可以包含静态方法,接口中不能包含静态方法   

    抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。   

    一个类可以实现多个接口,但只能继承一个抽象类。

    有抽象方法一定是抽象类吗?抽象类一定有抽象方法吗?

    有抽象方法不一定是抽象类,也可能是接口。抽象类不一定有抽象方法,可以有非抽象的普通方法。

    Java的反射机制

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

    反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先知道运行对象是谁。

    super()和this()能不能同时使用

    不能同时使用,this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

    hashcode,equals,Object的这两个方法默认返回什么?描述了一下为什么重写equals方法必须重写hashcode方法

    默认的hashCode方法会利用对象的地址来计算hashcode值,不同对象的hashcode值是不一样的。

    可以看出Object类中的equals方法与“==”是等价的,也就是说判断对象的地址是否相等。Object类中的equals方法进行的是基于内存地址的比较。

    一般对于存放到Set集合或者Map中键值对的元素,需要按需要重写hashCode与equals方法,以保证唯一性。

    final

    final关键字可以用于成员变量、本地变量、方法以及类。   

    final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。   

    你不能够对final变量再次赋值。   

    本地变量必须在声明时赋值。   

    在匿名类中所有变量都必须是final变量。   

    final方法不能被重写。   

    final类不能被继承。   

    接口中声明的所有变量本身是final的。   

    final和abstract这两个关键字是反相关的,final类就不可能是abstract的。   

    final方法在编译阶段绑定,称为静态绑定(static binding)。   

    没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。   

    将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。   

    按照Java代码惯例,final变量就是常量,而且通常常量名要大写。

    String,StringBuffer,StringBuilder区别

    String内容不可变,StringBuffer和StringBuilder内容可变;   

    StringBuilder非线程安全(单线程使用),String与StringBuffer线程安全(多线程使用);   

    如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

    map、list、set的区别

    List:

    可以允许重复的对象。   

    可以插入多个null元素。   

    是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。   

    常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List中添加或删除元素的场合更为合适。 

    Set:

    不允许重复对象   

    无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator  或者 Comparable 维护了一个排序顺序。   

    只允许一个 null 元素   

    Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。 

    Map:

    Map不是collection的子接口或者实现类。Map是一个接口。   

    Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。   

    TreeMap 也通过 Comparator  或者 Comparable 维护了一个排序顺序。   

    Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。   

    Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)。

    Set如何保证不重复?

    HashSet中add()中调用了HashMap的put(),将一个key-value对放入HashMap中时,首先根据key的hashCode()返回值决定该Entry的存储位置,如果两个key的hash值相同,那么它们的存储位置相同。如果这个两个key的equals比较返回true。那么新添加的Entry的value会覆盖原来的Entry的value,key不会覆盖。因此,如果向HashSet中添加一个已经存在的元素,新添加的集合元素不会覆盖原来已有的集合元素。

    说一说对Java io的理解

    IO,其实意味着:数据不停地搬入搬出缓冲区而已(使用了缓冲区)。

    nio与bio的了解以及说一下区别

    BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

    NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

    死锁,死锁原因

      两个或者多个线程之间相互等待,导致线程都无法执行,叫做线程死锁。

      互斥条件:使用的资源是不能共享的。   

      不可抢占条件:线程持有一个资源并等待获取一个被其他线程持有的资源。   

      请求与保持条件:线程持有一个资源并等待获取一个被其他线程持有的资源。   

      循环等待条件:线程之间形成一种首尾相连的等待资源的关系。

    wait和sleep的区别

        wait和notify方法定义在Object类中,因此会被所有的类所继承。 这些方法都是final的,即它们都是不能被重写的,不能通过子类覆写去改变它们的行为。 而sleep方法是在Thread类中是由native修饰的,本地方法。 

    当线程调用了wait()方法时,它会释放掉对象的锁。

    另一个会导致线程暂停的方法:Thread.sleep(),它会导致线程睡眠指定的毫秒数,但线程在睡眠的过程中是不会释放掉对象的锁的。

        因为wait方法会释放锁,所以调用该方法时,当前的线程必须拥有当前对象的monitor,也即lock,就是锁。要确保调用wait()方法的时候拥有锁,即wait()方法的调用必须放在synchronized方法或synchronized块中。

    JDBC的反射,反射都是什么

    JDBC与反射 - justPassBy - 博客园

    相关文章

      网友评论

          本文标题:java-基础

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