java小记

来源:互联网 发布:广西大学网络教育 编辑:程序博客网 时间:2024/05/29 08:28
1  面向对象的特征
   1 封装 继承 多态
    封装:1.将不需要对外提供的内容都隐藏起来;
 2.把属性都隐藏起来,提供公共方法对其访问;
    继承: 1.父类是具有共同特征的一些方法或属性,我们单独把它拿出来放入一个类;
  2.继承是越子类越具体,越父类越共性;
  3.可以实现代码重用;
    多态:父类的引用指向了的子类对象;
          方法上的多态:方法重载


2  override与overload
    1  override 重写  父类与子类之间   1 方法名  参数 返回类型一致 
                                       2 修饰符权限大于或等于父类:不能小于- 如:如果子类使用private 多态使用时就无法调用到方法
      3 异常小于等于父类
    2  overload  重载  同类方法之间    1 方法名 一致 ,参数顺序或者是类型,个数不一致 ,不能通过返回值不同来实现重载
   
3  抽象类与接口
    1 抽象类可以实现方法,接口不能有实现方法
    2 接口可以实现多个,抽象类单继承
    3 抽象类可以有构造方法,接口不能有
    4 接口中的变量都是publi static final
  共同点:1 它们都不能 new 


4  string与stringbuffter StringBuilder
   1 String 是 final类,为了安全  不可变的 ,静态分配内存,字符串拼接会开辟一块新的内存
      String s="abc"; s="xxx" 
   2 StringBuffer 可变的 使用同一块内存,所以字符串相加比String效率较好
   3 StringBuffer StringBuilder    StringBuilder  线程不安全 效率高
它们3者都是final不可以被继承


5  说出ArrayList,Vector, LinkedList ,HashMap 和Hashtable,set的区别,讲讲他们的底层实现
     list 元素  有序的可以重复的
     set 元素:无序不可重复:使用HashMap的键存储,把hashmap的键作为set的元素所以不可重复
     map:键值对形式 键不能重复
     ArrayList Vector  :底层都是数组
           ArrayList线程不安全 效率高;vector是同步的,线程安全
     ArrayList  LinkedList:    
           ArrayList:底层使用数组  LinkedList使用链表
           数组查询速度快 增加删除慢 链表反之
     HashMap 和Hashtable  
           1 HashMap线程不安全 效率高 
           2 HashMap允许使用NULL当做键 
  3 Contains api改变 :hashMap中没有了此方法  他们都有containsKey() containsValue()
     HashMap:底层实现:数组+链表,即数组里的元素是链表,key算出它的hashcode作为数组的下标,链表中元素entry(key,value),
                        因为hashcode有可能重复,如果hashcode一样,在对应的下标,再看key是否一致,如果一致就是修改,
如果不一致,就是添加到链尾。
根据key拿到你的值get(key)
     set :使用HashMap的键存储,把hashmap的键作为set的元素


6  xml的解析方式
      dom   sax(推式解析)  stax(拉式解析)
   1  dom   document object model 文档对象模型
   2  sax   simple api for xml
   3  stax  Stream API for XML   
    DOM解析: 将xml以树结构的方式一次性加载进内存,简单易用,修改方便,功能强大,但是更占内存。
              不适应于大文件,一般情况下用它即可应付大多数应用。 
    SAX解析: 基于推模式的事件驱动的方式来解析xml,较少占用内存,速度比DOM解析更快,适应于大文件。
              事件驱动:每读一个节点触发的事件:开始节点,结束节点。。。
    STAX解析:基于拉模式的事件流的方式来解析xml,在3种解析方式中速度是最快的,可操作性也是最好的。
              
    拉与推区别:
推触发的事件是固定(事件名固定的),在固定的事件中编写我们的代码 
拉把触发的事件转化成int类型,根据int类型对应的事件自己编写代码,控制事件比较灵活


7  说说一下final与static  finally  finalize
      1 final 类 不能被继承 
        final 方法 不能被重写
        final 变量 值不能被修改  如果修饰的是引用变量,引用不能改, 引用所指向的对象内容是可以被修改的
      2  finally :
              try catch finally   finally 不管有无异常最后都会执行,有一种情况不执行,在代码中调用了system.exit(0);
              如果try catch中有return 也会先finally 后return 
      3  finalize:垃圾回收该对象时 要执行的方法 ,类似servlet要死之前调用destroy
      4  static : 定义的方法或属性不用new 直接通过类名使用,只执行一次 
         1 限制变量的作用域 全局
2 指定变量的存储域 存储在静态区       


