zoukankan      html  css  js  c++  java
  • java基础

    简述JDK和JRE的区别?

    jdk是java开发人员在开发过程使用的软件开发包,他提供了java的开发环境运行环境(JRE),包含了java运行环境JRE,一堆java工具和java基础的类库.开发人员通过jdk将源码文件(java文件)编译成字节码文件(class文件)

    JRE是javaRuntime Enviroment是指java的运行环境,没有编译器和调试器,将class文件加载到内存准备运行.

    如果你只想跑java程序,只要安装jre就够了,如果要从事开发就得安装jdk

    简述path和pathclass的区别?

    path是系统变量,跟java无关,里面存放的是各种可执行的应用程序的路径.

    ClassPath是java使用的,从字面上来理解,就是类的路径,主要是模仿path,将类文件的路径配置到classpath中实现在系统的任何位置可以对类文件进行编译和执行.

    java的关键字中有没有goto?

    goto是java中的保留字不是关键字的一员

    "static"关键字是什么意思?java中是否可以覆盖(override)一个private或者是static的方法?

    "static"关键字表名一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问.

    java中static方法不能被覆盖,因为方法覆盖是基于运动时动态绑定的,而static方法是编译时静态绑定的.static方法跟类的任何实例都不相关,所以概念上不适用.

    java中的方法覆盖(overriding)和方法重载(overloding)是什么意思?

    java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况.与此相对,方法覆盖是说自类重新定义了父类的方法.方法覆盖必须有相同的方法名,参数列表和返回类型.覆盖者可能不会限制它所覆盖的方法的访问.

    Overload和Override的区别?

    方法重写Overriding和重载Overloading是java多态性的不同表现.重写Overriding是父类和自类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现,如果在自类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding),自类的对象使用这个方法时,将调用自类中的定义,对它而言,父类中的定义如同被"屏蔽"了.如果在一个类中定义了多个同名方法,他们或有不同的参数个数或有不同的参数类型.则称为方法的重载(Overloding).

    构造器是否可以被override?

    Constructor(构造器)不能被继承,所以不能被override(重写),但是可以被overloading(重载)

    接口和抽象类的区别是什么?

    java听过和支持创建抽象类和接口,他们的实现有共同点,

    抽象类是什么?

    被abstract修饰符修饰的Class即为抽象类

    特点:就是不能创建实例对象

    可以有抽象方法

    可以有构造方法,但是构造方法不能是抽象的.

    抽象方法必须子类进行实现,如果子类只实现部分方法,该子类必须是抽象的.

    接口是什么?

    被interface修饰符修饰的

    接口中的所有方法都必须是抽象的.

    接口中的方法定义默认为public abstract类型.

    接口中的成员变量类型默认为是public static final

    不同点在于:

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

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

    方法:抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法.

    修饰符: 抽象类中的抽象方法可以使用public和protected进行修饰,但接口中的方法只能使用public abstract修饰

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

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

    (jdk1.8以后,接口中可以有默认方法和静态方法,.)

    变量:抽象类中可以有普通成员变量,接口中只能包含常量

    接口中所有的方法隐含的都是抽象的.而抽象类则可以同时包含抽象和非抽象的方法.

    单继承多实现:  类可以实现很多接口,但是只能继承一个抽象类.

    类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成抽象的.

    抽象类可以在不提供接口方法实现的情况下实现接口.

    java接口中声明的变量默认都是final的,抽象类可以包含非final的变量

    java接口中的成员函数默认是public的,抽象类的成员函数可以是private.protected或者是public

    接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化,但是,如果它包含了main方法的话是可以被调用的.

    也可以参考jdk8中抽象类和接口的区别.

    接口是否可以继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(Concrete class)?

    接口可以是继承接口.抽象类可以实现(implements)接口,抽象类是可继承实体类,但前提是实体类必须有明确的构造函数.

    抽象类不能被实例化那它的构造器是用来干什么的?

    子类继承抽象类时,构造函数不会被覆盖.

    而且,在实例化子类对象时首先调用的是抽象类中的构造函数再调用子类中的.

    java 的基本数据类型跟引用数据类型分别有那些?

    java的基本数据类型有8个分别是整数型 byte short int long char 浮点型 float double 字符型char 布尔类型boolean

    char类型变量中能不能存储一个中文汉字?为什么?

    char类型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字.所以char型变量中当然可以存储汉字.

    简述&和&&的区别?

    &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都是true时,整个运算结果才为true,否则,只要有一方为false,则结果为false.

    &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式&黑可以用作位运算符.

    GC是什么?为什么要有GC?

    GC是垃圾收集的意思

    是指JVM用于释放那些不再使用的对象所占用的内存,垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存.java有GC,就不需要人工释放内存空间.

    在java中,对象什么时候可以被垃圾回收?

    一般情况下java中对象可被回收的前提是:该对象不再被引用.然后垃圾回收器在回收的时候便会把这个对象清理掉.

    java中会存在内存泄漏吗?

    会存在,内存泄露是指程序分配的堆内存未释放或者无法释放的现象.

    原因:长生命周期的对象持有短声明周期对象的引用.

    java中内存泄露的发生场景:全局的集合变量,不正确的单例模式的使用.

    java中内存泄露产生的原因可能有哪些?

    1.静态集合类引起的内存泄露

    2.当集合里面的对象属性被修改后,再调用remove()方法时不起作用.

    3.监听器

    4.各种连接

    5.内部类和外部模块的引用.

    6.单例模式

    可以再这个连接中具体查看详情:https://blog.csdn.net/c_royi/article/details/79527518

    java 中垃圾回收有什么目的?什么时候进行回收?

    垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源'

    如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

    不会,在下一个垃圾回收周期中,这个对象将是可被回收的.

    这里有详细的垃圾回收机制:https://www.cnblogs.com/xiaoxi/p/6486852.html

    可以将垃圾回收机制分为四种方法:标记清除,复制,标记整理,分代收集算法.

    讲一讲Java内存的堆(heep),栈(stack)和方法(method)?

    栈:调用方法时将在栈中开辟内存,称为入栈(压栈),栈内存存放基本数据类型值和引用数据类型的地址.栈内存中的数据,没有默认初始值,需要手动设置.方法调用完成后,栈内存立即释放,称为弹栈.

    堆:用于存放使用new创建的对象和数组,所有的对象都有内存地址值,数据都有默认初始化值,堆内存中的对象不再被引用时,jvm启动垃圾回收机制,自动清除.

    方法区:与java堆一样,是各个线程共享的内存区域,存储已被java虚拟机加载的类信息,常量,静态变量,以及编译器编译后的代码等.

    面向对象的基本特征?

    1.封装  有选择的隐藏和暴露一些数据和方法

    2.继承 自类可以直接实现父类中的方法,有选择的拓展

    3.多态  调用同一个方法展示出来不同的方式.

    4.抽象:   把共同的特性抽取到一个类中.

    什么是oop?

    oop就是(Object Oriented Programing)即面向对象编程.

    面向对象具有四大特性,分别是:

    1.抽象  将一些事务的共性抽离出来归为一个类.如对于动物,具有生命特征,活动能力等区别其他事物的共同特征.

    2封装  有选择的隐藏和暴露数据和方法

    3.继承 自类可以直接使用父类的部分数据和方法,,可以有选择的拓展.

    4.多态  同一类的对象调用相同方法可以表现出不同的行为比如动物实现了say()方法,猴子.马等动物重写了say()方法来表现不同的交流语言.

     java中实现多态的机制是什么?

    java中,靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法.

    java中有没有多继承?

    java的类是单继承的,即每个类只能继承一个类

    但是java中的接口支持多继承,即一个接口可以继承多个接口

    四类八种?及其取值范围?

    1.整型:byte(1个字节)、short(2个字节)、int(4个字节) 、long(8个字节)
    2.浮点型:float(4个字节)、double(8个字节)
    3.字符型:char(2个字节)
    4.布尔型:boolean(1个字节)
    byte的取值范围为-128~127(-2的7次方到2的7次方-1)
    short的取值范围为-32768~32767(-2的15次方到2的15次方-1)
    int的取值范围为(-2147483648~2147483647)(-2的31次方到2的31次方-1)
    long的取值范围为(-9223372036854774808~9223372036854774807)(-2的63次方到2的63次方-1)
    单精度:float 3.402823e+38 ~ 1.401298e-45
    双精度:double 1.797693e+308~ 4.9000000e-324
    char:0-65535

    Integer和int的区别?

    int是Java的数据类型之一,Integer是Java为int提供的封装类

    int的初始值为0,而integer的初始值为null

    数值提升是什么意思?

    数值提升是值数据从一个较小的数据类型转换为一个更大的数据类型.

    Byte,char,short值会被转化成int类型,需要的时候int类型也可以被提升为long类型,long和float则可能会被提升为double类型

    什么是隐式转换,什么是显式转换?

    隐式转换是自动类型强壮,数字表示范围小的数据类型可以自动转换成为范围大的数据类型.

    显式转换:就是强制类型转换,就是大范围的变量能够接收小范围的数据,福尔利转换为子类.

    如何将一个字符串变成int?

    Integer..parseInt()

    讲一下运算符  ++i.i++,+=?

    ++i  :先自增,后赋值

    i++ :先赋值,后自增

    += a+=b  ->>a=a+b

    super()和this()的区别?

    this表示对象本身,用来调用当前类的属性,方法,也可以调用从父类继承而来的未被重写.非私有的方法.

    super表示当前对象类的父类对象部分,用来调用父类里的属性方法.

    this和super用来调用构造器方法

    不同点:super()从子类中调用父类的构造器,this()在同一类内调用其他构造方法.

    相同点:super()和this()都必须在构造函数的第一行进行调用,否则就是错误.

    ==和equals方法究竟有什么区别?

    ==如果比较的是基本数据类型,比较的则是变量值.

    ==如果比较的为引用数据类型,比较的则是地址值.

    equals比较的是引用数据类型

    如果没有重写hashCode和equals方法,比较的是地址值,因为Object的equals方法中使用的是==

    如果重写的hashCode和equals方法,则比较的重写后的规则.

    例如:两个String字符串比较时:比较的是内容.因为String底层重写了equals方法进行内容的比较.

    字符串String s = "sfds55d676455dfg32434eertre";怎么样把非数字全部去除,只保留数字?

    正则(拓展,如:s.replaceAll(“[^0-9]“,”")),这样非数字就全部去除了,只保留数字了

    replace和replaceAll的区别?

    这两者有些人很容易搞混,因此我在这里详细讲述下。

    replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);

    replaceAll的参数是regex,即基于规则表达式的替换,比如:可以通过replaceAll("\d", "*")把一个字符串所有的数字字符都换成星号;

    相同点:都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串;

    不同点:replaceAll支持正则表达式,因此会对参数进行解析(两个参数均是),如replaceAll("\d", "*"),而replace则不会,replace("\d","*")就是替换"\d"的字符串,而不会解析为正则。

    另外还有一个不同点:“”在java中是一个转义字符,所以需要用两个代表一个。例如System.out.println( "\" ) ;只打印出一个""。但是“”也是正则表达式中的转义字符,需要用两个代表一个。所以:\\被java转换成\,\又被正则表达式转换成,因此用replaceAll替换“”为"\",就要用replaceAll("\\","\\\\"),而replace则replace("\","\\")。

    如果只想替换第一次出现的,可以使用replaceFirst(),这个方法也是基于规则表达式的替换,但与replaceAll()不同的是,只替换第一次出现的字符串

    String StringBuilder..StringBuffer的区别?

    String:String类被final修饰不能被继承,String内部char[]被final修饰,字符串内容无法被修改

    StringBuffer:可变字符串,效率低.线程安全

    StringBuilder:可变字符串序列,效率高,线程不安全.

    说一说你对权限修饰符的了解?

    java中4中修饰符分别为public、protect、default、private
    访问权限 类 包 子类 其他包
    public ∨ ∨ ∨ ∨
    protect ∨ ∨ ∨ ×
    default ∨ ∨ × ×
    private ∨ × × ×

    静态变量和成员变量的初始化时机?

    静态初始化只在Class独享首次被加载的时候进行一次.

    成员变量初始化,在new对象的时候被初始化,在构造函数的隐式三步其中一步进行初始化,初始化完成之后才会执行构造器中的代码

    static和final关键字?

    Static关键字为静态的

    1.用来修饰成员变量,静态变量所有对象共享.

    2.用来修饰成员方法,可通过"类名.方法名"的方式调用,常用于工具类

    3.静态代码块,在类被加载的hihi欧就会被执行的代码块.

    final关键字

    1.用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变.对于成员变量来讲,必须在声明时或者构造方法中对它赋值.

    2.修饰方法,表示该方法无法被重写.

    3.修饰类,表示该类无法被继承

    获取一个类的类对象那个有哪几种方式?

    1.通过全路径类名的字符串获取对象,class clazz=Class.forName("com.czxy.pojo.User")

    2.通过犬类名家.class获取对象,Class clazz=User.class

    3.通过对象来获得类对象 class class=new User().getClass();

    通过自类的实例获取父类的类独享

    User cn = new User();

    Class userClass = cn,getClass();

    Class subUserClass = userClass.getSuperclass();

    创建对象的有哪几种方式?

    1.使用new关键字

    2.使用反射创建对象

    3.使用Clone的方式创建:用clone方法创建对象并不会调用任何构造函数

    4.使用反序列化:反序列化时,JVM创建对象并不会调用任何构造函数

    克隆clone和new对象的区别?

    clone()不会调用构造方法lnew 会调用构造方法.

    new对象时根据类型确定分配内存空间的大小,clone是根据原对象分配内存

    为什么要克隆?如何实现clone?

    1.方便,克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前的对象的"状态"使用clone方式很方便

    2.速度快,clone方法最终将调用JVM中的原生方法完成复制也就是调用底层的c++代码,所以一般使用clone方法复制对象要比新建一个对象然后逐一进行元素复制效率要高.

    实现clone

    1.实现Cloneable接口并重写Object类中的Clone()

    2.实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,对象序列化后写入流中,再从流中读取,生成新的对象,新的对象和原对象之间也是完全互不影响的.

    当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可放回变化后的结果,那么这里到底是值传递还是引用传递?

    是值传递,java中只有值传递,没有引用传递概念

    列举5种常见的运行时异常?

    (1)java.lang.NullPointerException 【空指针异常】
    (2)java.lang.ClassNotFoundException 【类找不到异常】
    (3)java.lang.NumberFormatException 【数字格式化异常】
    (4)java.lang.IndexOutOfBoundsException 【数组角标越界异常】或 【数组索引越界异常】
    (5)java.lang.IllegalArgumentException 【非法参数异常】
    (6)java.lang.ClassCastException 【类型转换异常】
    (7)java.lang.NoClassDefFoundException 【类未定义异常】
    (8)SQLException 操作数据库异常 【SQL异常】
    (9)java.io.IOException 【IO异常】
    (10)java.lang.NoSuchMethodException 【没有匹配方法异常】

    error和Exception有什么区别?

    exception可以通过try..catch铺货,进行相应的处理,或者抛出由调用者处理

    error不可控制,无法处理

    运行时异常与checked检查型异常有何异同?

    checked检查型异常,又称为编译时异常,必须对异常进行处理(try   catch或者throw)

    运行时异常,不被检查型的异常,对异常可以处理,也可以不处理.

    自定义异常?

    自定义检查型异常类,继承Exception类

    自定义运行时异常类,继承RuntimeException类.

     final,finally,finalize的区别?

    final:修饰符

    如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承.

    如果将变量或者方法声明为final,可以保证它们在使用中不被改变.

    被声明的方法只能使用,不能重写

    finally异常处理机制的一部分

    finally结构使代码总会执行,而不管是否有异常

    使用finally常用于释放资源

    finalize:java中垃圾回收器执行的方法

    它是一个方法,属于java.lang.Object类

    在垃圾收集器执行的时候会调用的此方法,进行对象的回收,但在调用垃圾回收gc()后,并不能立即执行回收,JVM根据算法定时执行.

    实例化数组后,能不能改变数组的长度?

    不能,数组一旦实例化,他们的长度就是固定的.

    List   Set   Map的区别?

    List中的元素,有序,可重复,可为空

    set中的元素,无序,不可重复,只用一个空元素

    Map中的元素,无序,键不重,值可重复,可一个空键,一个空值.

    ArrayList和LinkedList有什么区别?

    ArrayList的底层是动态数组,LinkedList的底层是双向链表

    ArrayList默认初始大小为10,默认扩容大小为1.5倍,Linkedlist将元素添加到链表的末尾,无需扩容.

    ArrayList查询快,增删慢,LinkedList增删快,查询慢

    如何对list集合进行去重?

    1.借助于set集合

    2.利用List集合的Container方法进行循环遍历

    数组和链表分别适用于什么场景,为什么?

    数组:查询多,增删少,数组的特性

    链表:查询少,增删多,  链表的特性

    HashMap的底层结构?

    HashMap底层数据结构为数组+链表,在jdk1.8中当链表的长度超过8时,链表会转化为红黑树.

    hashMap如何存储数据?

    1.如果数组还没有初始化,就创建一个数组,默认长度是16,

    2.将hashMap中的key值取出来,转化成hash值,然后对数组的长度进行取余操作,然后放在数组对应的位置上

    3.如果这个链表为空,直接插入

    4.如果链表是红黑树,而且元素是红黑树,则直接插入到其中

    5.如果是链表,则遍历链表,如果有相同的数值,则进行替换,否则直接插入到尾部

    6.如果链表的长度大于等于8,则直接转换为红黑树.

    HashMap在1.7中和在1.8中的区别?

    在1.7的时候,没有红黑树,1.8中引入新特性当链表的长度大于8的时候,会转换为红黑树

    在1.7的时候,插入元素,直接插入到头部,而在1.8的时候,是在尾部进行插入的.

    扩容时候,在1.7的时候容易出现死循环,而1.8中就不会出现死循环.

    HashMpa和HashTable的区别?

    1.HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是经过synchronized修饰

    2.因为同步.hash特性等原因,HashMao的性能优于HashTable

    3.HashMap允许有null值,在HashTable不允许有null值

    4.HashMap默认初始化数组的大小为16,HashTable是11.前者扩容时乘2,使用位运算取得hash,效率高于取模.而后者为乘以2加1,都是素数和奇数没这样取模hash结果更加均匀.

    while循环和do循环有什么不同?

    while结构在循环的开始判断下一个迭代是否应该继续.

    do/while结构在循环的结尾来判断是否继续下一轮迭代,do结构至少会执行一次循环体.

    break和Continue?

    break:常用于循环中,含义:结束循环,跳出循环体

    其他应用场景:switch语句中,结束语句

    continue:

    结束本次循环,进行下一次循环:

    注意:如果循环进行到最后一次,continue执行,结束本次循环,继续进行循环逻辑判断结束循环,循环结束与continue无关.

    for循环和增强for哪一个遍历list集合更快,为什么?

    ArrayList使用普通for循环效率更高,因为对于数组结构的数据来说,for循环采用的是下标访问

    但是LinkedList是通过链表实现的,for循环时每次获取第i个元素都必须从头开始进行遍历,foreach是通过iterator实现的遍历,而iterator遍历就是从头开始遍历的,遍历完只需要一次,所以增强for效率更高.

    for和foreach循环效率差不多,for循环更加好一点,但是对于链表来说foreach的效率更高.

    java中有几种类型的流?分别是什么?

    读写操作,我们通常称为输入/输出(IO)操作,java通过流进行IO操作的

    字节流

      inputStream是所有字节输入流的祖先

      outputStream是所有字节输出流的祖先

    字符流:

      Reader是所有读取字符串输入流的祖先

      Writer是所有输出字符流的祖先

    字节高效流:BufferedOoutputStream BufferedInputStream

    字符高效流:BufferedWriter,BufferedReader

    转换流:OutputStreamWriter,InputStreamReader

    什么是java序列化,如何实现序列化?

    java的序列化

    吧对象转化为二进制数据流的过程

    实现:

    需要序列化的类实现Serializable接口

    序列化:把对象转换为字节序列的过程称为对象的序列化

    反序列化:把字节序列恢复为对象的过程称为反序列化

    1.把内存中的对象保存在一个文件中或者是数据库中

    2.网络上传送对象

    3.通过RMI传输对象

    好处:

    描述数据的传输格式,这样可以方便自己组织数据传输格式,以至于避免一些麻烦及错误

    2.如果是跨平台的序列化,则发送序列化后,接收方可以用任何其支持的平台反序列化成相应的版本,比如Java序列化后,用.net python等反序列化

    Transient关键字对序列化有影响么?

    有transient表示瞬态,被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化

    什么是线程?什么是多线程?

    在一个进程中,每个独立的功能都需要独立的去运行,这时又需要把当前这个进程划分为多个运行区域,,每个独立的小区域(小单元)称为线程.

    例如:360杀毒软件,同时既可以安全体检电脑又可以清理电脑中的垃圾,那么这里的安全体检是360杀毒软件中的一个线程,清理电脑中的垃圾也是一个线程

    一个进程如果只有一条执行任务,则称为单线程程序

    一个进程如果有多条执行任务,也就是说在一个进程中,同时开启多个线程,让多个线程同时去完成某些任务(功能).则称为多线程程序.

    实现多线程的方式?用那个更好?

    方式一:继承Thread,重写Thread类中的run方法

    方式二:实现Runable接口,实现run方法

    方式二更好,因为:

    避免了java单继承的局限性

    把线程代码和任务的代码分离,解耦合(解除线程代码和任务的代码模块之间的依赖关系)代码的拓展性非常好

    方式而可以更方便灵活的实现数据的共享

    什么是线程安全问题?

    多线程环境下,且数据共享,一个线程访问的共享数据被其他线程修改了,那么就会放生线程安全问题整个访问过程中,无一共享的数据被其他线程进行修改,就是线程安全

    如何解决线程安全问题?

    1.使用线程同步机制,使得在同一时间内只能有一个线程修改共享数据l

    2.消除共享数据:即多线程数据不共享或者共享的数据不进行修改

      使用局部变量,不适用成员变量

      如果使用成员变量,则不对成员变量进行修改

    什么是线程同步?

    当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作.其他线程才能对该内存地址进行操作,而其他线程处于等待状态.

    启动一个线程是用run()还是start()?

    启动线程使用的是start()方法

    当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着会立即运行,当cpu分配给它时间时,才开始执行run()方法.start()是方法,它调用run()方法,而run()方法是你必须重写的,run()方法中包含的是线程的主体.

    什么是死锁?死锁产生的原因有那些?

    死锁指两个或者两个以上的线程在执行过程中,因争夺资源产生的一种互相等待的状态.

    死锁产生的原因?

    1.系统资源的竞争

    通常系统中拥有的不可剥夺的资源,其数量不足以满足多个进程运行的需要,使得进行在运行过程中,会因为争夺资源而陷入僵局,如磁带盘,打印机等,只有对不可剥夺资源的竞争,才可能产生死锁,对可剥夺的资源的竞争不会产生死锁.

    2.进程推进顺序非法

    进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁,例如,并发进程P1.P2分别保持了资源R1.R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都会因为所需要的资源被占用而当值阻塞.._

    死锁产生的必要条件?如何解决死锁问题

    死锁产生的条件:

    产生死锁必须满足以下的四个条件,只要其中任一条件,死锁就不会发生.

    1.互斥条件:资源不能被共享,只能由一个进程使用

    2.请求与保持条件:进程已获得了一些资源,但因为请求其他资源被阻塞时,对已获得的资源保持不放.

    3,不可抢占条件:有些系统资源是不可抢占的,当某个进程已经获得了这种资源后,系统不能强行收回,只能由进程使用完时自己释放.

    4.循环等待条件:若干个进程形成了环形链,每个都占用对方申请的下一个资源.

    如何解决死锁?

    1.加锁顺序(线程按照一定的顺序加锁,只有获得了顺序上排在前面的锁后面,才能获取后面的锁)

    2.加锁时限(线程城市获取所得时候加上一定的时限,超过时限放弃对该锁的请求,并释放自己占有的锁)

    3.死锁检测(判断系统是否处于死锁状态)

    4.死锁避免(指进程在每次申请资源时判断这些操作是否安全的,例如银行家算法:在分配资源之前先看清楚,资源分配后是否会导致系统死锁.如果会死锁,则不分配,否则就进行分配)

    sleep和wait的区别?

    sleep()方法属于Thread类的,wait()方法属于Object类的

    sleep方法不会释放锁,而wait会释放锁

    wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

    sleep需要接收时间参数,wait不需要接收时间参数

    sleep可以自然醒,而wait只能等待别人唤醒

    notify和notifyAll?

    notify和notifyAll都可以唤醒处于等待的线程

    1.如果调用了线程wait()方法后,那么线程便会处于等待状态

    2.当调用notifyAll()后,将唤醒所有等待的线程

    3.当调用notify()方法后,将随机唤醒一个等待线程

    什么是锁机制?及其优缺点?

    有些业务逻辑在执行过程中国要求对数据进行排他性的访问,于是需要通过一些机制保证此过程中数据锁住不会被外界修改,这就是所谓的锁机制.

    优点:保证资源同步

    缺点:有等待肯定会慢

    乐观锁和悲观锁?

    悲观锁:总是假设最不好的情况.

    每次去拿数据的时候都认为别人会修改,所以每次在拿数据的受都会上锁.

    传统的关系型数据库里边就用到了很多这种锁机制,比如读锁,写锁等,都是在操作之前先上锁.

    乐观锁

    总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据

    乐观锁适用于写比较少的情况,即冲突真的很少发生,这样可以省去锁的开销,从而提高系统的吞吐量.

    悲观锁适用于写比较斌犯的情况,即常常产生冲突,上层引用会不断的进行尝试,这样反而降低了性能,所以使用锁比较合适.

    反射的原理及其应用?

    原理:反射在程序运行时,能够动态的操作类的成员

    反射的前提:通过字节码获得class对象

    反射的操作:通过Class对象对构造Constructor,字段field,方法method进行动态操作.

    反射的应用:框架底层都是用了反射.

    TCP和UDP的区别?

    1.TCP(面向连接如打电话需要先拨号建立连接),建立TCP连接需经过三次握手,释放TCP连接需经过四次挥手;

      UDP是无连接,即发送数据之前不需要建立连接

    2.TCP提供可靠的服务,也就是说,通过TCP连接传送数据,无差错,不丢失,不重复,且按序达到.

      UDP尽最大努力交付,即不保证可靠交付.

    3.TCP通过校验和重传控制,序号标识,滑动窗口,确认应答实现可靠传输.如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制.

     4.UDP具有较好的实时性,工作效率比TCP高,适用于对告诉传输和实时性有较高的通信或广播通信.

    5.每一条TCP连接只能是点对点,UDP支持一对一,一对多,多对一,和多对多的交互通信

    6.TCP对系统资源要求较多,DUO对系统资源要求较少.

    手写单例设计模式(懒汉式和饿汉式(基于双重检查锁))

    饿汉式单例设计模式

    public class Singleton{

     //私有构造方法

    private Singleton(){}

    //单例对象

    private volatile static Singleton instance = new Singleton();

    public static Singleton getInstance(){

    return instance;

    }

    }

    基于双重检查锁的懒汉式单例设计模式:

    public class Singlenton{

    //私有构造方法

    privateSingleton(){}

    //单例对象

    private volatile static Singleton instance = null;

    //静态工厂方法

    public static Singleton getInstance(){

         if(instance ==null){//双重锁检测机制

       synchronized(Singleton.class){  //同步锁

        if(instance == null){//双重锁检测机制

      instance = new  Singleton();  

           }

      }

      }

    return instance;

    }

    }

  • 相关阅读:
    14_部署LNMP环境、构建LNMP平台、地址重写
    13_搭建Nginx服务器、配置网页认证、基于域名的虚拟主机、ssl虚拟主机
    12_rsync+SSH同步
    11_DNS子域授权、分离解析、缓存DNS服务器
    10_自定义yum仓库、源码编译安装
    09_parted分区工具、交换分区、链路聚合
    08_简单MariaDB数据库的管理
    bzoj1396
    bzoj4154
    bzoj3489
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/10598001.html
Copyright © 2011-2022 走看看