Java基础高级部分(一)
1. 集合部分
1.1 HashMap排序
package cn.Douzi.hashMap01; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Set; import javax.jws.soap.SOAPBinding.Use; public class hashMap_demo01 { public static void main(String[] args) { HashMap<Integer, User> hashMap = new HashMap<Integer, User>(); User user = new User();
user.setName("张三");
user.setAge(23); hashMap.put(1, user); User user2 = new User();
user2.setName("李四");
user2.setAge(24); hashMap.put(2, user2); User user3 = new User();
user3.setAge(21);
user3.setName("王五"); hashMap.put(3, user3); System.out.println("排序前HashMap:" + hashMap); HashMap<Integer, User> sortedHashMap = sortHashMap(hashMap); System.out.println("排序后:" + sortedHashMap); } private static HashMap<Integer, User> sortHashMap(
HashMap<Integer, User> hashMap) { /**
* 创建一个有序的HashMap数据结构,LinkedHashMap
*/
LinkedHashMap<Integer, User> newHashMap = new LinkedHashMap<Integer, User>(); //凡是要对集合排序,首先想到的就是集合的工具类
//把Map结构转换为list结构
//把Map转换为Set集合
Set<Entry<Integer, User>> entrySet = hashMap.entrySet();
//把Set集合转换为List
ArrayList<Entry<Integer, User>> list = new ArrayList<>(entrySet);
Collections.sort(list, new Comparator<Entry<Integer, User>>() { @Override
public int compare(Entry<Integer, User> o1, Entry<Integer, User> o2) {
// TODO Auto-generated method stub
// -1:正序排序; 前面-后面:正序;后面-前面:倒序
return o2.getValue().getAge() - o1.getValue().getAge();
}
}); //将排好顺序的list转换为LinkedHashMap
for (int i = 0; i < list.size(); i++) {
Entry<Integer, User> entry = list.get(i);
newHashMap.put(entry.getKey(), entry.getValue());
} return newHashMap;
}
}
2.java中的引用类型
- 强引用
- 软引用:SoftReference
- 弱引用:WeakReference
- 虚引用:PhantomReference
对象的可及性:
- 强可及对象,永远不会被GC回收
- 软可及对象:当系统内存不足的时候,被GC回收。
- 弱可及对象:当系统GC发现这个对象,就被回收
package cn.Douzi.Reference; import java.lang.ref.PhantomReference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference; public class ReferenceTest { public static void main(String[] args) { //强引用
// String str = "abc"; //常量池 //1. 在堆内存中创建了String对象 2.在常量池中创建了abc对象
String str = new String("abc"); //创建一个软引用,引用到str
SoftReference<String> sfr = new SoftReference<String>(str); //创建一个弱引用,引用到str
WeakReference<String> wrf = new WeakReference<String>(str); //虚引用:检测对象是否被虚拟机回收掉
// PhantomReference //相当于去掉了强引用链
str = null; //清楚软引用的引用链
sfr.clear(); System.gc(); //回收了堆内存, 无法回收常量池的内存 String srfString = sfr.get(); String wrfString = wrf.get(); System.out.println("软引用获取到的对象:" + srfString);
System.out.println("弱引用获取到的对象:" + wrfString); }
}
3. 多线程线程池部分
- 需求:控制一个方法的并发量,比如 同时只能有5个线程进来
- 注意:不要用 synchronized,用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去。
3.1 使用 Semaphore
package cn.Douzi.Thread_Pool; import java.lang.reflect.Method;
import java.util.concurrent.Semaphore; public class ThreadPoolTest { //信号量
private static Semaphore semaphore = new Semaphore(5); //允许个数, 相当于放了5把锁 public static void main(String[] args) { for (int i = 0; i < 100; i++) {
new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
try {
method();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
} //同时最多只运行5个进程过来
public static void method() throws InterruptedException { semaphore.acquire(); //获取一把锁 System.out.println("ThreadName" + Thread.currentThread().getName()+"进来了"); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println("ThreadName="+Thread.currentThread().getName()+"出去了"); semaphore.release(); //释放一把锁 } }
3.2 线程池
线程池的启动策略
系统自带的线程池
//网络访问框架,都要用线程池
private static Executor executors = Executors.newCachedThreadPool(); //缓存线程池
private static Executor executor2 = Executors.newFixedThreadPool(5); //固定线程个数的线程
private static Executor executor3 = Executors.newScheduledThreadPool(5); //计划任务线程池
private static Executor executor4 = Executors.newSingleThreadExecutor(); //单个线程的线程池
手写线程池
/*
* 参数1:corePoolSize:核心池大小
* 参数2:maximumPoolSize:最大线程池上限个数
* 参数3:keepAliveTime:保存最长时间,任务执行完之后,要裁员的延时
* 参数4:unit:时间单位
* 参数5:workQueue:用于存储任务的工作队列(即将被执行的任务)(BlockingQueue)
* 参数6:ThreadFactory: 线程工厂, 用来创建线程的
*
*/
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 10, 1, TimeUnit.SECONDS, blockingQueue, threadFactlory);
创建一个线程工厂
ThreadFactory threadFactlory = new ThreadFactory() { //线程安全的int的包装类
AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public Thread newThread(Runnable r) {
//创建一个线程,然后把r赋值给该线程
Thread thread = new Thread(r);
thread.setName("MyThread=" + atomicInteger.getAndIncrement()); return thread;
}
};
完整创建核心池
package cn.Douzi.Thread_Pool; import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; public class ThreadPoolTest02 { //网络访问框架,都要用线程池
private static Executor executors = Executors.newCachedThreadPool(); //缓存线程池
private static Executor executor2 = Executors.newFixedThreadPool(5); //固定线程个数的线程
private static Executor executor3 = Executors.newScheduledThreadPool(5); //计划任务线程池
private static Executor executor4 = Executors.newSingleThreadExecutor(); //单个线程的线程池 public static void main(String[] args) { // BlockingQueue<E> //单端队列
// BlockingDQueue //双端队列
LinkedBlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>(100); //该容器的最大上限
//创建一个线程工厂
ThreadFactory threadFactlory = new ThreadFactory() { //线程安全的int的包装类
AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public Thread newThread(Runnable r) {
//创建一个线程,然后把r赋值给该线程
Thread thread = new Thread(r);
thread.setName("MyThread=" + atomicInteger.getAndIncrement()); return thread;
}
}; /*
* 参数1:corePoolSize:核心池大小
* 参数2:maximumPoolSize:最大线程池上限个数
* 参数3:keepAliveTime:保存最长时间,任务执行完之后,要裁员的延时
* 参数4:unit:时间单位
* 参数5:workQueue:用于存储任务的工作队列(即将被执行的任务)(BlockingQueue)
* 参数6:ThreadFactory: 线程工厂, 用来创建线程的
*
*/
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 10, 1, TimeUnit.SECONDS, blockingQueue, threadFactlory); /**
* 线程不是越多越好,Google工程给了一个推荐值:线程的个数=CPU核心数+1=5
*/ //用自己打造的线程池
for (int i = 0; i < 110; i++) {
poolExecutor.execute(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
try {
method();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}); } //用系统自带的线程池
// for (int i = 0; i < 100; i++) {
// executor2.execute(new Runnable() {
//
// @Override
// public void run() {
// // TODO Auto-generated method stub
// try {
// method();
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// });
// } } //同时最多只运行5个进程过来
public static void method() throws InterruptedException { System.out.println("ThreadName= " + Thread.currentThread().getName()+"进来了"); try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println("ThreadName= "+Thread.currentThread().getName()+"出去了"); } }
注意:核心池为0,执行完会自动退出;核心池 > 0不会被退出。
Java基础高级部分(一)的更多相关文章
- Java基础高级一(正则表达式)
1.正则语法:元字符,量词,范围,组,属性 2.String类常用正则方法split,indexOf,replaceAll 3.Java正则类Pattern,Match而的使用 1.String常用方 ...
- Java 基础高级2 网络编程
1.协议的概念:通信双方事先约定好的通信规则 2七层网络通信协议:应用成,表示层,会话层,传输层,网络层,数据链路层 3.TCP/IP协议:点对点通信,三层握手,安全有保证 4.UDP协议;广播协议, ...
- Java基础高级二(多线程)
1.进程和线程的区别:线程是轻量级的,本省不会持太多资源,需要的时候向进程申请 2.线程的状态:创建,可执行,执行中,等待,休眠,阻塞 3.线程状态之间的转换 4.线程API:Thread类,Runn ...
- java基础高级2 MySQL 高级
1.数据库简介 DDL(数据定义语言) DML(数据操作语言) 2. 准备工作 解压缩文件目录下找到my.ini文件,文件中写入[mysql] default-character set= utf-8 ...
- Java基础高级篇 NIO
nio模型与io模型的对比 netty 是什么 怎么使用
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- 转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
原文:http://www.cnblogs.com/wang-meng/p/5898837.html 一:继承.抽象类与接口区别.访问控制(private, public, protected,默认) ...
- JAVA(一)JAVA基础/面向对象基础/高级面向对象
成鹏致远 | lcw.cnblog.com |2014-01-23 JAVA基础 1.开发环境搭建 JAVA程序的执行流程 JAVA命令->要使用一个*.class文件(类文件)->通过c ...
随机推荐
- TP5调用微信JSSDK 教程 - 测试成功案例
前提:必需了解TP5的全局配置,扩展目录,composer,依赖注入的概念: 第一步:首先配置加载官方JSSDK类 "autoload": { "files": ...
- Gitbash如何支持交互式命令?如何让gitbash的命令不乱码?winpty是什么鬼?干嘛用的?
winpty 是一个 Windows 软件包,提供了类似 Unix pty-master 一样的接口,用于实现控制台程序之间的通讯.该软件包包括一个开发库 (libwinpty) 和一个用于 ygwi ...
- python学习日记(文件操作练习题)
登录注册(三次机会) name = input('请注册姓名:') password = input('请注册密码:') with open('log',mode='w',encoding='utf- ...
- 动态逆序对[CDQ分治]
题面 luogu cdq分治入门 注意删的是值不是位置! #include <cstdio> #include <algorithm> #include <cmath&g ...
- Java和操作系统交互细节
结合 CPU 理解一行 Java 代码是怎么执行的 根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. enter image des ...
- BSGS算法及扩展
BSGS算法 \(Baby Step Giant Step\)算法,即大步小步算法,缩写为\(BSGS\) 拔山盖世算法 它是用来解决这样一类问题 \(y^x = z (mod\ p)\),给定\(y ...
- 用python批量向数据库(MySQL)中导入数据
用python批量向数据库(MySQL)中导入数据 现有数十万条数据,如下的经过打乱处理过的数据进行导入 数据库内部的表格的数据格式如下与下面的表格结构相同 Current database: pyt ...
- Lisp经典算法
求平方根 SUCCESSIVE AVERAGING DUE TO HERON OF ALEXANDRIA ** TO FIND AN APPROXIMATION TO SQRT(X) ** MAKR ...
- 在Vue框架中使用百度地图
1.首先在index.html中引入百度地图 <script type="text/javascript" src="http://api.map.baidu.co ...
- CF132E Bits of merry old England
解:略一思索:网络流啊!(别问我是怎么想到的......) 发现跟志愿者招募有点像.于是把图建一下,在下面开一条通道,但是每个点又都要经过,这时我们就无脑上下界一波. 通道向点连边,有费用.每个点向它 ...