java 高级特性
2018-06-29 10:38:50 0 举报
AI智能生成
java 高级,java 高级,java 高级
作者其他创作
大纲/内容
1.集合框架
Map
HashTable 和HashMap区别
HashTable 线程安全 HashMap线程不安全
HashMap key 可以存null 值 HashTable 不可以存null 运行时异常 编译能通过
HashMap put(key,value) remove(key) 改put(key,value) get(key)
HashMap集合的遍历 通过key 去找value key 是一个Set 集合,所以key 是唯一的
增加for循环遍历
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println(value);
}
迭代器 遍历map Iterator iter = map.keySet().iterator();
while(iter.hasNext()){
String key = (String)iter.next();
System.out.println(key);
String value =(String)map.get(key);
System.out.println(value);
}
Collection
List 有序,不唯一
ArrayList 基于数组 随机读取数据快 add(obj) remove(index) add(int,obj); get(index)
LindkedList 基于链表的集合,删除和插入效率比较高 addFirst()addLast() removeFirst() removeLast();
Vector 和ArrayList 区别 Vector 线程安全 synchronized ArrayList线程不安全
set 无序,唯一 equals()
HashSet 采用对象的equals()方法比较两个对象是否相等
Set set=new HashSet();
String s1=new String("java");
String s2=s1;
String s3=new String ("java");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());
2.实用类
枚举 enum 用来存常量 是一种类型
包装类 Interger
Integer.parseInt("6");
String
String str="abc";
String str1 = new String("abc");
System.out.println(str==str1);//false
System.out.println(str.equals(str1));//true
length();字符串长度
subString(start,end); 截取字符串 包前不包后
str.indexOf("a");
//查找字符返回下标,找不到返回-1;
str.split(",");//分割 返回时String[] 数组
str.trim();//去空格
str.equalsIgnoreCase("");//忽略大小写
str.toLowerCase();//小写
str.toUpperCase();//大写
str.replace("oldChar", "newChar");//替换
StringBuffer String StringBuilder String是不可变对象 final 类 对字符串频繁修改(如字符串连接)时,使用StringBuffer类可以大大提高程序执行效率
StringBuffer 线程安全 StringBuilder 线程不安全
Date
// 创建日期对象
Date date = new Date();
// 定制日期格式
SimpleDateFormat formater = new SimpleDateFormat("yyyy- MM-dd HH:mm:ss");
//format把data类型转换成String类型
String now = formater.format(date);
//parse把String类型转换成Date类型
date = formater.parse("2017-06-08 12:00:00");
Calendar 日历类
abstract 抽象类 Calendar calendar = Calendar.getInstance();
calendar.get(Calendar.DATE);
3.File IO
字节流和字符流相互转换 可以解决乱码问题
FileInputStream file = new FileInputStream("D:\\aaa\\aaa.txt");
InputStreamReader ir = new InputStreamReader(file,"utf-8");
BufferedReader br = new BufferedReader(ir);
字符流 所有的字符流都继承Reader Wirter
FileReader BufferedReader
Reader Wirter 读取文件类容是,使用FileReader fr = new FileReader("D:\\aaa\\aaa.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("D:\\aaa\\cc.txt");
BufferedWriter bw = new BufferedWriter(fw);
String str = br.readLine();
StringBuffer sb = new StringBuffer();
while(str!=null){
sb.append(str);
bw.write(str);
str = br.readLine();
}
System.out.println(sb.toString());
bw.close();
br.close();
字节流 ,所有的字节流,都继承于 InputStream outputStream
子类 FileInputStream DataInputStream
拷贝 不需要读取文件内容是 用字节流 FileInputStream input = new FileInputStream("D:\\aaa\\tuzideng1.jpg");
DataInputStream finput = new DataInputStream(input);
FileOutputStream out = new FileOutputStream("D:\\aaa\\tuzideng2.jpg");
DataOutputStream fout = new DataOutputStream(out);
//缓存
byte[] bytes = new byte[1024];
while (finput.read(bytes) != -1) {
fout.write(bytes);
}
finput.close();
fout.close();
File类常用方法
boolean exists( ) 判断文件或目录是否存在
boolean isFile( )
boolean isDirectory( )
String getPath( )
String getAbsolutePath( )
String getName( )
boolean delete( )
boolean createNewFile( )
long length()
mkdirs()
反射机制
反射机制是指在运行状态中,动态的获取信息以及动态调用对象方法的功能
<span>Java反射机制提供如下功能:</span>
<span>在运行时判断任意一个对象所属的类</span>
<span>在运行时构造任意一个类的对象</span>
<span>在运行时判段任意一个类所具有的成员变量和方法</span>
<span>在运行时调用任一个对象的方法</span>
反射的基本应用
1.获得Class对象<br>
<div><div>//第一种方式: </div><div>Class c1 = Class.forName("demo.Student"); </div></div>
<div>//第二种方式: </div><div>//java中每个类型都有class 属性. </div><div>Class c2 = Student.class; </div>
<div>//第三种方式: </div><div>//java语言中任何一个java对象都有getClass 方法 </div><div>Student stu = new Student(); </div><div>Class c3 = stu.getClass(); //c3是运行时类 </div>
2.判断是否为某个类的实例<br>
<div><span> </span>Student stu = new Student();</div><div><span> </span>Student.class.isInstance(stu);</div>
3.创建实例
<div><span></span><span>1使用Class对象的newInstance()方法来创建Class对象对应类的实例。</span><br>Class c1 = Student.class;</div><div><span> </span>Object obj = c1.newInstance();</div><div><span> </span>Student stu = (Student)obj;</div>
<span>2先通过Class对象获取指定的Constructor对象,来创建实例。这种方法可以用指定的构造器构造类的实例。</span>
4.获取方法
5.获取构造器信息
6.获取类的成员变量(字段)信息
7.调用方法
8.利用反射创建数组
多线程
Java中创建线程的两种方式
<div>继承java.lang.Thread类</div>
<div><span> </span>// 重写run()方法</div><div><span> </span>public void run() {</div><div><span> </span>for (int i = 1; i < 100; i++) {</div><div><span> </span>System.out.println(Thread.currentThread().getName() + ":" + i);</div><div><span> </span>}</div><div><span> </span>}</div><div><span> </span>public static void main(String[] args) {</div><div><span> </span>MyThread thread = new MyThread();</div><div><span> </span>thread.start(); // 启动线程}</div><div><span> </span>}</div>
<div>实现java.lang.Runnable接口</div>
<div>public class MyRunnable implements Runnable {</div><div><span> </span>public void run() {</div><div><span> </span>for (int i = 1; i < 100; i++) {</div><div><span> </span>System.out.println(Thread.currentThread().getName() + ":" + i);</div><div><span> </span>}</div><div><span> </span>}</div><div><br></div><div><span> </span>public static void main(String[] args) {</div><div><span> </span>MyRunnable myRunnable = new MyRunnable();</div><div><span> </span>Thread myThread = new Thread(myRunnable);</div><div><span> </span>myThread.start(); // 启动线程}</div><div><span> </span>}</div><div>}</div>
线程的状态
线程调度方法
setPriority(int newPriority)<span> </span>更改线程的优先级
<div>线程优先级由1~10表示,1最低,默认优先级为5</div><div>优先级高的线程获得CPU资源的概率较大</div>
<div>public class MyThread extends Thread {</div><div><br></div><div><span> </span>// 重写run()方法</div><div><span> </span>public void run() {</div><div><span> </span>for (int i = 1; i < 100; i++) {</div><div><span> </span>System.out.println(Thread.currentThread().getName() + ":" + i);</div><div><span> </span>}</div><div><span> </span>}</div><div><br></div><div><span> </span>public static void main(String[] args) {</div><div><span> </span>Thread t1 = new Thread(new MyThread(), "线程A");</div><div><span> </span>Thread t2 = new Thread(new MyThread(), "线程B");</div><div><span> </span>t1.setPriority(Thread.MAX_PRIORITY);</div><div><span> </span>t2.setPriority(Thread.MIN_PRIORITY);</div><div><span> </span>// 省略代码……</div><div><span> </span>}</div><div><br></div><div>}</div>
static void sleep(long millis)<span> </span>在指定的毫秒数内让当前正在执行的线程休眠
<div>让线程暂时睡眠指定时长,线程进入阻塞状态</div><div>睡眠时间过后线程会再进入可运行状态</div>
<div>public class Wait {</div><div><span> </span>public static void bySec(long s) {</div><div><span> </span>for (int i = 0; i < s; i++) {</div><div><span> </span>System.out.println(i + 1 + "秒");</div><div><span> </span>try {</div><div><span> </span>Thread.sleep(1000);</div><div><span> </span>} catch (InterruptedException e) {</div><div><span> </span>e.printStackTrace();</div><div><span> </span>}</div><div><span> </span>}</div><div><span> </span>}</div><div>}</div><div><br></div>
void join()<span> </span>等待该线程终止
使当前线程暂停执行,等待其他线程结束后再继续执行本线程
<div>public class MyThread implements Runnable {</div><div><span> </span>public void run() {</div><div><span> </span>for (int i = 0; i < 10; i++) {</div><div><span> </span>try {</div><div><span> </span>Thread.sleep(100);</div><div><span> </span>} catch (InterruptedException e) {</div><div><span> </span>// TODO Auto-generated catch block</div><div><span> </span>e.printStackTrace();</div><div><span> </span>}</div><div><span> </span>// 输出当前线程的信息</div><div><span> </span>System.out.println(Thread.currentThread().getName() + "运行:" + i);</div><div><span> </span>}</div><div><span> </span>}</div><div><br></div><div><span> </span>public static void main(String[] args) {</div><div><span> </span>System.out.println("*****线程强制执行******");</div><div><span> </span>// 创建子线程并启动</div><div><span> </span>Thread temp = new Thread(new MyThread());</div><div><span> </span>temp.start();</div><div><span> </span>for (int i = 0; i < 20; i++) {</div><div><span> </span>if (i == 5) {</div><div><span> </span>try {</div><div><span> </span>// 阻塞主线程,子线程强制执行</div><div><span> </span>temp.join();</div><div><span> </span>} catch (InterruptedException e) {</div><div><span> </span>e.printStackTrace();</div><div><span> </span>}</div><div><span> </span>}</div><div><span> </span>try {</div><div><span> </span>Thread.sleep(100);</div><div><span> </span>} catch (InterruptedException e) {</div><div><span> </span>// TODO Auto-generated catch block</div><div><span> </span>e.printStackTrace();</div><div><span> </span>}</div><div><span> </span>System.out.println(Thread.currentThread().getName() + "运行:" + i);</div><div><span> </span>}</div><div><span> </span>}</div><div>}</div>
static void yield()<span> </span>暂停当前正在执行的线程对象,并执行其他线程
<div>暂停当前线程,允许其他具有相同优先级的线程获得运行机会</div><div>该线程处于就绪状态,不转为阻塞状态<br><div>只是提供一种可能,但是不能保证一定会实现礼让</div></div>
<div>public class MyThread implements Runnable {</div><div><span> </span>public void run() {</div><div><span> </span>for (int i = 0; i < 5; i++) {</div><div><span> </span>System.out.println(Thread.currentThread().getName() + "正在运行:" + i);</div><div><span> </span>if (i == 3) {</div><div><span> </span>System.out.print("线程礼让:");</div><div><span> </span>Thread.yield();</div><div><span> </span>}</div><div><span> </span>}</div><div><span> </span>}</div><div><br></div><div><span> </span>public static void main(String[] args) {</div><div><span> </span>MyThread my = new MyThread();</div><div><span> </span>Thread t1 = new Thread(my, "线程A");</div><div><span> </span>Thread t2 = new Thread(my, "线程B");</div><div><span> </span>t1.start();</div><div><span> </span>t2.start();</div><div><span> </span>}</div><div>}</div>
void interrupt()<span> </span>中断线程
boolean isAlive()<span> </span>测试线程是否处于活动状态
线程通信方法
wait() 调用wait()方法会挂起当前线程,并释放共享资源的锁
notify() 调用任意对象的notify()方法会在因调用该对象的wait()方法而阻塞的线程中随机选择一个线程解除阻塞,但要等到获得锁后才可真正执行
notifyAll() 调用了notifyAll()方法会将调用该对象的wait()方法而阻塞的所有线程一次性全部解除阻塞
wait(),notify(),notifyAll()这三个方法都是Object类当中的final方法,被所有类继承且不允许重写。这三个方法只能在同步方法或者同步代码块中使用,否则会抛出异常
线程同步方法synchronized
<div>就是为当前的线程声明一个锁<br>使用synchronized修饰的方法控制对类成员变量的访问<br></div>
<div>访问修饰符 synchronized 返回类型 方法名(参数列表){……}</div><div> 或者</div><div>synchronized 访问修饰符 返回类型 方法名(参数列表){……}</div>
<div>使用synchronized关键字修饰的代码块</div>
<div>synchronized(syncObject){</div><div> //需要同步的代码</div><div>}</div>
java网络编程
Socket
基于TCP协议的Socket网络通信<br><div>用来实现双向安全连接网络通信<br><div>进行网络通信时,Socket需要借助数据流来完成数据的传递工作</div></div>
客户端
<div>public class ClientLogin {</div><div><span> </span>public static void main(String[] args) {</div><div><span> </span>//1.创建一个socket对象(指定服务器IP,端口号)</div><div><span> </span>try {</div><div><span> </span>Socket socket = new Socket("localhost",8000);</div><div><span> </span>//2.打开输出 流,发送请求</div><div><span> </span>OutputStream os = socket.getOutputStream();</div><div><span> </span>InputStream is = socket.getInputStream();</div><div><span> </span>String info = "用户名:TOM,密码:1234";</div><div><span> </span>os.write(info.getBytes());<span> </span></div><div><span> </span>socket.shutdownOutput();</div><div><span> </span>//服务器接收客户端反馈<span> </span></div><div><span> </span>BufferedReader br = new BufferedReader(new InputStreamReader(is));</div><div><span> </span>info = "";</div><div><span> </span>while((info=br.readLine())!=null){</div><div><span> </span>System.out.println("我是客户端,服务器的响应是:"+info);</div><div><span> </span>}</div><div><span> </span>os.close();</div><div><span> </span>is.close();</div><div><span> </span>socket.close();</div><div><span> </span>} catch (UnknownHostException e) {</div><div><span> </span>// TODO Auto-generated catch block</div><div><span> </span>e.printStackTrace();</div><div><span> </span>} catch (IOException e) {</div><div><span> </span>// TODO Auto-generated catch block</div><div><span> </span>e.printStackTrace();</div><div><span> </span>}</div><div><span> </span></div><div><span> </span>//3.关闭资源</div><div><span> </span></div><div><span> </span>}</div><div>}</div>
服务端
<div>public class ServerLogin {</div><div><span> </span>public static void main(String[] args) {</div><div><span> </span>//1.创建一个ServerSocket对象 指定端口号</div><div><span> </span>try {</div><div><span> </span>ServerSocket serversocket = new ServerSocket(8000);</div><div><span> </span>//2.监听客户端请求</div><div><span> </span>Socket socket = serversocket.accept();</div><div><span> </span>//3.打开输入流,处理用户请求</div><div><span> </span>InputStream is = socket.getInputStream();<span> </span></div><div><span> </span>OutputStream os = socket.getOutputStream();</div><div><span> </span>BufferedReader reader = new BufferedReader(new InputStreamReader(is));</div><div><span> </span>String info = null;</div><div><span> </span>while((info=reader.readLine())!=null){</div><div><span> </span>System.out.println("我是服务器,客户端信息为:"+info);</div><div><span> </span>}</div><div><span> </span>socket.shutdownInput();</div><div><span> </span>//服务器给客户端一个响应<span> </span></div><div><span> </span>//1.打开输出流,发送数据<span> </span></div><div><span> </span>info = "欢迎您,登录成功!";</div><div><span> </span>os.write(info.getBytes());</div><div><span> </span>//4.关闭资源</div><div><span> </span>reader.close();</div><div><span> </span>is.close();</div><div><span> </span>os.close();</div><div><span> </span>socket.close();</div><div><span> </span>serversocket.close();</div><div><span> </span></div><div><span> </span>} catch (IOException e) {</div><div><span> </span>// TODO Auto-generated catch block</div><div><span> </span>e.printStackTrace();</div><div><span> </span>}</div><div><span> </span></div><div><span> </span></div><div><span> </span></div><div><span> </span>}</div><div>}</div>
<h3>http<br></h3>
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议<br>
<span>HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的</span><a target="_blank">HTTP</a><span>通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。</span>
xml
<div>DOM</div>
<div>基于XML文档树结构的解析</div><div>适用于多次访问的XML文档</div><div>特点:比较消耗资源</div>
读取dom
<div>DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();</div><div><span> </span>DocumentBuilder db = bf.newDocumentBuilder();</div><div><span> </span>Document doc = db.parse("src/phones.xml");</div>
读取节点的属性,和文本
<div>NodeList brandList = doc.getElementsByTagName("Brand");</div><div><br></div><div><span> </span>for (int i = 0; i < brandList.getLength(); i++) {</div><div><span> </span>Node brand = brandList.item(i);</div><div><span> </span>Element element = (Element) brand;</div><div><span> </span>String attrValue = element.getAttribute("name");</div><div><span> </span>NodeList types = element.getChildNodes();</div><div><span> </span>System.out.println(types.getLength());</div><div><span> </span>for (int j = 0; j < types.getLength(); j++) {</div><div><span> </span>if (types.item(j).getNodeType() == 1) {</div><div><span> </span>Element typeElement = (Element) types.item(j);</div><div><span> </span>String type = typeElement.getTextContent();</div><div><span> </span>System.out.println("手机:" + attrValue + type);</div><div><span> </span>}</div><div><br></div><div><span> </span>}</div><div><span> </span>}</div>
创建节点,属性,文本
<div>Element brandElement = doc.createElement("Brand");</div><div><span> </span>brandElement.setAttribute("name", "MOTO");</div><div><span> </span>Element type = doc.createElement("type");</div><div><span> </span>type.setTextContent("A1680");</div><div><span> </span>brandElement.appendChild(type);</div><div><span> </span>Element pe = (Element) doc.getElementsByTagName("PhoneInfo").item(0);</div><div><span> </span>pe.appendChild(brandElement);</div>
保存xml
<div>TransformerFactory tf = TransformerFactory.newInstance();</div><div><span> </span>Transformer transformer = tf.newTransformer();</div><div><span> </span>DOMSource domSource = new DOMSource(doc);</div><div><span> </span>transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");</div><div><span> </span>FileOutputStream fos = new FileOutputStream("src/phones1.xml");</div><div><span> </span>StreamResult result = new StreamResult(fos);</div><div><span> </span>transformer.transform(domSource, result);</div>
<div>DOM4J</div>
<div>非常优秀的Java XML API</div><div>性能优异、功能强大</div><div>开放源代码</div>
读取dom
<div>SAXReader saxReader = new SAXReader();</div><div><span> </span>Document document = saxReader.read("NewFile.xml");</div>
读取节点的属性,和文本
<div>Element root =document.getRootElement();</div><div><span> </span>List<Element> brandList = root.elements();</div><div><span> </span>for(Element brand:brandList) {</div><div><span> </span>Attribute attr=<span> </span>brand.attribute("name");</div><div><span> </span>System.out.println(attr.getValue());</div><div><span> </span>List<Element> typeList = brand.elements();</div><div><span> </span>for(Element type:typeList) {</div><div><span> </span>System.out.println(type.getText());</div><div><span> </span>}</div><div><span> </span>}</div>
创建节点,属性,文本
<div> Element newBrand = root.addElement("Brand");</div><div><span> </span> newBrand.addAttribute("name", "小米");</div><div><span> </span> Element newType = newBrand.addElement("type");</div><div><span> </span> newType.setText("小米6");</div>
保存xml
<div>OutputFormat format =OutputFormat.createCompactFormat();</div><div><span> </span>format.setEncoding("gb2312");</div><div><span> </span>FileWriter file = new FileWriter("phones2.xml");</div><div><span> </span>XMLWriter writer = new XMLWriter(file,format);</div><div><span> </span>writer.write(document);</div><div><span> </span>writer.close();</div>
0 条评论
下一页