java高级特性

一、集合框架

 1、接口

  1-1:Collection:不唯一、无序

   1>List:不唯一、有序

   2>Set:  唯一、无序

  1-2:Map:  键-值对  key-value(k-v)

  1-3:Iterator:对集合进行迭代的迭代器、实现集合的遍历

 2、实现类及方法

  2-1:Collection方法:

     add(Object o)  在列表的末尾添加元素,起始索引位置从0开始 

     size() 返回列表中的元素个数

     contains(Object o) 判断列表中是否存在指定元素

     remove(Object o) 从列表中删除元素    

     clear()、isEmpty()、iterator()、toArray ()、

  2-2:List接口:

   1>ArrayList类的方法

    get(int index) 返回指定索引位置处的元素,取出的元素是Object类型,使用前需要进行强制类型转换

   2>LinkedList类的方法

    addFirst() 将给定元素插入当前集合的首部

    addLast() 将给定元素插入当前集合的尾部

    getFirst() 获得当前集合的第一个元素

    getLast() 获得当前集合的最后一个元素

    removeFirst() 删除当前集合的第一个元素

    removeLast() 删除当前集合的最后一个元素

  ★ArrayList:(查)因为可以使用索引来直接获取元素,所以优点是遍历元素和随机访问元素的效率比较高

   LinkedList:(增、删、改、)采用链表存储方式,优点在于插入、删除、修改元素时效率比较高,但是查找效率低

  2-3:Set接口:里面存放的是对象的引用、使用对象equals()方法比较是否为同一对象

   1>HashSet类的方法

    isEmpty():如果此Set不包含任何元素,则返回true

   2>遍历Set集合

    方法一:增强型for

    方法二:使用迭代器 Iterator 

       A:获取Iterator:Collection接口的iterator()方法 Iterator iter=news.iterator();

       B:使用hasNext()来判断是否存在另一个可访问的元素 while(iter.hasNext())

       C:使用next()来返回要访问的下一个元素 (Type)iter.next()

  2-4:Map接口:处理键值映射数据的存储,可以根据键实现对值的操作

   1>常用方法:

    Object put(Object key,Object val):以“键-值”对的方式进行存储

    Object get(Object key):根据键返回相关联的值,如果不存在指定的键,则返回null

    Object remove(Object key):删除由指定的键映射的“键-值”对

    int size():返回元素的个数

    Set keySet():返回键的集合

    Collection valuse():返回值的集合

    boolean containsKey(Obkject key):如果存在由指定的键映射的“键-值”对,返回true

    Set entrySet():获得键值对

   2>HashMap:动态存储数据,优点是查询指定元素效率高

   3>获取Map键和值的方式:

    A、keySet()——Set→迭代这个Set(Iterator)→get(key)

     Set keys=countries.keySet();
     Iterator iter=keys.iterator();
     while(iter.hasNext()){
      String key=(String) iter.next();
      String value=(String)countries.get(key);
      System.out.println(key+"--"+value);
     }

    B、entrySet()——Set(Map.Entry)→增强型for(或者Iterator)→getKe()、getValue()

     Set set=countries.entrySet();
     for(Object obj:set){
      String key=(String)((Map.Entry)obj).getKey();
      String value=(String)((Map.Entry)obj).getValue();
      System.out.println(key+"--"+value);
     }  

 3、Collections类是对操作集合

  1>对集合元素排序(sort:升序、reverse:降序)

   通过sort()方法进行排序(先实现Comparable接口→重写compareTo()方法)

   public int compareTo(Object o) {
    Student student = (Student) o;
    if(this.number==student.number){
     return 0;
    }else if(this.number>student.number){
     return 1;
    }else{
     return -1;
    }
   }

  2>对集合元素查找:binarySearch()、max()查找最大值、min()查找最小值

  3>对集合元素替换:fill() 把所有的元素都替换为相同的元素

  4>

二、泛型

 语法:类1或者接口<类型实参> 对象=new 类2<类型实参>();

 好处:保证类型转换的安全性和稳定性

