zoukankan      html  css  js  c++  java
  • Java相关

    一、继承

    1、子类拥有父类非 private 的属性、方法。

    2、子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

    3、子类可以用自己的方式实现父类的方法。

    4、Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。

    5、提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

    二、多态

    提高了程序的可扩展性,但是不能使用子类特有的功能。

    1、多态的前提:有继承关系、有方法重写、有父类引用指向子类对象

    2、当父类引用指向子类对象的时候,用该对象调用的成员变量必须是父类中含有的,而且执行会打印输出父类的成员变量的值。

    当父类引用指向子类对象的时候,用该对象调用的成员方法必须是父类中含有的,而执行的时候,如果子类也有这个成员方法,那么执行的是子类的成员方法。如果子类中没有,那么执行的还是父类的成员方法。

    如果该成员方法只有子类有,而父类没有,在调用该方法后编译会直接报错,无法执行。

    成员变量和成员方法的访问不一样?

    因为成员方法有重写,而成员变量没有。

    三、重写与重载

    1、方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。

    2、方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。

    3、方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

    四、静态方法和实例方法

    静态方法会在程序运行的时候直接装载进入方法区。而实例方法会在new的时候以对象的方法装载进入堆中。
    最大的区别在于内存的区别,由于main函数为static静态方法,会直接在运行的时候装载进入内存区,实例方法必须new,在堆中创建内存区域。再进行引用。

    五、守护线程和非守护线程

    Java虚拟机有两种线程,守护线程和非守护线程。

    垃圾收集任务的线程,属于守护线程。Java可以将创建的任何线程定义为守护线程

    main为非守护线程,当虚拟机中的所有非守护线程终止的时候,虚拟机实例将会自动退出。

    六、设计模式

    1、单例模式

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    使用场景:

     1、要求生产唯一序列号。

    2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

    3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

    优点:

     1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

    2、避免对资源的多重占用(比如写文件操作)。

    缺点:

    没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

    public class Singleton {
    	private Singleton(){}
    	private static Singleton singleton = new Singleton();
    	public static Singleton getInstance(){
    		return singleton;
    	}
    
    }
    

    2、工厂模式

    在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

    意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

    主要解决:主要解决接口选择的问题。

    何时使用:我们明确地计划不同条件下创建不同实例时。

    如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

    关键代码:创建过程在其子类执行。

    3、抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    主要解决:主要解决接口选择的问题。

    何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

    如何解决:在一个产品族里面,定义多个产品。

    关键代码:在一个工厂里聚合多个同类产品。

    4、观察者模式

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

    意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

    何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

    如何解决:使用面向对象技术,可以将这种依赖关系弱化。

    关键代码:在抽象类里有一个 ArrayList 存放观察者们。

    七、HashMap

    1、HashMap 的数据结构

    哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 8 时,链表转换为红黑树。

    2、HashMap 的工作原理

    存储对象时,使用put() 方法:

    1、调用 hash(K) 方法计算 K 的 hash 值,然后结合数组长度,计算得数组下标;

    2、调整数组大小(当容器中的元素个数大于 capacity * loadfactor 时,容器会进行扩容resize 为 2n);

    3、如果 K 的 hash 值在 HashMap 中不存在,则执行插入,若存在,则发生碰撞;

    • 如果 K 的 hash 值在 HashMap 中存在,且它们两者 equals 返回 true,则更新键值对;
    • 如果 K 的 hash 值在 HashMap 中存在,且它们两者 equals 返回 false,则插入链表的尾部(尾插法)或者红黑树中(树的添加方式)。

    获取对象时,使用get() 方法:

    1、调用 hash(K) 方法(计算 K 的 hash 值)从而获取该键值所在链表的数组下标;

    2、顺序遍历链表,equals()方法查找相同 Node 链表中 K 值对应的 V 值。

    3、HashMap、LinkedHashMap、TreeMap 的区别及使用场景

    LinkedHashMap 保存了记录的插入顺序,在用 Iterator 遍历时,先取到的记录肯定是先插入的;遍历比 HashMap 慢;

    TreeMap 实现 SortMap 接口,能够把它保存的记录根据键排序(默认按键值升序排序,也可以指定排序的比较器)

    HashMap:在 Map 中插入、删除和定位元素时;

    TreeMap:在需要按自然顺序或自定义顺序遍历键的情况下;

    LinkedHashMap:在需要输出的顺序和输入的顺序相同的情况下。

    4、HashMap 和 HashTable 的区别

    1、HashMap 是线程不安全的,HashTable 是线程安全的;

    2、由于线程安全,所以 HashTable 的效率比不上 HashMap;

    3、HashMap最多只允许一条记录的键为null,允许多条记录的值为null,而 HashTable不允许;

    4、HashMap 默认初始化数组的大小为16,HashTable 为 11,前者扩容时,扩大两倍,后者扩大两倍+1;

    5、HashMap 需要重新计算 hash 值,而 HashTable 直接使用对象的 hashCode

    5、当两个对象的hashcode相同会发生什么,如何获取对象

    答:因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用链表存储对象,这个Entry会存储在链表中。

    当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,找到bucket位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。

    6、如果HashMap的大小超过了负载因子(load factor)定义的容量,如何处理

    默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。

    八、String,StringBuffer与StringBuilder的区别

    String:String的值是不可变的,每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。

    StringBuffer:可变字符序列,线程安全,执行速度慢。

    StringBuilder:可变字符序列,线程不安全,执行速度快。

    九、Arraylist和Linkedlist

    ArrayList是一个数组列表,其内部是使用一个数组来存放对象的。ArrayList只能在数组末尾添加数据。

    ArrayList扩容机制:

    在第一个添加元素时,创建一个长度为10的数组,之后随着元素的增加,以1.5倍原数组的长度创建一个新数组,即10, 15, 22, 33,。。这样序列建立,将原来的元素拷贝到新数组之中,如果数组长度达到上限,则会以MAX_ARRAY_SIZE 或者 Integer.MAX_VALUE作为最大长度,而多余的元素就会被舍弃掉。

    LinkedList可以看做为一个双向链表。LinkList可以很方便在链表头或者链表尾插入数据,或者在指定结点前后插入数据。

    对于数据频繁出入的情况下,并且要求操作要足够灵活,建议使用LinkedList;对于数组变动不大,主要是用来查询的情况下,可以使用ArrayList。

  • 相关阅读:
    201671010109 《java程序联系》第十六周感想
    201671010109 《 java 程序设计》第十五周感想
    201671010109 《java程序设计》第十四周感想
    201671010109 《java程序设计》第十三周感想
    201671010109 《java程序设计》第十二周感想
    201671010109 《java程序设计》第十一周感想
    201671010109 2016-2017-2《java程序设计》第十周学习心得
    201671010109 2016-2017《java课程》第五周学习感想
    201971010109 2061-2017《java程序设计》第四周学习感想
    201671010107 2016-2017-2 《Java程序设计》总结
  • 原文地址:https://www.cnblogs.com/kingshine007/p/11588376.html
Copyright © 2011-2022 走看看