P1-JAVA

 

1. Java的跨平台原理:

    Java通过不同的系统、不同的版本、不同位数的java虚拟机(JVM)来屏蔽不同的系统指令集差异而对外提供统一的接口(Java API),对于我们java开发而言,只需要按照接口开发即可;如果我们系统需要部署到不同的环境时,只需要在系统上面安装对应版本的虚拟机即可!

2. 搭建一个java的开发环境:

  2.1适用于我们开发环境的JDK(配置JAVA_HOME环境变量)(JDK包括:JRE+java工具[编译器javac.exe、执行器java.exe]+java基础类库

  2.2对应开发环境的eclipse

  2.3(web应用)web服务器(Tomcat服务器)

  2.4版本控制器(SVN + Git)

3. Java的8种基本数据类型+对应的包装类型:

  为什么要使用包装类型?

  1.因为java是一门面向对象的语言,而基本数据类型不具备面向对象的特性);

  2.缓存值:对象缓存(Integer i = 1; Integer z = 1; // i==z true);

  

  

  

  

4. 自动装箱+自动拆箱(JDK1.5引入的特性)

  装箱:把基本的数据类型转换成对应的包装类型

  拆箱:把包装类型转换成对应的基本数据类型

package com.yikuan.test;

public class Test1 {
    public static void main(String[] args) {
        /**
         * 自动装箱
         * 在编译时实际上调用的是Integer的valueOf方法(Integer i = Integer.valueOf(1);)
         */
        Integer i = 1;
        /**
         * 自动拆箱
         * 在编译时实际上调用的是Integer的intValue方法((int j = i.intValue();))
         */
        int j = i;
        System.out.println(i);    //1
        System.out.println(j);    //1
    }
}

4. 面向对象:

  封装:把对象的属性封装成私有,对外提供set、get方法;

  抽象:把现实生活中的对象抽象为类;

  继承:遗产的继承;

  多态:所有子类型对象,都可以被当做一致的父类型来处理(向上转型、向下转型)

5. “==” 和 equals的区别:

  ==:是用来判断两个变量的值是否相等,变量可以分为基本数据类型和引用类型;

    如果是基本数据类型的变量就直接比较值,而引用类型需要比较对应的内存地址;

  equals:用来比较两个对象长的是否一样,判断两个对象的某些特征是否一样;

    对象一般做比较时,实际上就是调用对象的equals方法进行比较;

6. 解释String和StringBuilder、StringBuffer的区别:

  在java中,提供了3个类,String、StringBuilder、StringBuffer来表示和操作字符串,字符串就是多个字符的集合;

  String:是内容不可变的字符串; String a = new String("aaa");

       因为String底层使用了一个不可变的字符数组(private final char value[];);

  StringBuilder和StringBuffer是内容可以改变的字符串(可以使用append方法进行追加内容);

       StringBuilder和StringBuffer底层没有使用final修饰; ( char[] value;

  经典案例就是:拼接字符串(不能使用String进行拼接,要使用StringBuilder或者StringBuffer);

StringBuilder sb = new StringBuilder();
sb.append("a").append("b");

String c = "a"+"b";    //创建了很多的中间对象

  StringBuilder:线程不安全,效率较高;

 

  StringBuffer:线程安全,效率较低;

 7. Java中的集合有哪些:

  7.1)java中的集合分为值(value)和 key-value 两种格式;

  7.2)存储值的又分为List 和 Set,存储key-value的为Map;

  7.3)List 和 Set的区别:

      List是有序的,可以重复的;(常用的有ArrayList 和 LinkedList)

      Set是无序的,不可以重复的;

      重复与否:是根据equals 和 hashCode来判断的,也就是说如果一个对象要存储在Set里,必须重写equals 和 hashCode方法;

8. ArrayList 和 LinkedList的区别和使用场景:

  8.1)ArrayList 底层使用的是数组;LinkedList底层使用的是链表;

    数组的特点:因为具有索引,所以查询特定元素比较快;而插入、删除比较慢(因为数组在内存中是一块连续的内存,在插入和删除时需要移动内存);

    链表的特点:链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址,查询时需要从头部开始,一个一个的开始找索引,所以查询效率低

          而插入时不需要移动内存,只需改变引用指向即可,所以插入或者删除的效率高

    ArrayList 使用在查询比较多,插入和删除比较少的情况;

    LinkedList使用在查询比较少,插入和删除比较多的情况;

9. 解释HashMap和HashTable的区别:

  9.1 HashMap和HashTable他们都可以用来存储key-value的数据,但是他们也有区别;

  9.2 HashMap是可以把null作为key或者value的,而HashTable是不可以的;

  9.3 HashMap是线程不安全的,效率较高,而HashTable是线程安全的,效率较低;

  问题:即想线程安全,又想效率高?怎么解决?

    ConcurrentHashMap(jdk1.5后引入的):通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍;

 

10. 实现一个拷贝文件的工具类使用字节流还是字节流?

  10.1我们拷贝的文件不确定时,只包含字符流,有可能有字节流(拷贝图片、声音、图像等);为了考虑到通用性,要使用字节流;