三、实用类

 1、枚举:由一组固定的常量组成的类型

   访问修饰符 enum 枚举类型变量名{ 枚举常量列表 }

 2、包装类:把基本类型数据转换为对象

  2-1:构造方法

   1>所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例

   2>除Character类外,其他包装类可将一个字符串作为参数构造它们的实例

  ★Number类型的构造时,参数必须能转换为相应的数字,不然NumberFormatException
   Boolean类型构造时,除了true(大小写)以外全都是false

  2-2:常用方法

   1>**Value():包装类转换成基本数据类型

    Number包装类型转换为基本数据类型
    Boolean 包装类型转换为基本数据类型
    Character包装类型转换为基本数据类型(charValue())

   2>toString():返回字符串

   3>valueOf():返回包装类型

    ★所有包装类valueOf(type type)
     包装类valueOf(String s) →除Character之外

   4>parse**():把字符串转换为相应的基本类型数据(Character除外)

  2-3:包装类型→基本数据类型 (拆箱)
     基本数据类型→包装类型(装箱))

 3、Math类

  生成随即方式有两种:

   1>java.lang.Math

    int random=(int)(Math.random()*10); 生成一个0-9之间的随机数

   2>java.util.Random

    Random rand=new Random(); //创建一个Random对象

    int num=rand.nextInt(种子); //返回下一个随机整数

 4、操作字符串的实用类

  4-1:String字符串类的方法

   1>length():返回字符串的长度

   2>equals():比较两个字符串的值是否相同

   3>equalsIgnoreCase():比较两个字符串时,忽略大小写

   4>toLowerCase():转换为小写

   5>toUpperCase():转换为大写

   6>concat():连接字符串

   7>int indexOf(int ch):搜索第一个出现的字符ch(或者字符串 value),找不到返回-1

    int indexOf((String value)

    int lastIndexOf(int ch):搜索最后一个出现的字符ch(或者字符串 value),找不到返回-1

    int lastIndexOf(String value)

    String substring(int index):提取从位置索引开始的字符串部分,,截取到字符串的末尾,包含index

    String substring(int beginindex,int endindex):提取beginindex(包含)和endindex(不包含)之间的字符串部分

    String trim():返回一个前后不含任何空格的调用字符串的副本

   8>split:对字符串进行拆分  ——String[]

  4-2:StringBuffer类:频繁修改字符串,效率比String高

   初始化:StringBuffer s=new StringBuffer("content");

   1>toString():转换为String类型的对象

   2>append(参数):将参数连接到字符串并返回

   3>insert(位置,参数):将参数插入到字符串的指定位置后并返回

 5、日期时间类

  5-1:java.util.Date;  import java.text.SimpleDateFormat;

   1>Date date=new Date();使用系统当前时间创建日期对象

   2>SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");格式化时间

    formater.format(date) 输入当前时间

  5-2:import java.util.Calendar; 

    Calendar calendar=Calendar.getInstance();

    set():设置时间    get():获取时间

    1>YEAR:年

    2>MONTH:月(+1)

    3>DAY_OF_MONTH:日

    4>DAY_OF_WEEK:星期(-1)

四、输入和输出(I/O) java API:java.io;

 1、File类:文件的属性或操作

  1-1:常用方法

      创建文件
       exists():判断呢文件或目录是否存在
       createNewFile():创建空文件,不能创建文件夹

      删除文件
       exists()

       delete():删除此对象指定的文件

      获取文件相关信息
       isFile():判断是否是文件
       isDirectory():判断是否是目录
       getName():返回此对象表示的文件或目录的名称
       getPath():返回此对象表示的文件的相对路径
       getAbsolutePath():返回此对象表示的文件的绝对路径
       length():返回文件的长度,单位为字节,如果文件不存在,则返回0L

 2、流:指一连串流动的字符,以先进先出的方式和发送和接收数据的通道

  2-1:流的划分(基类也就是父类)

   1>流向:

    输入流:InputStream、Reader

     输出流:OutputStream、Writer

   2>数据单位:

    字节流:InputStream、OutputStream

    字符流:Reader、Writerr

  2-2:流的使用

   1>字节流:

    A:输入流:public abstract class InputStream

     方法:int read():从输入流中读取下一个字节,返回0-255之间的int值.返回值代表着都出来的字节对应的整型数字

        int read(byte[] b):从输入流中读取一堆字节,把这些字节存储在字节数组b中。返回值代表着真实的读到的字节的个数(b的长度)

        int read(byte[] b,int off,int len):从输入流中读取一堆字节,把这些字节存储在字节数组b中。off对应的是b开始存储字节的标识或下标(将读取的第一个字节存储在元素 b[off] 中)。len对应的是读到的字节的个数或长度

        available():可以从输入流中读取的字节数目

        close():关闭输入流

 

     ★子类FileInputStream常用的构造方法

      FileInputStream (File file)

      FileInputStream(String name)

    B:输出流:public abstract class OutputStream

     方法:void write(int c):写入一个字节数据     
        void write(byte[] buf):写入数据buf的所有字节
         void write(byte[] b,int off,int len):将字节数组中off位置开始,长度为len的字节数据输出到输出流中

        void close():关闭输出流
        void flush():强制把缓冲区的数据写到输出流中

        void write(byte[] buf)

     ★子类FileOutputStream常用的构造方法

      FileOutputStream (File file)

      FileOutputStream(String name)

      FileOutputStream(String name,boolean append)

   2>字符流

 

    A:输入流:public abstract class Reader

     方法:int read():从输入流中读取下一个字符,返回0-65535之间的int值.返回值代表着都出来的字符对应的整型数字

        int read(byte[] b):从输入流中读取一堆字符,把这些字符存储在字节数组b中。返回值代表着真实的读到的字符的个数(b的长度)

        int read(byte[] b,int off,int len):从输入流中读取一堆字符,把这些字符存储在字符数组b中。off对应的是b开始存储字符的标识或下标(将读取的第一个字符存储在元素 b[off] 中)。len对应的是读到的字符的个数或长度

        available():可以从输入流中读取的字符数目

        close():关闭输入流

     ★其子类InputStreamReader的构造方法

      InputStreamReader(InputStream stream)
      InputStreamReader(InputStream stream, String charsetName)

      ★InputStreamReader的子类FileReader的构造方法

       FileReader(File file)
       FileReader(String pathName)
       FileReader只能按照本地平台的字符编码来读,不能通过用户特定的字符编码来读
        本地平台的字符编码获得:System.getProperty("file.encoding");

    B:输出流:public abstract class Writer

     方法:write(String str):写入一个字符串数据     
        write(char[] c):
         write(String str,int off,int len):将str字符串数组中off位置开始,长度为len的字符串数据输出到输出流中

        void close():关闭输出流
        void flush():强制把缓冲区的数据写到输出流中void write(byte[] buf)

     ★其子类OutputStreamWriter的构造方法      

      OutputStreamWriter(OutputStreamWriter stream)

      OutputStreamWriter(OutputStreamWriter stream,String charsetName)

      ★OutputStreamWriter的子类FileWriter的构造方法

       FileWriter(File file)
       FileWriter(String pathName)
FileWriter只能按照本地平台的字符编码来写,不能通过用户特定的字符编码来写

 

  2-3:读写文本文件

   1>用FileInputStream读文本文件

    A:引入相关类

    B:创建输入流对象(FileInputStream对象)

     FileInputStream fis = new FileInputStream("text.txt",true);
    C:读取文本文件(read())

     fis.available():可读取的字节数

     fis.read():读取文件的数据
    D:关闭流

   ★BufferedReader:带有缓冲区的字符输入流
    构造方法:
     BufferedReader(Reader reader)
     readLine()-->String

   2>使用FileWriter往文本文件中写数据步骤:
    A:引入相关类

    B:创建输出流对象(FileWriter对象)

     Writer fw = new FileFileWriter("text.txt");
    C:写入文本文件(write())

     write()

    D:关闭流

   ★BufferedWriter:带有缓冲区的字符输出流
    构造方法:
     BufferedWriter(Writer)
     write():写入
     flush():清空缓冲区

     newLine():换行

     replace(oldChar, newChar):把oldChar替换newchar

  2-4:二进制文件读取和写入(图片、音频)

   DataInputStream:读
   DataOutputStream:写

五、序列化和反序列化

 1、定义

  序列化是将对象的状态写入到特定的流中的过程
  反序列化则是从特定的流中获取数据重新构建对象的过程 

 2、步骤

  2-1:序列化

   1>实现Serializable接口
   2>创建对象输出流 ObjectOutputStream
   3>调用writeObject()方法将对象写入文件

   4>关闭对象输出流

  2-2:反序列化:
   1>实现Serializable接口

   2>创建对象输入流 ObjectInputStream

   3>调用readObject()方法读取对象

   4>关闭对象输入流

  ★可以为对象某些属性添加transient,这些属性将不再被序列化

六、多线程

 1、线程的步骤

  1-1:创建线程的两种方式:

   1>extends Thread

   2>implements Runnable→

  1-2:重写run()方法

  1-3:启动线程:start() 

 2、线程状态:新生、可运行、阻塞、死亡

 3、线程调度

  3-1:优先级:1-10表示,1最低,10 最高,默认为5

  3-2:实现调度的方法:

   1>join():等待该线程终止

   2>sleep(long millis):在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)

   3>yieId():暂停当前正在执行的线程对象,并执行其它线程

 4、线程同步:通过synchronized关键字实现

  4-1:同步方法

  4-2:同步代码块

