Java读书笔记

2,HashTable和HashMap的区别

HashMap:允许将null作为一个entry的key或者value;有containsKey和containsValue方法,没有contains方法;多个线程访问HashMap时,必须为之提供外同步

HashTable:不允许有null值,Hashtable的方法是Synchronize的,多个线程访问 Hashtable时,不需要自己为它的方法实现同步

4,动态INCLUDE用jsp:include动作实现,它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

  静态INCLUDE用include伪码实现,不会检查所含文件的变化,适用于包含静态页面,只用于同级目录

 7,sleep是不释放同步锁,wait释放同步锁,进入等待状态。使用interreput打断sleep的线程,notify唤醒wait的线程,前者更像是自己让自己的状态改变,后者像是为了配合线程协作而执行的操作

9,notify():唤醒一个处于等待状态的线程,在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

10,EJB包括Session Bean、Entity Bean、Message Driven Bean

SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件.EntityBean 被用来代表

应用系统中用到的数据.对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑;EntityBean是 一种

持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体.

Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean

11,字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter

13,stop这个方法将终止所有未结束的方法,包括run方法。当一个线程停止时候,他会立即释放所有他锁住对象上的锁。这会导致对象处于不一致的状态。假如一个方法在将钱从一个账户转移到另一个账户的过程中,在取款之后存款之前就停止了。那么现在银行对象就被破坏了。因为锁已经被释放了。当线程想终止另一个线程的时候,它无法知道何时调用stop是安全的,何时会导致对象被破坏。所以这个方法被弃用了。你应该中断一个线程而不是停止他。

suspend不会破坏对象。但是,如果你用一个suspend挂起一个有锁的线程,那么在锁恢复之前将不会被释放。如果调用suspend的方法线程试图取得相同的锁,程序就会死锁。

15,一段socket通信的代码

服务端:

import java.net.*;
import java.io.*;

public class Server {
	private ServerSocket ss;
	private Socket socket;
	private BufferedReader in;
	private PrintWriter out;

	public Server() {
		try {
			ss = new ServerSocket(10000);
			while (true) {
				socket = ss.accept();
				String RemoteIP = socket.getInetAddress().getHostAddress();
				String RemotePort = ":" + socket.getLocalPort();
				System.out.println("A client come in!IP:" + RemoteIP
						+ RemotePort);
				in = new BufferedReader(new InputStreamReader(
						socket.getInputStream()));
				String line = in.readLine();
				System.out.println("Cleint send is :" + line);
				out = new PrintWriter(socket.getOutputStream(), true);
				out.println("Your Message Received!");
				out.close();
				in.close();
				socket.close();
			}
		} catch (IOException e) {
			out.println("wrong");
		}
	}

	public static void main(String[] args) {
		new Server();
	}
};

客户端:

import java.io.*;
import java.net.*;

public class Client {
	Socket socket;
	BufferedReader in;
	PrintWriter out;

	public Client() {
		try {
			System.out.println("Try to Connect to 127.0.0.1:10000");
			socket = new Socket("127.0.0.1", 10000);
			System.out.println("The Server Connected!");
			System.out.println("Please enter some Character:");
			BufferedReader line = new BufferedReader(new InputStreamReader(
					System.in));
			out = new PrintWriter(socket.getOutputStream(), true);
			out.println(line.readLine());
			in = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			System.out.println(in.readLine());
			out.close();
			in.close();
			socket.close();
		} catch (IOException e) {
			out.println("Wrong");
		}
	}

	public static void main(String[] args) {
		new Client();
	}
};

 

17,switch只能用int,char,byte,short,不能用于long

18,shorts1=1;s1=s1+1语句在java里面会出错,s1+1将结果转换成int,再将int赋值给short就出错,但是s1+=1就不会

19,使用final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的

22,vector是线程安全的,ArrayList是线程不安全的,记住Vector与Hashtable是旧的,是java 一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。ArrayList和Vector都是使用数组方式存储数据,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用

23,set里面的元素重复是使用equal来判断的

24,Java用有向图的方式进行垃圾管理。java也会发生内存泄露的问题,想象下内部类和外部类的例子

//java内存泄露的例子

Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
    Object o=new Object();
    v.add(o);
    o=null;    
}
//vector将对象o用add方法添加,但是o已经null了,vector中还存在对这些对象的引用

26,java中对象不一定由垃圾回收机制销毁,垃圾回收不等于析构,finalize()执行,然后执行垃圾回收..主要是处理java中调拥c/c++代码的情况

27,java中基本类型如int,double等是直接存在栈中,而Double,String等都是存放在堆上的..

28,java类的访问权限

29,final的用法

  数据:修饰基本类型时,保持该值不变,当修饰对象引用时,final使引用不变

  参数:当final修饰参数时,无法在方法中修改参数所指向的对象

  方法:被final修饰的方法不能被继承,并且该方法会被内嵌执行,感觉很像inline

  类:表明该类不能被继承

  ps:private方法都会隐式的制定为final

例子:String对象建立之后不再改变,StringBuffer允许经常更改,String覆盖了equal方法,StringBuffer没有

finalStringBuffera=newStringBuffer("immutable");
//执行如下语句将报告编译期错误:
a=newStringBuffer("");
//但是,执行如下语句则可以通过编译:
a.append("broken!");

30,int 的默认值为0,而Integer的默认值为null,所以int不能表示未赋值的情况

31,内部类要访问局部变量,局部变量必须定义成final 类型

32,异常分为runtime exception和checked exception,前者比如数组越界,空指针等,也叫系统异常,是软件设计者考虑不周出现的;后者比如io,网络等异常,是软件的运行环境变化导致的,用户可以自行解决,jdk要求程序员必须处理这种异常

33,synchronized锁的是这个类对象,即使synchronized(this),容易理解的,非static的synchronized方法不能防止其他线程访问static的方法,static的synchronized方法也不能防止其他线程访问非static的方法(因为static方法中的this不一样)

 

34,Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

35,如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp.

 

36,字节流:针对非二进制数据,ouputStream和inputSteam,不同的实现类代表不同的输入输出设备,针对字节操作

   字符流:针对字符数据,其实是实现在字节类之上的,底层设备只认识字节类,不能处理字符类,字符类需要处理编码的问题

 

37,当finally没有return语句的时候,finally语句在return执行之后在执行,加入try里面有return x,那么不管在finally里面再如何改变x的值,return的都是x未进入finally时候的值,当finally有return语句的时候,finally语句中的return结果会覆盖之前的return结果。参考地址:http://www.cnblogs.com/sky-manbu/archive/2011/11/17/2253102.html

38,下面一段程序输出是1,-1,-1

        Integer aInteger = 10, bInteger = -3;
        System.out.println(aInteger % bInteger);
        
        aInteger = -10; 
        bInteger = -3;
        System.out.println(aInteger % bInteger);
        
        aInteger = -10;
        bInteger = 3;
        System.out.println(aInteger % bInteger);

被除数和模除之后的数正负是一样的

原文地址:https://www.cnblogs.com/zhongwh/p/2415601.html