Java 语言核心
1. 面向对象
1) 封装(成员、方法定义、构造方法、访问控制、 内部类、static、final)

a.成员和方法的定义,内存结构
JVM内存可以分为:方法区、堆、栈
方法区:类的信息(类的定义、方法代码、
静态的成员)
持久(类在第一次被使用时,装入方法区
JDK的核心类是在JVM启动的时候自动装入 的)、唯一(只会装入一次)
堆:通过new关键字创建的对象
持有(被引用指向、在集合中)、
回收(当对象不再被持有时)
栈:在方法中声明的局部变量
方法调用完之后即会清空

b.构造方法
初始化成员变量
子类的构造方法必须调用父类的构造方法,为了
保证子类中从父类继承的成员被妥善的初始化
一般情况下Java类都要提供一个无参的构造方法
c.访问控制
类(为内部) public defualt
成员 public protected default private
public 封装对外提供的功能
尽量要保证其稳定性
要对参数进行合法性验证,保证其健壮性
//IllegalArgumentException
必须妥善的处理异常
private 一个类中,多个方法中的公共部分
protected 多个类中的冗余部分,在父类中封装

成员变量和属性的区别!!!

设置emp对象的xxx属性为“goodman”
等价于调用emp的setXxx("goodman")

获取emp对象的xxx属性
等价于String name = emp.getXxx();

d.内部类
公有类 public
包内类 default
内部类 定义在一个类内部(多线程)
匿名类 定义在一个方法中

e.static
static方法
定义在类中的一个方法,
该方法不对该类的对象进行操作
其操作仅仅和输入相关(参数)
定义在该类中完全是出于逻辑上的考虑
static成员
static final 常量在编译的时候会被替换为常量值
定义该常量的类甚至都不会被加载

f.final
类前很少写final,动态代理
方法前写final,防止方法被无意中重写

2) 类和类之间的关系(关联、依赖、继承)
关联

public class A {
           private B b;
           public A() {
               b...
           }
         }
         public class B {

         }


依赖

public class A {
           public void f(B b) {}
           public B g() {}
         }
         public class B {

         }


关联优于继承(如果仅仅是重用,不需要继承)
依赖优于关联(如果仅仅是一个方法要用到,不 需要关联)

3) 多态(抽象类、接口)

Pet P  = new Cat();
        Growsable g = new Cat();

*4) 常见的设计模式

2. JavaSE核心
1) String、StringBuilder、(Commons)
String类

String str1 = "abc";
        String str2 = "abc";
        int length()
        String name = ....; 
        boolean b = "whatisjava".equals(name)
                                .equalsIgnoreCase
        int indexOf(String str)
        int indexOf(String str, int fromIndex)

        String substring(int start, int end)
        String[] split(String regx)
        String trim()        StringBuilder 
        StringBuilder append(...)
        StringBuilder delete(int start, int end)
        StringBuilder insert(..., int fromIndex

2) Date、Calendar、SimpleDateFormat

java.util.Date
        Date d = new Date();
        long getTime();
        void setTime(long m);        java.util.Calendar

        Calendar c = Calendar.getInstance();        c.set(Calendar.YEAR, 2013);
        c.set(Calendar.MONTH, 9)
        c.set(Calendar.DAY, 1)
        System.out.println
             (c.get(Calendar.DAY_OF_WEEK));     SimpleDateFormat
     SimpleDateFormat sdf = 
               new SimpleDateFormat("yyyy-MM-dd");
    String str = sdf.format(new Date());
    Date date = sdf.parse(str);

3) 集合框架、ArrayList、HashMap

如何选取List和Map:

List 线性表 排序,按下标索引
     Map  查找表 查找
    Map<String,Student> map = ...
    map.put(stu.getName(),stu);
    map.get("zhangsan");

     class Student {
       private String name;
       private String score;
       ... ... ...
     }

常见的实现类:

ArrayList, LinkedList
     HashMap, TreeMap

常用的方法:
List<E>
追加:add(E e);
插入:add(int index, E e);
删除:remove(E e); (和equals)
remove(int index);
获取:E get(int index);
更改:E set(int index, E e)
set(i, list.set(j, list.get(i)));
是否包含:contains(Object o) (和equals)

清空:clear();
大小:size();

addAll,removeAll 

     Map<K,V>
        put(K k, V v);
        V get(K k)
        boolean containsKey(K k)

遍历:

Map<String, Object> map = 
                 new HashMap<String, Object>();
        Set<String> keys = map.keySet();
        for (String key : keys) {
	   System.out.println(key+":"+map.get(key));
        }

4) FIS/FOS、BIS/BOS、ISR/OSW、BR/PW、OIS/OOS

文件流(节点)连接文件
FileInputStream
FileOutputStream

缓存流(处理)
通过内部的缓冲区提高读写效率
BufferedInputStream
BufferedOutputStream

字符转化流(处理)
把字节数据根据特定的编码转化成字符
InputStreamReader
OutputStreamWriter

字符缓存流(处理)
readLine可以一次读取一行字符
BufferedReader

字符打印流(处理)
print,println
可以把各种数据转化为字符串形式输出
PrintWriter

对象流(处理)
writeObject
readObject
对象的序列化和反序列化
ObjectInputStream
ObjectOutputStream

拷贝文件