11. 谈一下线程的几种实现方式?

  11.1继承Thread类实现;

  11.2通过实现Runable接口实现;

  优缺点:继承扩展性不强,java中只支持单继承,如果一个类继承Thread就不能继承其他的类了;

  11.3怎么启动?(启动线程使用start,而启动了以后执行的是run方法)

package com.yikuan.test;

public class MyThread{
    public static void main(String[] args) {
        Thread thread = new Thread(new TestThread());
     thread.setName("aaa"); thread.start(); Thread th
= new Thread(new TestThread2());
     thread.setName("bbb"); th.start(); } }
class TestThread extends Thread{ @Override public void run() { System.out.println("Thread-Demo"); } } class TestThread2 implements Runnable{ @Override public void run() { System.out.println("实现Runable接口"); } }

  11.4怎么区分线程?在一个系统中有很多线程,每个线程都会打印日志,我想区分是哪个线程打印的?

  设置一个线程名(“线程名称”);这是一种规范,在创建线程完成后都需要设置名称;

  11.5线程并发库?

  简单了解过;JDK1.5增加的,这一引进给java线程的管理和使用提供了强大的便利性;

  java.util.concurrent包中提供了对线程的优化、管理等各项操作,这个包提供了线程的运行,线程池的创建,线程生命周期的控制;

  java通过Executors提供了四个静态方法创建线程池; 

    可以缓存的线程池:newCacheThreadPool;

    创建一个定长的线程池,可控制线程最大并发数,超出的线程会在队列中等待;newFixedThreadPool;

    创建一个定长的线程池,支持定时及周期性任务执行,newScheduledThreadPool;

    创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO、LIFO、优先级)执行,newSingleThreadExecutor;

  线程池参数:

    corePoolSize:核心线程数

    queueCapacity:任务队列容量

    maxPoolSize:最大线程数

    keepAliveTime:线程空闲时间

    allowCoreThreadTimeout:允许核心线程超时

    rejectedExecutionHandler:任务拒绝处理器

    参数的默认值:   

    • corePoolSize=1
    • queueCapacity=Integer.MAX_VALUE
    • maxPoolSize=Integer.MAX_VALUE
    • keepAliveTime=60s
    • allowCoreThreadTimeout=false
    • rejectedExecutionHandler=AbortPolicy()

    线程池的执行顺序:

      1.当线程数小于核心线程数时,创建线程

      2.当线程数大于核心线程数时,且任务队列未满时,将任务放任务队列中

      3.当线程数大于核心线程数时,且任务队列已满时:

          3.1.若线程数小于最大线程数,创建线程

          3.2.若线程数等于最大线程数,抛出异常,拒绝任务

 

  线程池的作用:(连接池也是一样!)

    1.限定线程的个数,不会导致由于线程过多而系统运行缓慢或崩溃;

    2.线程池不需要每次都去创建或销毁,节约了资源,响应时间更快;

12. 讲一下什么是设计模式?常用的设计模式有哪些?

  12.1设计模式就是经过前人无数次的实践总结出的,在设计过程中可以反复使用的,可以解决特定问题的设计方法;

  12.2常用的设计模式:

    单例设计模式:

    三部曲:1.构造方法私有化,让除了自己类能创建外,其他地方都不能创建;

        2.在自己的类中创建一个单实例;

        3.提供一个方法获取该实例对象;

      饱汉模式:是一出来就创建单实例;

      饥汉模式:需要的时候才创建;创建时需要进行方法同步;

    工厂设计模式:

      Spring IOC(我们专门提供一个工厂,来创建某一个对象的实例,也就是说对象的创建交给一个工厂去创建)

    代理设计模式

      Spring AOP(动态代理)

    包装设计模式

  单例Demo:

package com.yikuan.test;
/**
 * 单例模式之---经典饱汉模式
 * @author Administrator
 *
 */
public class PersonFactory {

    //构造方法私有化
    private PersonFactory(){

    }
    //提供一个实例
    private static PersonFactory instance = new PersonFactory();

    //提供方法获取
    public static PersonFactory getInstance(){
        return instance;
    }

    public static void main(String[] args) {
        //获取实例就可以调用对应的方法
        PersonFactory.instance.toString();
    }
}
package com.yikuan.test;
/**
 * 单例模式之---经典饥汉模式
 * @author Administrator
 *
 */
public class PersonFactorys {
    //构造方法私有化
    private PersonFactorys() {
    
    }
    //提供一个实例
    private static PersonFactorys instance = null;

    //提供方法获取
    public synchronized static PersonFactorys getInstance(){
        if(instance == null){
            instance = new PersonFactorys();
        }
        return instance;
    }

    public static void main(String[] args) {
        //获取实例就可以调用对应的方法
        PersonFactorys.instance.toString();
    }
}

 

posted @ 2018-11-04 01:37  yikuandyk  阅读(322)  评论(0)    收藏  举报