8  多线程有几种实现方法,如何同步,有哪些类型的线程
       1 继承thread 2 实现Runnable
    区别 1 单继承 多实现  2 实现Runnable 资源共享(new 一个 就可以传给thread)
       2 如何同步
           1 Synchronized
  2 wait(等待下一个线程)  notify(唤醒一个正在等待同步锁的线程)  notifyAll(唤醒所有)生产者与消费者
    这些方法是Object中的方法,也叫线程之间的通讯
       3 有精灵线程(守护线程 后台 比如垃圾回收线程)和用户线程(普通线程)
            应用程序是否退出,只要没有用户线程在运行了, 应用程序就退出,但是有精灵线程在运行(垃圾回收机制一直在运行)
   精灵线程不具备生命周期,随着虚拟机的结束而结束;如果想把线程转为精灵线程,必须在start之前调用
   setDaemon(boolean)方法,一旦线程变为精灵线程就不能变成用户线程了
       4 用户线程的生命周期:新建---就绪--运行---(阻塞)---死亡


9  讲讲线程池和连接池
     1 为什么要用线程池? 以空间换时间的做法
          如果创建和销毁线程各需要3秒,而使用的时间只有1秒,
 即:在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多
 没必要每次都创建,这时可以使用线程池 创建几个线程放入池中,使用时取一个出来执行,执行完后扔回池中,重复利用.
   1.减少在创建和销毁线程上所花的时间以及系统资源的开销 
   2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 
      2 那么如何创建线程池 使用Executors中的方法创建线程池ExecutorService
       newFixedThreadPool创建固定大小的线程池
       newCachedThreadPool 创建一个可缓存的线程池
       newScheduledThreadPool(int corePoolSize) :创建一个给定大小的定期执行的线程池   
       ExecutorService pool=Executors.newFixedThreadPool(5);
        pool.execute(线程);
        pool.shutdown


      常见的连接池:DBCP,C3P0,PROX001


10 java中有几种类型的流?请说出一些io类?
    方向上划分 :相对于程序而言,分为输入流和输出流
    单位划分:字节流与字符流 
    功能划分:节点流和过滤流(包装流)
    常用的io流:
       FileInputStream 文件流
       ObjectInputStream 对象流
       BuffedInputStream 缓冲流
       ByteArrayInputStream(内存流)  
       PipedInputStream(管道流)
       DataInpuStream(读取八大基本数据类型,网络中读数据)
    转换流是适配器模式;过滤流是装饰器模式


11 JAVA的异常类型,如何进行异常处理,关键字:throws,throw,try,catch,finally 分别代表什么意义
     1  异常类型 
         Throwable 类
       /            \ 
     error 类        exception类
                   /            \
                  unchecked异常      checked异常(必须捕获或者抛出)
    (运行时异常,系统异常)       编译时异常,普通异常 
运行时异常直接或间接继承runtimeException
       error 导致应用退出 内存溢出 断电 
       unchecked异常与 checked异常区别:  
            checked异常必须捕获或者抛出,否则编译通不过
       unchecked异常:nullPointerExcption  ArrayIndexOutOfExcption  ClassCastException    
        ArithmeticException 算术异常      NoSuchMethodError找不到方法
ArrayStoreException 数组存储异常
        ClassNotFoundException  
IOException  FileNotFoundException


     2 try,catch,finally  try 必须要有,catch,finally两者的组合
     3  throws 方法声明上  throw方法内部抛出异常对象


12 jvm原理
    1 .java(源程序)---编译器---.class字节码文件----类加载器载入内存----字节码校验器(安全检查)---解释器(解释成
            操作系统识别的指令)--操作系统--cpu
         类加载器;java中有3种类型的类加载器 
 1 应用程序类AppClassLoader 加载我们应用程序类路径下的class  
 2 扩展类加载器 ExtClassLoader 加载jdk下的 jre/lib/ext
 3 Bootstrap类加载器              加载jdk下的jre/lib
 
加载机制是用类的委托机制加载
    首先AppClassLoader类加载器---父类---父类,最顶层的父类加载器进行加载,如果找不到class,由子类去加载,原路返回,最后
     所有的类加载器都找完了所有的路径还是找不到类,会抛出ClassNotFoundException


13 java修饰符作用域public,protected,默认的,private
                        当前类 当前包   子类 其他包
     public             y         y          y      y
     protected          y         y          y      n
     默认的             y         y          n      n
     private            y         n          n      n


14 java序列化
       Serializable是一个标识性接口,它的作用是
        1.在网络上传输对象;
2.保存数据到硬盘;


15 java集合框架的uml图 
                          Collection 
                /             |                 \
           List          AbstractCollection        Set 
   \          /                    \        /
           abstractList                      abstractSet 
  /    |     \                         /       \   
   ArrayList  Vector abstractSquentialList     HashSet TreeSet
               |           |
              stack  LinkedList


                Map            Dictionary
               /    \         /
   AbstractMap       HashTable
     /      \           |
 HashMap   TreeMap   properties






16 讲一下反射 
      1 反射 就是获得自身信息的一组类以及api,这组api可以获取类及其父类的 属性 或者方法 调用方法等 有关于类的api Class 
           属性的api Field 和方法的api Method
      2  Filed   
            getDeclaredFields 本类所有的属性(包括private修饰的)  
            getFields 本类以及父类的所有的public属性
      3  Method   
            getDeclaredMethods:本类的方法
   getMethods:本类以及所有父类的方法


