随笔分类 - JAVA基础
摘要:new Exception 这段代码,会调用父类ThrowAble的构建方法,在构造方法中会调用fillInstackTrace这个native方法。会把当前线程异常发生的信息,上下文记录在栈调用指针中。然后我们可以在处理异常的地方,调用getStackTrace()方法获取StackTraceEl...
        阅读全文
            
摘要:String就是一个典型的不可变对象。外界的操作不能改变它,如果尝试改变都会返回一个新的String对象。 具体实现起来就是把属性全部变成private 和 final的,这个类也是final的不可继承,以免子类进行修改。对外暴露方法读操作,如果是写操作(修改)那么方法就要返回一个新的对象,原...
        阅读全文
            
摘要:这几天看结城浩的《java多线程设计模式》,跟着做一些习题,有几道题目很有意思,记录下自己的体会。 首先是题目(在原书212页,书尾有解答):public class Main { public static void main(String[] args) { try { ...
        阅读全文
            
摘要:从学习java开始一直被灌输一个概念,就是抽象类不能实例化,然后就一直认为抽象类没有构造。直到今天我看oracle的JDBC驱动源代码的OracleStatement类,发现它是一个抽象类,但是却又构造方法,奇怪之下进行试验,发现抽象类确定是不能直接new,但却可以有构造,你new 他的实现子类...
        阅读全文
            
摘要:先简单介绍下java的classloader,网上资料很多,就说点关键的。 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个: 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。 系统类加...
        阅读全文
            
摘要:之前使用cglib的时候不需要将classLoader作为参数传入,但动态代理却要,带着这个疑惑进入这个方法: Proxy.newProxyInstance(classLoader,interfaces,InvocationHandler) 要在classLoader里去找interfaces,如果也加载进来了才能继续执行,并且用ProxyGenerator动态生成了一个代理类的字节码文件(使用了缓存技术,只需要生成一次),然后用classLoader将这个字节码文件加载进来。这就是classLoader的作用。 可以这样看生成的字节码类。 加入执行参数: System.setP...
        阅读全文
            
摘要:threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好的做法是将调用threadlocal的remove方法. 在threadlocal的生命周期中,都存在这些引用. 看下图: 实线代表强引用,虚线代表弱引用. 每个thread中都存在一个map, map的类型是ThreadLocal.ThreadLocalMap. Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key. 每个key都弱...
        阅读全文
            
摘要:在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错。虽然这是很符合多态的现象,也符合java的动态绑定规范,但
        阅读全文
            
摘要:用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多个网站或一条线程抓取一个网站的话实在太慢,而且有时一条线程抓取同一个网站的话也比较浪费CPU资源。要用到多线程的等方面,也就免不了对线程的控制或用到线程池。 我在做我们现在的那一个抓取框架的时候,就曾经用过java.util.concurrent.ExecutorService作为线程池,关于ExecutorService的使用代码大概如下:java.util.concurrent.Executors类的API提供大量创建连接池的静态方法:1.固定大小的线程池:package BackStage; import java.util.
        阅读全文
            
摘要:String在java里是很特别的一个对象。数组就更特别了,底层实现介于对象和基本数据类型之间。1实际使用上可以把数组当成对象来理解,所以数组作为参数也是引用传递。java里基本数据和String是值传递,对象和数组是引用传递。java底层封装了指针,实际上java只有值传递,所谓的值传递是复制一份值传递过去,引用传递就是把值直接传递过去,然后共享这个值。有一条不成规则的规则:对于函数调用,最终效果是什么完全看函数内部的实现。比较标准的做法是如果会改变引用的内容,则使用void作为方法返回值,而不会改变引用内容的则在返回值中返回新的值。-----------------------------
        阅读全文
            
摘要:装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;装饰模式应该为所装饰的对象增强功能;代理模式对代理的对象施加控制,并不提供对象本身的增强功能二者的实现机制确实是一样的,可以看到他们的实例代码重复是很多的。但就语义上说,这两者的功能是相反的,模式的一个重要作用是简化其他程序员对你程序的理解,你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制,虽然代码很可能相同,但如果你都叫他们装饰,别人会很迷惑的。---------------------------------------
        阅读全文
            
摘要:创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代...
        阅读全文
            
摘要:public class HelloGoodbye{try{System.out.println(“Hello World”);System.exit(0);} finally {System.out.println(“Goodbye World”);}}上面这段代码会打印出什么呢?要知道答案需要了解System.exit(0)这个方法在执行过程中到底发生了哪些事情。API文档上描述System.exit方法会导致当前运行线程停止并使其它线程都终止,因此上面这段代码中的finally代码块不会被执行。进一步探索System.exit被调用后的行为,它在虚拟机在退出前会执行两个清除任务。第一,它
        阅读全文
            
摘要:1.服务端注册一个serverSocketChannel(确定好服务器IP和端口号)到Selector上,监听accept事件。2.Selector不断的轮询看有没触发监听的事件,这里就是有没接受到到这个socket的请求。有了就找出SelectionKey。这时的SelectionKey对应的是服务端的serverSocketChannelServerSocketChannelssc=(ServerSocketChannel)key.channel(); 3.取的客户端发请求的SocketChannelsocket=(SocketChannel)ssc.accept(); 4.监听这个客户端
        阅读全文
            
摘要:这几天在看IO和NIO, 说IO是阻塞的,当多个IO访问服务器时,发生阻塞的时候,CPU要不停的轮询每个IO的线程,看哪个IO的阻塞解除。会浪费CPU资源。 然后我看了线程的状态分类,专门有人说过阻塞和同步是不一样的。 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable)
        阅读全文
            
摘要:String infile = "e:\\copy_i.txt"; String outfile = "e:\\copy_o.txt"; FileInputStream fin = new FileInputStream(infile); FileOutputStream fout = new FileOutputStream(outfile); FileChannel fcin = fin.getChannel(); FileChannel fcout = fout.getChannel(); ByteBuffer buffer = ByteBuffe
        阅读全文
            
 
                    
                     
                    
                 
                    
                
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号