FIS fis = new FIS("src");
        FOS fos = new FOS("dest");
        BIS bis = new BIS(fis);
        BOS bos = new BOS(fos);

        int b = -1;
        while((b=bis.read())!=-1) {
           bos.writer(b);
        }        bis.close();
        // bos.flush();
        bos.close();

读写文本文件

FOS fos = new FOS("src.txt");
        OSW osw = new OSW(fos, "utf-8");
        osw.write("你好");
        osw.close();        FIS fis = new FIS("dest.txt");
        ISR isr = new ISR(fis,"utf-8");
        char c = (char)isr.read();
        isr.close();

读文本文件,一次读一行

FIS fis = new FIS("dest.txt");
        ISR isr = new ISR(fis,"utf-8");
        BR br = new BR(isr);
        String line = br.readLine();
        br.close();

将各种数据信息的字符串表示输出到文件中

FOS fos = new FOS("log.txt");
        OSW osw = new OSW(fos);
        PW pw = new PW(osw);
        pw.println(emp);
        pw.println(250);
        pw.println("hello");
        ... ... ...

从控制台输入一行数据

BR br = new BR(new ISR(System.in));
        String line = br.readLine();

从Socket中输入数据(文本)

InputStream is = socket.getInputStream();
        ISR isr = new ISR(is);
        BR br = new BR(isr);




向Socket中输出数据(文本)

OutputStream os = socket.getOutputStream();
        OSW osw = new OSW(os);
        PW pw = new PW(osw);

5) 多线程和网络

a. 线程和进程的区别
进程操作系统的多个任务(不同的内存)
线程是在一个进程中的多个任务 (同一内存)

b. Java语言中创建线程的方法
        public class MyThread extends Thread {
           public void run() {...}
        }
        MyThread t = new MyThread();
        t.start();        public class Some implements Runnable {
            public void run() {...}
        }
        Thread t = new Thread(new Some());
        t.start();        public class BO {
          private class MyThread extends Thread { 
              public void run() {...}
          }
        }



c. 线程的状态和相互转换

d. 线程同步
多个线程访问同一个可变的对象
访问的方法加锁(效率下降)

synchronized

         public void f() {             ... ... ...
           synchronized(obj) {
             XXX XXX XXX
           }             ... ... ...
         }

e.线程安全API
StringBuffer -- StringBuilder
Vector * -- ArrayList
Hashtable * -- HashMap
Collections的方法对List和Map的同步

 

 

 

1. 表单提交时GET和POST的区别?
1) GET和POST是两种不同的协议
POST在协议中可以传输数据
GET只能在请求地址中通过请求参数传输数据
(限于文本)
2) POST提交的数据量受服务器的限制
GET提交的数据量受浏览器地址栏长度的限制
3) 都不安全,如果要保证安全使用HTTPS协议

2. 描述Servlet的生命周期
1) Servlet重要的生命周期方法(容器调用的方法):
init, service, destroy
默认情况下第一次访问Servlet时实例化对象
(也可以配置为启动即加载)
实例化后调用init
每次收到请求调用service
实例被销毁前调destroy
2) 单实例,多线程

3. 列举HttpServletRequest的常用方法
1) 获取请求参数, getParameter(String name);
getParameterMap();
2) 获得请求的地址,getRequestURI();
3) 获取请求的应用名,getContextPath();
4) 获取请求的头信息,getHeader(String name);
5) 根据请求信息中的SessionID获得Session,
getSession();
6) 作为一个容器,存取数据,
setAttribute(String name, Object value);
getAttribute(String name);
7) 设置解码的字符集(默认为ISO8859-1)
setCharacterEncoding(String charset)
8) 获取请求信息中提交的Cookie
getCookies();
9) 实现转发,
request.getRequestDispatcher("...")
.forward(request, response)

4. 列举HttpServletResponse的常用方法
1) 获得响应内容的输出流
getWriter() 文本信息
getOutputStream() 字节信息
2) 设置响应头中ContentType setContentType(String)
3) 通过响应头传递Cookie addCookie
4) 生成一个重定向响应 sendRedirect

5. 谈一谈使用Session的经验
1) 不能放安全级别要求高的信息 (SessionID容易获得)
2) 不能放大量的信息(服务器的性能问题)
3) 不能放持久性的信息
能放的很有限(一般不是业务信息,
而是为了操作方便的信息):
登录后的用户ID,服务器端生成的验证码,....

6. 转发和重定向的区别?
1) 转发请求一个组件,该组件在服务器端
把请求转发给另外一个组件
由另外一个组件实现相应。(一个请求)
2) 重定向请求一个组件,该组件生成一个重定向相应
浏览器收到此响应后访问其他的组件。(多个请求)
3) 一个事情两个组件协同完成,用转发(JSP Model2)
两个组件之间一般需要传递数据用request
一个事情完成,自动的开始另外一个事情,用重定向

7. 相对地址和绝对地址的区别
1)
链接,表单提交 b.jsp /webapp/jsp/b.jsp
重定向 b.jsp /webapp/jsp/b.jsp
转发 b.jsp /jsp/b.jsp
2) 相对地址在转发时容易出错!

8. Java WEB开发中的编码问题
1) 页面显示

Servlet
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();		
JSP
<%@page pageEncoding="utf-8"%>
<%@page contentType="text/html; charset=utf-8"%>

2) 提交数据的问题

Servlet
request.setCharacterEncoding("utf-8");
request.getParameter("...");
JSP 这样写是否有效???一般用Filter
<%
request.setCharacterEncoding("utf-8");
request.getParameter("...");
%>