zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    Linux的SSH(Secure Shell Protocol)服务
    Linux开机自动挂载文件fstab介绍
    Linux之NFS网络文件系统
    深入理解sudo
    Linux定时任务(crond)
    Linux之Vim编辑器的使用
    三大文本处理工具grep、sed及awk
    jquery实现自定义弹出框
    oarcle12c打开本地数据库
    使用POI将doc文件转换为html
  • 原文地址:https://www.cnblogs.com/yikuan-919/p/9902921.html
Copyright © 2011-2022 走看看