Java 高级教程

1. 数据结构

Java2中引入了一种新的框架-集合框架(Collection)

2. 集合框架

(1) 集合接口

a. 用得最多的是list接口和set接口。

b. List 接口存储的是有序的,可以重复的元素。

Set 接口存储的是无序的,不重复的数据。

c. List接口检索效率高,插入和删除效率低。

Set接口检索效率低,插入和删除效率高。

d. Map.Entry:  描述Map中的一个元素(键/值对)。

(2) 集合实现类

a. ArrayList: 实现了List的接口, 随机访问和遍历元素时效率高,插入删除效率低。多线程不安全。

b. TreeSet: 实现了Set接口,随机访问和遍历元素时效率低,插入删除效率高。多线程不安全。可以实现排序等功能。

c. HashMap: 实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度。多线程不安全。

d. 此外常用的还有Vector,ConcurrentHashMap

(3) 线程安全与不安全

a. Vector,HashTable,ConcurrentHashMap 是线程安全的。

b. ArrayList,LinkedList,HashMap,TreeMap,HashSet,TreeSet都不是线程安全的。

(4) 使用迭代器

a. 遍历 ArrayList

方法1: For-Each 遍历 List

for (String str : list) { 
        System.out.println(str);
     }

方法2: 链表变为数组进行遍历

list.toArray(strArray);
     for(int i=0;i<strArray.length;i++) 
     {
        System.out.println(strArray[i]);
     }

b. 遍历 Map 

方法1: 普遍使用,二次取值

for (String key : map.keySet()) {
       System.out.println("key= "+ key + " and value= " + map.get(key));
      }

方法2: 通过Map.entrySet遍历key和value, 推荐,尤其是容量大时

for (Map.Entry<String, String> entry : map.entrySet()) {
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }

(5) 其他

a. 集合框架的类和接口均在java.util包中。

b. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。

3. ArrayList具体用法

(1) 创建数组队列: ArrayList<String> sites = new ArrayList<String>();

(2) 添加元素:sites.add("Google");

(3) 访问元素:sites.get(1);  // 访问第二个元素

(4) 修改元素:sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值

(5) 删除元素:sites.remove(3); // 删除第四个元素

(6) 计算大小:使用size() 方法

(7) 排序:使用 sort()方法

(7) ArrayList 中的元素实际上是对象, 所以基本类型要换成包装类

intInteger
longLong
floatFloat
charCharacter

4. LinkedList 具体用法

(1) LinkedList 是一个链表,增加和删除效率更高,查找和修改效率较低。

(2) 需要频繁的在开头、中间、末尾添加和删除元素的话使用LinkedList,否则使用ArrayList

(3) 创建数组队列: LinkedList<String> sites = new LinkedList<String>();

(4) 添加元素:sites.addFirst("Wiki");  sites.addLast("Google"); 

(5) 访问元素:sites.getFirst(); sites.getLast(); sites.get(1); 

(6) 修改元素:sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值

(7) 删除元素:sites.removeFirst(); sites.removeLast();

5. HashMap 具体用法

(1) HashMap 对象: HashMap<Integer, String> Sites = new HashMap<Integer, String>();

(2) 添加和修改元素: Sites.put(1, "Google");

(3) 访问元素:Sites.get(1)

(4) 删除元素:Sites.remove(1);

(5) 迭代 HashMap:

a. 输出 key 和 value

for (Integer i : Sites.keySet()) {
            System.out.println("key: " + i + " value: " + Sites.get(i));
        }

b. 输出每一个value

for(String value: Sites.values()) {
          // 输出每一个value
          System.out.print(value + ", ");
        }

6. 迭代器 Iterator

(1) 使用方法:

ArrayList<String> sites = new ArrayList<String>();
Iterator<String> it = sites.iterator();
while(it.hasNext()) {
    System.out.println(it.next());
}

(2) 删除元素

Iterator<Integer> it = numbers.iterator();
while(it.hasNext()) {
    Integer i = it.next();
    if(i < 10) {  
        it.remove();  // 删除小于 10 的元素
    }
}

7. 泛型

(1) 使用例子:

public class Box<T> {
  private T t;

  public void add(T t) {
    this.t = t;
  }
  public T get() {
    return t;
  }
 
  public static void main(String[] args) {
    Box<Integer> integerBox = new Box<Integer>();
    Box<String> stringBox = new Box<String>();
    integerBox.add(new Integer(10));
    stringBox.add(new String("菜鸟教程"));
    System.out.printf("整型值为 :%d\n\n", integerBox.get());
    System.out.printf("字符串为 :%s\n", stringBox.get());
  }
}

(2) 类型通配符 ?。例如 List<?> 是 List<String>,List<Integer> 等的父类。

public static void getData(List<?> data) {
    System.out.println("data :" + data.get(0));
}

(3) 类型通配符限定:  extends Number

public static void getUperNumber(List<? extends Number> data) {
    System.out.println("data :" + data.get(0));
}

  表示类型只能接受 Number 及其上层父类类型,String 不在这个范围之内,会报错

8. 序列化

(1) 序列化对象

{
      Employee e = new Employee();
      try {
         FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
      }catch(IOException i) {
          i.printStackTrace();
      }
}

注意要捕捉 IOException异常

(2) 反序列化对象

{
      Employee e = null;
      try {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i) {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c) {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
    }
}

注意要捕捉 IOException和ClassNotFoundException异常

9. 网络编程

(1) 服务端部分:

{
    //创建ServerSocket,绑定端口
    ServerSocket serverSocket = new ServerSocket(port);
    serverSocket.setSoTimeout(10000);
    //接受客户端,创建Socket
    Socket server = serverSocket.accept();
    //创建数据输入流,读取数据
    DataInputStream in = new DataInputStream(server.getInputStream());
    System.out.println(in.readUTF());
}

(2) 客户端部分

{
    //输入host和port,连接服务器
    Socket client = new Socket(serverHost, port);
    //创建数据输出流,向服务端发送数据
    OutputStream outToServer = client.getOutputStream();
    DataOutputStream out = new DataOutputStream(outToServer);
    out.writeUTF("Hello from " + client.getLocalSocketAddress());
    //创建数据输入流,接收服务端数据
    InputStream inFromServer = client.getInputStream();
    DataInputStream in = new DataInputStream(inFromServer);
    System.out.println("服务器响应: " + in.readUTF());
    //关闭socket
    client.close();
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值