Java学习笔记(2)Java语言进阶
来源:互联网 发布:农村金融去哪找数据 编辑:程序博客网 时间:2024/05/22 06:07
1、Java集合类详解
Collection接口:
- 集合可以理解为一个动态的对象数组,不同的是集合中的对象内容可以任意扩充。
- 集合的特点:1、性能高。 2、容易扩展和修改。
- Collection的常用子类: List Set Queue
List接口:
- List接口可以存放任意的数据,而且在List接口中的内容是可以重复的。
- List接口常用子类: ArrayList 和 Vector 。
- 常用操作:(1)、判断集合是否为空:Boolean isEmpty()(2)、查找指定对象是否存在:int indexOf(Object o)。若存在,返回值为元素所在位置序列号。若不存在,返回值为-1。
ArrayList与Vector的区别:
例如:
package java进阶;import java.util.ArrayList;import java.util.List;public class List接口 { public static void main(String[] args) { List<String> lists = null; lists = new ArrayList<String>(); lists.add("A"); //添加元素 lists.add("B"); lists.add("A"); for (int i = 0; i < lists.size(); i++) { System.out.println(lists.get(i)); } lists.remove(0); //删除指定序列号元素 System.out.println("删除之后---"); for (int i = 0; i < lists.size(); i++) { System.out.println(lists.get(i)); } System.out.println("集合是否为空:"+lists.isEmpty());//查看集合是否为空 System.out.println("B是否存在:"+lists.indexOf("B")); //查找指定对象是否存在:int indexOf(Object o)。若存在,返回值为元素所在位置序列号。若不存在,返回值为-1。 }}程序执行结果: A B A 删除之后--- B A 集合是否为空:false B是否存在:0
Set接口:
- Set接口中不能加入重复元素,但可以排序。
- Set接口常用子类:(1)散列存放:HashSet。(2)有序存放:TreeSet.
例如:
package java进阶;import java.util.HashSet;import java.util.Set;import java.util.TreeSet;public class Set接口 { public static void main(String[] args) { Set<String> s = new HashSet<String>(); s.add("E"); s.add("A"); s.add("D"); s.add("C"); s.add("B"); System.out.println(s);//不保证按顺序存放 TreeSet<String> s1 = new TreeSet<String>(); s1.add("E"); s1.add("A"); s1.add("D"); s1.add("C"); s1.add("B"); System.out.println(s1);//保证按顺序存放 }}
Iterator接口:
- 集合输出的标准操作: 标准做法,使用Iterator接口。
- 操作原理:Iterator是专门的迭代输出接口,迭代输出就是讲元素一个个进行判断,判断其是否有内容,如果有内容则把内容取出。
其接口下定义如下:
public interface Iterator { boolean hasNext(); Object next(); void remove(); }
其中:
- Object next():返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型
- boolean hasNext():判断容器内是否还有可供访问的元素
- void remove():删除迭代器刚越过的元素
对于我们而言,我们只一般只需使用next()、hasNext()两个方法即可完成迭代。如下:
for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); //do something }
例如:
package java进阶;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class 迭代输出Iterator接口 { public static void main(String[] args) { List<String> lists = null; lists = new ArrayList<String>(); lists.add("A"); //添加元素 lists.add("B"); lists.add("C"); lists.add("D"); lists.add("E"); Iterator<String> iter = lists.iterator();//迭代接口实例化 while (iter.hasNext()) { String str = iter.next(); if("A".equals(str)) { iter.remove(); //删除A }else { System.out.println(str); } } }}程序执行结果: B C D E
Map接口:
- Map用于保存具有映射关系的数据(key-vlaue)。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false
- Collection 接口是保存单值最大的父接口,那么 Map接口保存的内容是一对值,所有的内容是以:key->value 的形式保存的。
- 常用子类:(1)HashMap:无序存放,key不允许重复。(2)Hashtable:无序存放,key不允许重复.
HashMap与Hashtable的区别:
Map接口中定义如下方法:
例如:
package java进阶;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public class Map接口 { public static void main(String[] args) { Map<String, String> map = new HashMap<String,String>(); map.put("key1", "A"); //添加数据 map.put("key2", "B"); map.put("key3", "C"); map.put("key4", "D"); map.put("key5", "E"); String str = map.get("key1"); System.out.println(str); //通过键值找到对应值 if (map.containsKey("key1")) { //判断键是否存在 System.out.println("key1存在"); }else { System.out.println("key1不存在"); } if (map.containsValue("A")) { //判断值是否存在 System.out.println("A存在"); }else { System.out.println("A不存在"); } Set<String> s = map.keySet(); //将所有键打印出来 Iterator<String> i = s.iterator(); while (i.hasNext()) { System.out.println(i.next()); } Collection<String> c = map.values();//将所有值打印出来 Iterator<String> i1 = c.iterator(); while (i1.hasNext()) { System.out.println(i1.next()); } }}
2、Java本地文件操作
文件的创建、重命名、删除:
package java进阶;import java.io.File;import java.io.IOException;public class 文件的基本操作 { //文件夹结果必须处于同一分区 //文件夹处于不同的分区,需要使用文件的拷贝。而不是重命名 public static void main(String[] args) { File file = new File("hello.txt"); //判断文件是否存在 if(file.exists()) { File nameto = new File("new hello"); file.renameTo(nameto); //文件重命名 }else { System.out.println("文件不存在"); try { file.createNewFile(); //如果文件不存在创建新文件 System.out.println("文件已经成功创建"); } catch (IOException e) { System.out.println("文件无法创建"); } } System.out.println(file.isFile()); System.out.println(file.isDirectory()); file.delete(); System.out.println("文件已删除"); }}
文件夹的创建、重命名、删除:
package java进阶;import java.io.File;public class 文件夹的基本操作 { public static void main(String[] args) { File folder = new File("my new folder/two/three/main"); if (folder.mkdirs()) { System.out.println("文件夹创建成功"); }else { if (folder.exists()) { System.out.println("文件夹已经存在无需创建"); }else { System.out.println("文件创建失败"); } } File newfolder = new File("my new folder-new/one/two"); if (folder.renameTo(newfolder)) { System.out.println("文件夹重命名成功"); }else { if (newfolder.exists()) { System.out.println("文件夹已经重命名成功"); }else { System.out.println("文件夹重命名失败"); } } //只能删除空文件夹 if (newfolder.delete()) { System.out.println("文件夹删除成功"); }else { System.out.println("文件夹删除失败"); } }}
获取文件的属性:
package java进阶;import java.awt.geom.FlatteningPathIterator;import java.io.Filepublic class 获取文件属性 { public static void main(String[] args) { File file = new File("new hello");// 判断文是否存在 System.out.println("判断文是否存在:"+file.exists());// 读取文件名称 System.out.println("读取文件名称:"+file.getName());// 读取文件路径 System.out.println("读取文件路径:"+file.getPath());// 读取文件绝对路径 System.out.println("读取文件绝对路径:"+file.getAbsolutePath());// 读取文件父级路径 System.out.println("读取文件父级路径:"+ new File(file.getAbsoluteFile().getParent()));// 读取文件大小 System.out.println("读取文件大小:"+ file.length()+"Byte");// 判断文件是否被隐藏 System.out.println("判断文件是否被隐藏:"+file.isHidden());// 判断文件是否可写 System.out.println("判断文件是否可写:"+file.canWrite());// 判断文件是否可读 System.out.println("判断文件是否可读:"+file.canRead());// 判断文件是否为文件夹 System.out.println("判断文件是否为文件夹:"+file.isDirectory()); }}程序执行结果: 判断文是否存在:true 读取文件名称:new hello 读取文件路径:new hello 读取文件绝对路径:D:\我的软件\eclipse\java学习\new hello 读取文件父级路径:D:\我的软件\eclipse\java学习 读取文件大小:21Byte 判断文件是否被隐藏:false 判断文件是否可写:true 判断文件是否可读:true 判断文件是否为文件夹:false
文件属性的设置:
package java进阶;import java.io.File;public class 文件属性的设置 { public static void main(String[] args) { File file = new File("new hello"); if (file.exists()) { //将文件设置为可写 file.setWritable(true); //将文件设置为可读 file.setReadable(true); //将文件设置为只读 file.setReadOnly(); } }}
文件的遍历:
package java进阶;import java.io.File;public class 文件的遍历 { public static void main(String[] args) { printFiles(new File("../java学习"),1); } public static void printFiles(File dir,int tab) { if (dir.isDirectory()) { File next[] = dir.listFiles(); //返回文件的目录文件名数组 for (int i = 0; i < next.length; i++) { for (int j = 0; j < tab; j++) { System.out.print("|---"); } System.out.println(next[i].getName()); if (next[i].isDirectory()) { printFiles(next[i],tab+1); } } } }}
程序执行结果:
|---.classpath|---.project|---.settings|---|---org.eclipse.jdt.core.prefs|---bin|---|---java基础|---|---|---stringBuffer.class|---|---|---Switch开关语句.class|---|---|---字符串操作.class|---|---|---异常处理.class|---|---|---找最大数.class|---|---|---控制台输入.class|---|---|---数组排序.class|---|---|---逻辑运算.class|---|---java进阶|---|---|---List接口.class|---|---|---Map接口.class|---|---|---Set接口.class|---|---|---文件夹的基本操作.class|---|---|---文件属性的设置.class|---|---|---文件的基本操作.class|---|---|---文件的遍历.class|---|---|---获取文件属性.class|---|---|---迭代输出Iterator接口.class|---|---java面向对象|---|---|---A.class|---|---|---A1.class|---|---|---A2.class|---|---|---Abs.class|---|---|---Abs3.class|---|---|---B.class|---|---|---B1.class|---|---|---B2.class|---|---|---C.class|---|---|---C1.class|---|---|---Computer.class|---|---|---D.class|---|---|---Father.class|---|---|---Gener.class|---|---|---Generic.class|---|---|---Gin.class|---|---|---I.class|---|---|---Ineter1.class|---|---|---instanceof关键字.class|---|---|---Inter2.class|---|---|---Inter3.class|---|---|---Interface.class|---|---|---J.class|---|---|---People.class|---|---|---People1.class|---|---|---People2.class|---|---|---People3.class|---|---|---Person.class|---|---|---Person1.class|---|---|---PetWorker.class|---|---|---Point.class|---|---|---Printer.class|---|---|---Ref.class|---|---|---Son.class|---|---|---Student.class|---|---|---Student1.class|---|---|---Student2.class|---|---|---this关键字.class|---|---|---USB.class|---|---|---USBDesk.class|---|---|---Worker.class|---|---|---Worker2.class|---|---|---匿名对象.class|---|---|---多态性.class|---|---|---子类对象的实例化.class|---|---|---对象多态性的应用.class|---|---|---封装性.class|---|---|---引用传递.class|---|---|---抽象类.class|---|---|---抽象类的应用.class|---|---|---接口的实现.class|---|---|---接口的应用.class|---|---|---构造方法.class|---|---|---构造方法中使用泛型.class|---|---|---泛型接口.class|---|---|---泛型数组.class|---|---|---泛型方法.class|---|---|---继承.class|---|---|---继承方法的重写.class|---|---|---继承的限制.class|---|---|---认识泛型.class|---|---|---递归调用.class|---my new folder|---|---one|---|---|---two|---|---|---|---three|---|---|---|---|---main|---|---two|---|---|---three|---|---|---|---main|---my new folder-new|---|---one|---new hello|---src|---|---java基础|---|---|---stringBuffer.java|---|---|---Switch开关语句.java|---|---|---字符串操作.java|---|---|---异常处理.java|---|---|---找最大数.java|---|---|---控制台输入.java|---|---|---数组排序.java|---|---|---逻辑运算.java|---|---java进阶|---|---|---List接口.java|---|---|---Map接口.java|---|---|---Set接口.java|---|---|---文件夹的基本操作.java|---|---|---文件属性的设置.java|---|---|---文件的基本操作.java|---|---|---文件的遍历.java|---|---|---获取文件属性.java|---|---|---迭代输出Iterator接口.java|---|---java面向对象|---|---|---instanceof关键字.java|---|---|---this关键字.java|---|---|---匿名对象.java|---|---|---多态性.java|---|---|---子类对象的实例化.java|---|---|---对象多态性的应用.java|---|---|---封装性.java|---|---|---引用传递.java|---|---|---抽象类.java|---|---|---抽象类的应用.java|---|---|---接口的实现.java|---|---|---接口的应用.java|---|---|---构造方法.java|---|---|---构造方法中使用泛型.java|---|---|---泛型接口.java|---|---|---泛型数组.java|---|---|---泛型方法.java|---|---|---继承.java|---|---|---继承方法的重写.java|---|---|---继承的限制.java|---|---|---认识泛型.java|---|---|---递归调用.java
文件的简单读写:
package java进阶;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;public class 文件的简单读写 { public static void main(String[] args) { File file = new File("hello word"); //如果文件不存在,文件输出流会自动创建文件 //写文件 try { FileOutputStream fos = new FileOutputStream(file); //创建文件输出流 OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");//创建输出流 BufferedWriter bw = new BufferedWriter(osw); //创建缓冲区的write bw.write("hello word!\n");//向文件写入“hello word!” bw.close();//关闭流 osw.close(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //读取文件 try { FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader br = new BufferedReader(isr); String list; //定义一个变量用于存放读取的数据 while ((list = br.readLine()) != null) { System.out.println(list); } br.close(); isr.close(); fis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}程序执行结果: hello word!
3、Java中的IO操作
Java IO简介:
- IO也写作“I/O”,可理解为In和Out,即输入与输出。所有,IO体系的基本功能就是:读和写。
- IO流作用:读写设备上的数据,硬盘文件、内存、键盘、网络···
- 根据数据的走向,可以分为:输入流、输出流。
- 根据处理的数据类型,可分为:字节流、字符流。
字节流与字符流:
- 字节流可以处理所有类型的数据,如MP3、图片、文字、视频等。在读取时,读到一个字节就返回一个字节。在Java中对应的类都以“Stream”结尾。
- 字符流仅能够处理纯文本数据,如txt文本等。在读取时,读到一个或多个字节,先查找指定的编码表,然后将查到的字符返回。在Java中对应的类都以“Reader”或“Writer”结尾。
字符、字节与编码的区别:
使用文件流读写文件:
package java进阶;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class 使用字节流读写数据 { public static void main(String[] args) { try { FileOutputStream fos = new FileOutputStream("hello word1"); FileInputStream fis = new FileInputStream("hello word"); byte input[] = new byte[30]; //定义读取文件存放位置 fis.read(input); //读文件 String inputString = new String(input); System.out.println(inputString);//输出文件内容 fos.write(input); //写入新的文件,实现文件的复制 fos.close(); //关闭流 fis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
4、Java多线程编程:
线程与进程:
- 线程:程序中单独顺序的控制流。特点:(1)线程本身依靠程序进行运行。(2)线程是程序中的顺序控制流,只能使用分配给程序的资源和环境。
- 进程:执行中的程序。(1)一个进程可以包含一个或多个线程。(2)一个进程至少要包含一个线程。
- 单线程:程序中只存在一个线程,实际上主方法就是一个主线程。
- 多线程:(1)多线程是一个程序中运行多个任务。(2)多线程的母的是为了更好的使用CPU资源。
线程的实现:
在Java中,线程的实现有2种。(1)继承Thread类。(2)实现Runnable接口。
Thread类:是在Java.lang包中定义的,继承Thread类必须重写run()方法。定义格式:
class className extends Thread{ run(){};}
Runnable接口
例如:
通过继承Thread类实现线程:
package java进阶;//通过继承Thread类实现线程public class MyThread extends Thread{ private String name; public MyThread(String name) { //构造方法用于传参 this.name = name; } public void run() { for (int i = 0; i < 1000; i++) { System.out.println(name+":"+i); } super.run(); }}
通过Runnable接口实现线程:
package java进阶;//通过Runnable接口实现线程public class MyRunnable implements Runnable{ private String name; public MyRunnable(String name) { this.name = name; } public void run() { for (int i = 0; i < 1000; i++) { System.out.println(name+":"+i); } }}
用过主函数调用方法:
package java进阶;public class 线程主函数 { public static void main(String[] args) { //通过Thread方法实现线程 MyThread t1 = new MyThread("A"); MyThread t2 = new MyThread("B"); t1.start(); //线程的启动时通过start t2.start(); //通过Runnable实现线程 MyRunnable r1 = new MyRunnable("C"); MyRunnable r2 = new MyRunnable("D"); Thread t3 = new Thread(r1); Thread t4 = new Thread(r2); t3.start(); t4.start(); }}
线程的状态:
线程有固定的操作状态:
- 创建状态:准备好了一个多线程的对象。
- 就绪状态:调用start()方法,等待CPU进行调度。
- 运行状态:执行run()方法。
- 阻塞状态:暂时停止执行,可能将资源交给其他线程使用。
- 终止状态(死亡状态): 线程销毁。
线程的常用方法:
- 取得线程名称:getName();
- 取得当前线程对象:currentThread();
- 判断线程是否启动:isAlive();
- 线程的强行运行:join();
- 线程的休眠:sleep();
- 线程的礼让:yield();
例如:
package java进阶;class Thread1 extends Thread{ private String name; public Thread1(String name) { this.name = name; } public void run() { for (int i = 0; i < 50; i++) { System.out.println(name+":"+i); if (i == 10) { System.out.println("礼让"); Thread.yield(); } try { Thread.sleep(10); //线程的休眠 } catch (InterruptedException e) { e.printStackTrace(); } } //取得当前线程对象 System.out.println(Thread.currentThread()); //取得当前线程名称 System.out.println(Thread.currentThread().getName()); super.run(); }}public class 线程的常用方法 { public static void main(String[] args) { Thread1 t1 =new Thread1("A"); Thread1 t2 =new Thread1("B"); //判断线程是否启动 System.out.println(t1.isAlive()); t1.start(); for (int i = 0; i < 50; i++) { if (i > 10) { try { t1.join(); //线程的强制执行 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("主线程:"+i); } t2.start(); System.out.println(t1.isAlive()); }}
线程优先级:
- MIN_Priority—1
- MAX_Priority—10
NORM——Priority—5. 默认值为5
注意:线程优先级不是一定按优先级执行。而是提高了执行概率。
t1.setPtiority(Thread.MIN_PRIOITY);
同步与死锁:
同步代码块:在代码块上加上“synchronized”关键字,则此代码块就称为同步代码块。
同步代码块格式:
synchronized(同步对象){ 需要同步的代码块;}
同步方法:除了代码块可以同步,方法也可以同步。
方法同步的格式:synchronized void 方法名称(){}
同步实现了资源的共享。
死锁:死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源。
package java进阶;//三个窗口卖一辆车的车票,实现数据的同步class Synchornized implements Runnable{ private int ticket = 5; public void run() { for (int i = 0; i < 10; i++) { tell(); } } public synchronized void tell() { //同步方法 if(ticket > 0) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ticket:" + ticket-- ); } }}public class 线程的同步 { public static void main(String[] args) { Synchornized s = new Synchornized(); Thread t1 = new Thread(s); Thread t2 = new Thread(s); Thread t3 = new Thread(s); t1.start(); t2.start(); t3.start(); }}
线程的生命周期:
阅读全文
0 0
- Java学习笔记(2)Java语言进阶
- java进阶学习笔记
- Java学习笔记(63)-----------线程进阶
- JAVA语言规范学习笔记(2)
- Java学习笔记03——Java面向对象和语言进阶
- Java语言学习笔记
- java语言学习笔记
- 【Java】Java 语言学习笔记
- 疯狂Java学习笔记(63)-----------线程进阶
- Java WebService学习笔记 - Axis进阶(二)
- JAVA语言规范学习笔记(1)
- JAVA语言规范学习笔记(3)
- JAVA语言规范学习笔记(4)
- Java语言基础学习笔记(一)
- Java语言基础学习笔记(二)
- Java语言基础学习笔记(三)
- Java语言基础学习笔记(四)
- Java语言基础学习笔记(五)
- C++中vector使用详细说明
- imx平台,通过fastboot烧写boot.img system.img recovery.img镜像
- win10下ElasticSearch5.5.1 head sql ik kibana x-pack安装
- 探究Ext中Tab中加入Grid各个方法的加载顺序
- 使用/proc实现内核与用户空间通信
- Java学习笔记(2)Java语言进阶
- 简单解释MapReduce算法
- 用Js实现页面按名字搜索功能
- MySQL缓存机制详解(一)
- Java学习笔记(3)网络通信
- JavaScript、jquery实现上传图片(图片存到服务器,路径存到数据库字段中)一
- Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)
- Csharp进阶:栈和队列
- 如何用Python Pandas以及正则表达式提取地址中的省份