//调用类的方法  方法(method).invoke(实例,参数列表);   //原来 实例.方法(参数列表)
private static void invokeMethod() {
Class c=Domain.class;
Method methods[]=c.getDeclaredMethods();
Method method=null;
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals("setName")) {
method=methods[i];
}
}
Domain d=(Domain) c.newInstance();
method.invoke(d, "aaa");
System.out.println(d.getName());
}


17 java中如何实现多态 
    1 父类引用指向子类实例
    2 方法的重载


18 排序  冒泡
     for(int i=0;i<a.length;i++) {
       for(int j=i+1;j<a.length-1;j++) {
if(a[i]<a[j]) {
int temp=a[i]
a[i]=a[j]
a[j]=temp
}
}
    }


19 继承类执行顺序结果
    类的委托机制
    首先AppClassLoader类加载器---父类(ExtClassLoader)---父类(BootStrap),最顶层的父类加载器进行加载,如果
     找不到class,由子类去加载,原路返回,最后所有的类加载器都找完了所有的路径还是找不到类,会抛出ClassNoFoundException


20 局部变量使用前必须初始化  
     public class Foo{ 
       
   public static void main(String args[]){ 
     String s; 
   System.out.println("s="+s); 
    } 
   } 
   what is the result? 


21 可变与不可变 传值与传引用
    传值:八大基本类型都为传值,就是把实参复制一份给形参;
    传引用:把实参的内存地址引用给参数,引用不可变,引用指向的内容是可变的
    public class Test{ 
       public static void stringReplace(String text){ 
           text=text.replace('j','l'); 
       } 
       public static void bufferReplace(StringBuffer text){ 
           text=text.append("c"); 
       } 
       public static void main(String args[]){   
           String textString=new String("java"); 
           StringBuffer textBuffer=new StringBuffer("java"); 
           StringReplace(textString); 
           bufferReplace(textBuffer); 
           System.out.println(textString+textBuffer); 
       } 
    } 
   what is the output? 
   java javac 


22 得到Class的三种方式是什么?
   类名.class 对象.getClass 
   Class.forName("Cma.A")   把.class文件读入内存


23 socket与udp
  socket : 三次握手 相当于打电话 安全的
  udp:   无状态的 不安全的 相当于邮寄
   socket: 分为服务端与客户端
  服务端
      ServerSocket ServerSocket=new  ServerSocket(1099)//在1099端口号启动服务
    Socket socket=ServerSockeet.accept()//对客户进行监听,返回一个客户端的socket
    socket.getInputStream


  客户端 Socket socket=new   Socket("ip地址",1099);  
socket.getOutputStream().write(“输出信息”)


           即:通过io流进行通讯 以输入流接受信息,以输出流发送信息


    udp :点对点通信,不需要服务器中转,谁都可以是服务器,也都可以是客户端


24 java有内存泄露吗
    内存泄露:当一个对象在程序中没有被使用,但是又无法被垃圾回收站回收,这种现象就称为内存泄露,经常发生在
    长生命周期的变量引用短生命周期的变量
    Object o1=new Object();
    Object o2=o1;
    o1=null;//


    比如栈在弹出元素时,如果我们不在弹出元素的同时从数组删除该元素就会发生内存泄露;


25 如何读取一个大文件如4GB文件 
     1 分段读取,先处理对进来的数据(比如先读100m,先入库),再把这个100m占用的资源释放掉,接着往下读
        while ((str = br.readLine()) != null) {
i++;
app=app+str;
if(i %100 ==0){//假设读取100行

                    // 这里你先对这100行操作,然后继续读
                                  app=null;
}
}
br.close();
}
     2 nio 按照块的方式读取   高效率读取大文件 
        
  26 super与this
      1 this表示当前对象,也就是当前类对象,super表示当前类的父类
      注意点:
      1 调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用
          super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。   
      2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它构造方法。    
      3)super()和this()均需放在构造方法内第一行。    
      4)尽管可以用this调用一个构造器,但却不能调用两个。   
      5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,
         所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
      6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
 
  27 ==与equals
  基本数据类型只能用"=="来比较,比较的是值;
  引用类型用"=="比较的是内存地址,equals比较的是值
  Object 中的equals与 == 一样的
  String重写了equals方法,比的是内容
  StringBuffer没有重写equals方法,比的是内存地址


comparable是接口 java.lang  自然排序  compareTo自然比较方法
comparator是接口 java.util  整体排序


自己添加的:
1 内存分配:
    1 栈:局部变量,形参,基本数据类型,引用
    2 堆:对象,数组,this 
    3 数据区(常量池):字符串常量,static变量
    4 代码区:代码
原创粉丝点击