No.1
- 使用垃圾收集的语言也会存在内在泄漏问题,例如访问资源文件,流不关闭,访问数据库等连接不关闭等。
- java的垃圾收集机制主要针对新生代和老年代的内存进行回收,不同的垃圾收集算法针对不同的区域。所以java的垃圾收集算法使用的是分代回收。一般java的对象首先进入新生代的Eden区域,当进行GC的时候会回收新生代的区域,新生代一般采用复制收集算法,将活着的对象复制到survivor区域中,如果survivor区域装在不下,就查看老年代是否有足够的空间装下新生代中的对象,如果能装下就装下,否则老年代就执行FULL GC回收自己,老年代还是装不下,就会抛出OUtOfMemory的异常
- 使用垃圾收集的程序不需要明确释放对象
- 现代垃圾收集能够处理循环引用问题
- 垃圾回收在jvm中优先级相当相当低。
- 垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些,程序员不能控制。
- 垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重BUG,照样仍会溢出。
- 进入DEAD的线程,它还可以恢复,GC不会回收
No.2
- HashMap可以插入null的key或value,插入的时候,检查是否已经存在相同的key,如果不存在,则直接插入,如果存在,则用新的value替换旧的value
No.3
- 复制的效率System.arraycopy>clone>Arrays.copyOf>for循环
No.4
- FileInputStream提供了对文件的字节读取;
- FileReader提供了对文件的字符读取;
- FileWriter提供了对文件的字符写入;
- File提供了对文件的基本操作,包括对删除,文件路径等操作。
No.5
servlet在多线程下其本身并不是线程安全的。
如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。
service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用, 根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法
No.6
- Socket套接字 :是源Ip地址,目标IP地址,源端口号和目标端口号的组合
- 服务器端:ServerSocket提供的实例
ServerSocket server= new ServerSocket(端口号) - 客户端:Socket提供的实例
Socket soc=new Socket(ip地址,端口号)
No.7
以下来自牛客网"smile":
- 从action类上分析:
- Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
- Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
- 从Servlet 依赖分析:
- Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
- Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
从action线程模式分析: - Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
- Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
No.8
父类静态域——》子类静态域——》父类成员初始化——》父类构造块——》1父类构造方法——》2子类成员初始化——》子类构造块——》3子类构造方法
No.9
throws表示出现异常的一种可能性,并不一定会发生异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
No.10
- 重载的时候,返回值类型可以相同也可以不相同, 无法以返回型别作为重载函数的区分标准。而且编译的时候只有返回值不同会报错。即使不报错,运行时无法区分调用哪个方法。
- 参数类型不同时,顺序不同也是重载,例如:
public void first(int a,double b ){}
public void first(double b2,int a2){}
No.11
方法的重写(override)两同两小一大原则:
- 方法名相同,参数类型相同
- 子类返回类型小于等于父类方法返回类型,
- 子类抛出异常小于等于父类方法抛出异常,
- 子类访问权限大于等于父类方法访问权限。
No.12
以下来自“睡眼惺忪_s ”:
- redirect:请求重定向:客户端行为,本质上为2次请求,地址栏改变,前一次请求对象消失。举例:你去银行办事(forward.jsp),结果告诉你少带了东西,你得先去公安局办(index.html)临时身份证,这时你就会走出银行,自己前往公安局,地址栏变为index.html.
- forward:请求转发:服务器行为,地址栏不变。举例:你把钱包落在出租车上,你去警察局(forward.jsp)报案,警察局说钱包落在某某公司的出租车上(index.html),这时你不用亲自去找某某公司的出租车,警察局让出租车自己给你送来,你只要在警察局等就行。所以地址栏不变,依然为forward.jsp.
No.13
java.util.*,只能读取其目录下的类,不能读取其子目录下的类。 因为其根目录和子目录下可能有同名类,若都能读取,则会混淆。
No.14
- TreeMap 未进行同步考虑,是线程不安全的。
- HashTable 和 ConcurrentHashMap 都是线程安全的。
- Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如:
List list = Collections.synchronizedList(new ArrayList());
Set set = Collections.synchronizedSet(new HashSet());