七、网络编程

 1、IP

  ipconfig:查看本机IP地址

  ping 目标IP地址:测试网络是否通畅

 2、网络服务器

  客户机→服务器(Client/Server)(C/S)

  浏览器→服务器(Browser/Server)(B/S)

 3、Socket:套接字 位于java.net包

  3-1:流式套接字:基于TCP协议的Socket

   1>服务器端

    A、创建一个服务器Socket
     ServerSocket serverSocket=new ServerSocke(8800);
    B、使用accept()等待客户的通信
     Socket socket=serverSocket.accept();
    C、获得输入流,获得相应的用户请求
     InputStream is=socket.getInputStream();

     BufferedReader br=new BufferedReader(new InputStreamReader(is));

     。。。。

    D、通过输出流,给客户端一个响应

     OutputStream os=socket.getOutputStream();

     。。。。

    E、释放相应资源

   2>客户端:

    A、创建一个客户端Socket

     Socket socket=new Socket("localhost",8800);
    B、通过输出流发送请求
     OutputStream os=socket.getOutputStream();

     。。。。。

     scoket.shutdownOutput();

    C、通过输入流接收服务器给我的响应
     InputStream is=socket.getInputStream();

     。。。。。

    D、释放资源

  ★多线程完成多客户端请求:InetAddress

  3-2:数据包式套接字:基于UDP协议的Socket网络编程

   1>服务器

    A、创建DatagramPacket对象,用来准备接收数据包

     byte[] infos = new byte[1024];

     DatagramPacket dp = new DatagramPacket(infos, infos.length);

    B、创建DatagramSocket对象,接受数据

     DatagramSocket socket= new DatagramSocket(8800);

     socket.receive(dp);

    C、利用DatagramPacket对象处理数据

   2>客户端

    A、获取本地主机的InetAddress对象

     InetAddress ia=InetAddress.getByName("localhost");

    B、创建DatagramPacket对象,封装要发送的信息

     DatagramPacket dp=new DatagramPacket(infos, infos.length, ia, 8800);

    C、创建DatagramSocket对象,向服务器发送数据

     DatagramSocket socket=new DatagramSocket();

     socket.send(dp);

八、XML:可扩展标记语言

 1、、XML文档基本结构
  1-1:XML声明(一般位于文档的第一句话)
   <?xml version="1.0"  encoding="utf-8"?>
  1-2:每个XML文档都有且只有一个根元素
  1-3:每个元素如果成对出现,要一起敲出来
  1-4:各元素之间如果有层级关系,注意缩进
  1-5:xml注释 <!--注释内容-->

 2、元素

  <元素名 属性名="属性值">元素内容</元素名>

 3、使用DOM解析读取XML数据

  3-1:创建解析器工厂对象,即DocumentBuilderFactory对象

   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

  3-2:由解析器工厂对象创建解析器对象,即DocumentBuilder对象

   DocumentBuilder builder = factory.newDocumentBuilder();

  3-3:由解析器对象对指定的XML文件进行解析,构建相应的DOM树,创建Document对象

   Document document = builder.parse("路径");

  3-4:以Document对象为起点对DOM树的节点进行增加、删除、修改、查询等操作

   

 

 

  

   

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值