• 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);

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

  • 相关阅读:
    作业DAY002
    作业DAY001
    作业 5:词频统计——增强功能
    在JdbcTemplate里面关于queryForMap返回值的疑问
    直接打印map, 为什么能直接输出value
    JdbcTemplate jar包 下载
    edge 修改链接打开方式
    Java中的判断实例
    关于Junit4 和 Junit5.4
    关于函数式接口, printable 自定义
  • 原文地址:https://www.cnblogs.com/zhongwh/p/2415601.html
Copyright © 2020-2023  润新知