日期:2014-05-20  浏览次数:20731 次

希望大家讨论一下,关于UDP的DatagramPacket的相关问题
大家先看一下这段代码:
Java code
            DatagramSocket ds = new DatagramSocket(8888);
            while (true) {
                byte[] buf = new byte[50]; 
                DatagramPacket dp = new DatagramPacket(buf, buf.length);
                ds.receive(dp);
                                                        System.out.println(new String(dp.getData());
                                                        System.out.println(new String(buf,buf.length());
                                          }



最后两句话可以显示出同样的效果,但是那句话更好一些呢?
个人愚见:后面一句System.out.println(new String(buf,buf.length());更好一些,因为他是直接调用原有的buf,不会消耗额外的内存,而dp.getData()虽然返回的也是数据缓冲区,但我感觉这步操作好像会在内存中new出一个byte[]的匿名对象,因而会占用额外的内存空间。不知道大家怎么看?
求指点。

------解决方案--------------------
System.out.println(new String(dp.getData());
System.out.println(new String(buf,buf.length());

这个两句效果是一样的。

“因为他是直接调用原有的buf,不会消耗额外的内存,而dp.getData()虽然返回的也是数据缓冲区,但我感觉这步操作好像会在内存中new出一个byte[]的匿名对象,因而会占用额外的内存空间”
dp.getData()返回的byte数组其实就是你自己创建的那个byte数组,所以你调用这个方法并没有占用额外 的内存空间。
你看一下new DatagramPacket(buf, buf.length);这个构造方法的源码就知道了。