Head First Java(5)—— 网络与线程及集合与泛型

15 网络与线程

Socket是个代表两台机器之间网络连接的对象

问:不同程序可以共享一个端口嚒?

答:不行,如果你想要使用(绑定)某个已经被占用的端口,就会受到BindException,绑定一个端口就代表程序要在特定的端口上面执行。


用BufferedReader从Socket上读取数据:


用PrintWriter写数据到Socket上:



编写服务器应用程序要用到哪些东西?

一对Socket。一个会等待用户请求(当用户创建Socket时)的ServerSocket以及与用户通信用的Socket。


如何启动新的线程?

1、建立Runnable对象(线程的任务)

Runnable threadJob = new MyRunnable(); 

你会编写实现Runnable的类,而此类就是你对线程要执行的任务的定义。也就是说此方法会在线程的执行空间运行。

2、建立Thread对象(执行工人)并赋值Runnable(任务)

Thread myThread = new Thread(threadJob);       threadJob这一对象必须要实现runnable类~~~!!!!

把Runnable对象传给Thread的构造函数。这会告诉Thread对象要把哪个方法放在执行空间去运行——Runnable的run()方法。

3、启动Thread

myThread.start();


Runnable带有会放在执行空间的第一项方法: run()


Thread.sleep(2000);这个方法可能会抛出InterruptedException异常,所有对它的调用都必须包在try/catch块中。


可以用synchronized来修饰一行或数行的指令而不必整个方法都同步化。


当你要对静态的方法做同步化时,Java会使用类本身的锁。如果同一类有两个被同步化过的静态方法,线程需要取得类地锁才能进入这些方法。

同步化的意义是制定某段工作要在不能分割的状态下执行。单独一步的操作不重要,重要的是有多个步骤的方法。

16 集合与泛型

泛型意味着更好的类型安全性。几乎所有以泛型写的程序都与处理集合有关。


对泛型来说,extends这个关键词代表“是一个……”且适用于类和接口。


取用Comparator版的sort()方法会用Comparator而不是元素内置的compareTo()方法来比较顺序。如果sort()方法带有Comparator,它就不会调用元素的compareTo()方法,而会去调用Comparator的compare()方法。comparator的级别优先于compare方法。


在Collection中有3个主要的接口:List、Set和Map

  • LIST:顺序。知道索引顺序的集合。List知道某物在系列集合中的位置。可以有多个元素引用相同的对象。
  • SET:独一无二。不允许重复的集合。
  • MAP:用key来搜索的专家。使用成对的键值和数据值。
引用的相等性和对象的相等性:
引用相等性
(如果foo与bar两对象相等,则foo.equals(bar)会返回true,且两者的hashCode()也会返回相同的值。)如果没有被覆盖的话,hashCode()默认的行为会返回每个对象特有的序号。(大部分的Java版本是依据内存位置计算此序号,所以不会有相同的hashcode)

如果想知道两个引用是否相等,可以使用==来比较变量上的字节组合。如果引用到相同的对象,字节组合也会一样。
对象相等性

if(foo.equals(bar) &&foo.hashCode() == bar.hashCode())
如果想把两个不同的Song对象视为相等,就必须覆盖过从Object继承下来的hashCode()方法与equals()方法。

如果HashSet在比对的时候,同样的hashcode有多个对象,它会使用equals()来判断是否有完全的符合。也就是说,hashcode是用来缩小寻找成本,但最后还是要用equals()才能认定是否真的找到相同的项目。

TreeSet:
TreeSet的元素必须是Comparable。
集合中的元素必须是有实现Comparable的类型或使用重载、取用Comparator参数的构造函数来创建TreeSet。

如果方法的参数是Animal的数组,它也能够取用Animal次类型(子类……)的数组.
如果把方法声明成取用ArrayList<Animal>,它就只会取用ArrayList<Animal>参数,ArrayList<Dog>与ArrayList<Cat>都不行。
数组的类型是在运行期间检查的,但集合的类型检查只会发生在编译期间。


public void takeAnimals(ArrayList<? extends Animal> animals){}      (extends同时代表继承和实现)
(1)在方法参数中使用万用字符时,编译器会阻止任何可能被破坏引用参数所指集合的行为。
(2)你能够调用list中任何元素的方法,但不能加入元素按。
(3)你可以操作集合元素,但不能新增集合元素。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值