entry : entries) {
System.out.println(entry);
}
```
# Collections集合工具类
- **Collection**是集合的根**接口**,定义了集合操作元素的方法
- **Collections**是集合的工具**类**,定义了集合操作元素的静态方法
# 集合和数组之间的转换
- **集合转换为数组**:使用Collection接口中的toArray()方法
```java
Object[] obj = 集合对象.toArray();
List list = new ArrayList();
list.add(123);
list.add(63);
list.add(3);
Integer[] nums =(Integer[]) list.toArray();
```
- **数组转换为集合**
```java
//一个数组对象
int[] nums ={11,2,66,3,6,21};
//定义集合对象
List list = new ArrayList();
//遍历数组的同时添加到集合中
for(int i:nums){
list.add(i);
}
```
# 文件类File
Java中的File类,表示本地硬盘中的文件(文件和目录)的一个类。
通过这个类创建的对象,可以操作对应的文件。
## 递归遍历文件夹
```java
package com.hqyj.FileTest;
import java.io.File;
import java.util.Date;
public class Test3 {
//查看某个目录下的所有文件
public static void main(String[] args) {
File source = new File("E:\\adobe");
Test3 t = new Test3();
t.fun(source);
}
/*
* 递归遍历文件夹
* */
public void fun(File source) {
//输出某个目录中超过3个月未使用且大于500MB的文件
/*
long start = source.lastModified();
long end = System.currentTimeMillis();
if ((end - start) / 1000 / 3600 / 24 > 90 && source.length() / 1024 / 1024 > 500) {
System.out.println(source.getName() + "\t" + new Date(source.lastModified()) + "\t" + source.length() / 1024 / 1024);
}*/
//判断是否为目录
if (source.isDirectory()) {
//将其展开
for (File child : source.listFiles()) {
//因为子文件有可能是目录,继续调用本方法
fun(child);
}
}
}
}
```
# IO
I:Input输入
O:Output输出
# 流Stream
在Java中,**流用于表示计算机硬盘与内存之间传输数据的通道。**
将**内存**中的数据存入**到硬盘**中,称为**写write**,也称为**输出Output**。
将**硬盘**中的数据存入**到内存**中,称为**读read**,也称为**输入Input**。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7MwXIFFF-1670151305764)(F:\221001\笔记\JavaAdv06.assets\image-20221130160037535.png)]
## 流的分类
Java中将流定义为类,以对象的形式表现流。流有"四大家族",是所有流的父类。
### 字节输入流InputStream
**FileInpuStream**、**ObjectInputStream**
### 字节输出流OutputStream
**FileOutputStream**、**ObjectOutputStream**
### 字符输入流Reader
FileReader、**BufferedReader**、OutputStreamWriter
### 字符输出流Writer
FileWriter、**BufferedWriter**、InputStreamReader
**按方向分类**
- 输入流:InputStream、Reader
- 将硬盘中的数据读取到内存中
- 输出流:OutputStream、Writer
- 将内存中的数据写入到硬盘中
**按类型分**
- 字节流:InputStream、OutputStream
- 读写非文本类型文件。如图片、音视频、其他文件等。
- 字符流:Reader、Writer
- 读写纯文本类型文件。如txt、md等
1.如要将硬盘中某个txt文件中的内容读取到程序中,使用Reader
2.如要将硬盘中的某个图片读取到程序中,使用InputStream
3.如要将程序中的文本写入到硬盘中为txt类型文件时,使用Writer
4.如要将程序中的数据写入到硬盘中为非文本文件时,使用OutputStream
## 流的四个父类的特点
- 这四个父类都是在java.io包下,都是抽象类,不能直接创建其对象,使用其子类创建对象
- 这四个父类中都定义了close()方法,用于关闭流对象,释放资源
- 输入流(InputStream和Reader)都有read()方法读取数据到内存中,输出流都有write()方法写入数据到硬盘中
- 输出流(OutputStream和Writer)都有flush()方法,用于将流中的数据冲刷到硬盘中
- 在使用输出流对象时,一定要调用flush()或close()方法后,才能真正将数据写入到硬盘中
- 所有的流中,以Stream结尾,都是字节流,数据以字节传输;以Reader或Writer结尾的,都是字符流,数据以字符传输
- 读取硬盘中的数据,使用输入流,读取的文件必须存在;将数据写入到硬盘中,使用输出流,文件可以不存在,但父目录必须存在。
- 读入或写入文本时,使用字符流;读取或写入非文本时,使用字节流
# FileInputStream文件字节输入流(掌握)
按字节读取硬盘中的文件 |
# FileOutputStream文件字节输出流(掌握)
按字节将内存中的数据写入到硬盘中。
* 1.调用copyDir方法,判断发现source是一个文件夹,创建目标文件夹target:“F:\221001\笔记副本”
* 2.遍历source,如其中有xxx.md文件,即child
* 此时的source是F:\221001\笔记\xxx.md,即child
* 此时的target是F:\221001\笔记副本\xxx.md,用File(File parent,String child)构造方法表示这个目标文件
* 所以创建File newTarget = new File(target,child.getName())
*
* */
copyDir(source, target);
}
/*
* 定义复制文件夹的方法
* */
public static void copyDir(File source, File target) {
//如果是文件,调用单文件复制的方法
if (source.isFile()) {
copyFile(source, target);
} else {//如果是文件夹
//创建要复制的目标文件夹
target.mkdir();
//展开原文件夹
for (File child : source.listFiles()) {
//定义复制后的新目标文件
//如source为F:\221001\笔记\day1.md时,递归调用的target为F:\221001\笔记副本\day1.md
File newTarget = new File(target, child.getName());//这里使用File(File parent,String child)构造方法创建target对象
//递归调用的原文件依然是当前遍历出来的子文件,目标文件就是最终复制的F:\221001\笔记副本\day1.md
copyDir(child, newTarget);
}
}
}
/*
* 定义单文件复制的方法
* */
public static void copyFile(File source, File target) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//创建用于输入输出的流对象
fis = new FileInputStream(source);
fos = new FileOutputStream(target);
//定义字节数组
byte[] bytes = new byte[1024 * 1024 * 8];
//按数组读取
int count = fis.read(bytes);
while (count != -1) {
fos.write(bytes, 0, count);
count = fis.read(bytes);
}
} catch (FileNotFoundException e) {
System.out.println("文件不存在" + e);
} catch (IOException e) {
System.out.println("读写异常" + e);
} finally {
try {
if (fis != null) {
fis.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
System.out.println("关闭流对象异常" + e);
}
}
}
}
```
# FileReader文件字符输入流
按字符读取文件。
## 构造方法
|
# FileWriter文件字符输出流 |
# BufferedReader缓冲字符输入流(掌握)
自带缓冲区(字符数组)的字符输入流。默认字符数组大小为8192,每次最多读取8192个字符。
在读取纯文本文件(txt或md)时,首选该类。
# ObjectOutputStream对象字节输出流(序列化)(掌握)
**序列化:将对象转换为文件的过程**
**被序列化的对象,必须要实现Serializable接口。**
这个接口是一个特殊的接口,没有定义任何方法,只是给该类加上标记,表示该类可以被序列化
**反序列化:将文件转换为对象的过程**
# 序列化和反序列化案例
Person类,实现Serializable接口
```java
package com.hqyj.ObjectStream;
import java.io.Serializable;
/*
* 如果希望该类的对象能序列化,写入对象到本地,必须要实现Serializable接口
* Serializable接口中没有任何方法,是一个标记接口,表示该类的对象可以被序列化
* */
public class Person implements Serializable {
private String name;
private int age;
private String sex;
//省略getter/setter和toString()
}
```
Main类
```java
package com.hqyj.ObjectStream;
import java.io.*;
import java.util.ArrayList;
public class Test1 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person p1 = new Person("王海", 22, "男");
Person p2 = new Person("赵敏", 24, "女");
Person p3 = new Person("刘涛", 21, "女");
ArrayList list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
//创建OutStream的实现类,设置写入的文件路径
OutputStream os = new FileOutputStream("F:\\221001\\person.p");
//创建对象输出字节流,参数为OutStream类型
ObjectOutputStream oos = new ObjectOutputStream(os);
//调用writeObject(Object obj)方法,将对象写入到硬盘中(序列化)
oos.writeObject(list);
oos.close();
//创建对象输入字节流,将上一步保存的文件进行反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("F:\\221001\\person.p"));
//使用readObject()方法,将写入的文件进行读取(反序列化)
ArrayList pList = (ArrayList) ois.readObject();
for (Person person : pList) {
System.out.println(person);
}
ois.close();
}
}
```
# 转换流
实际属于字符流,作用为将一个字节流对象转换为字符流对象
## OutputStreamWriter
将字节输出流转换为字符输出流
## InputStreamReader
将字节输入流转换为字符输入流
## 转换流的使用
如果只提供了一个字节流,但要向其中写入或读取字符时,就可以使用转换流将字节流转换为字符流。
使用字符流读写字符时比字节流更方便。
```java
//假如只提供一个字节输出流对象
FileOutputStream fos = new FileOutputStream("文件路径");
//fos.write(97);//这时如果写入数据,只能按字节写入,不方便
//使用转换流,将字节流对象fos转换为字符流对象
Writer writer = OutputStreamWriter(fos);
//将字符流对象writer包装成缓冲字符流对象
BufferedWriter bw = new BufferedWriter(writer);
bw.write("hello你好");
bw.newLine();
bw.close();
//只提供字节输入流对象
FileInputStream fis = new FileInputStream("221001.txt");
// fis.read()每次只能读取一个字节
//将字节流转换为字符流
Reader reader = new InputStreamReader(fis);
//创建缓冲字符流,将字符流包装为缓冲流
BufferedReader br = new BufferedReader(reader);
//整行读取
while (br.ready()) {
System.out.println(br.readLine());
}
br.close();
```
# 网络编程
## InetAddress类
表示IP对象的一个类
```java
public static void main(String[] args) throws UnknownHostException {
//获取本机的ip对象
// InetAddress ip = InetAddress.getLocalHost();
//获取域名
// System.out.println(ip.getHostName());
//获取真实ip地址
// System.out.println(ip.getHostAddress());
//getByName(域名) 得到域名对应的ip对象
//localhost域名表示本机,对应的ip地址为127.0.0.1
InetAddress ip = InetAddress.getByName("localhost");
//获取域名
System.out.println(ip.getHostName());
//获取ip地址
System.out.println(ip.getHostAddress());
}
```
## Socket类和ServerSocket类
都属于Socket(套接字)对象,表示网络中的某个端点
- Socket指普通端
- ServerSocket指服务器端
# 使用套接字对象实现两个端点(Socket和ServerSocket)之间发送文件
## 服务器端
```java
package com.hqyj.uploadTest;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 使用套接字对象,实现客户端向服务端发送文件
*
* 定义服务端套接字对象
* */
public class Server {
public static void main(String[] args) throws IOException {
//以本机创建服务端套接字对象
ServerSocket server = new ServerSocket(8899, 100, InetAddress.getLocalHost());
//等待客户端连接,返回连接的客户端套接字对象
Socket client = server.accept();
//定义要将读取到的数据写入到本地的文件字节输出流对象
FileOutputStream fos = new FileOutputStream("上传文件.md");
//获取客户端与服务端的输入流对象,读取发送的数据
InputStream is = client.getInputStream();
//定义读取的字节数组
byte[] bytes = new byte[1024 * 1024 * 8];
int count = is.read(bytes);
while (count != -1) {
//将读取到的数据写入到本地
fos.write(bytes, 0, count);
count = is.read(bytes);
}
fos.close();
is.close();
}
}
```
## 客户端
```java
package com.hqyj.uploadTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
/*
* 定义客户端套接字对象
* */
public class Client {
public static void main(String[] args) throws IOException {
//创建客户端套接字对象,连接指定的服务端套接字对象
Socket client = new Socket("192.168.31.39", 8899);
//获取客户端与服务端的输出流对象
OutputStream os = client.getOutputStream();
//成功连接后,将某个文件发送给服务端
//定义要发送的文件对象
File file = new File("F:\\221001\\笔记\\面向对象部分回顾.md");
//读取要发送的文件
FileInputStream fis = new FileInputStream(file);
//定义字节数组
byte[] bytes = new byte[1024 * 1024 * 8];
//循环读取要发送的文件
int count = fis.read(bytes);
while (count != -1) {
//将读取到的数据写入到客户端套接字与服务端套接字的通道中
os.write(bytes,0,count);
count = fis.read(bytes);
}
fis.close();
os.close();
}
}
```
# 进程和线程
## 进程Process
进程就是操作系统中执行的程序。一个程序就是一个执行的进程实体。
每个运行中的进程,都有属于它独立的内存空间,各个进程互不影响。
## 线程Thread
线程是一个进程中的执行单元,一个进程中可以有多个线程。
多个线程,可以访问同一个进程中的资源。
每个线程都有一个独立的栈空间,这些线程所在的栈空间位于同一个进程空间中。
## 多线程
如果一个进程中,同时在执行着多个线程,就称为多线程。
多线程可以提高程序执行效率。如多个窗口卖票,可以加快卖票的效率。
其实每个执行的Java程序,都是多线程执行,main方法称为主线程,还有gc线程(守护线程)在同时运行。
如有一个工厂,工厂中有很多车间,每个车间有很多流水线。
工厂就是内存,车间就是各个进程,每个流水线都是一个进程中的一个线程。
# 并行和并发
## 并行
各个进程同时执行,称为并行。
## 并发
多个线程同时执行,称为并发。
# 同步和异步
## 同步
所有的任务排队执行,称为同步执行。
## 异步
在执行任务A的同时,执行任务B,称为异步执行。
# Java中的线程Thread类
Java中,线程以对象的形式存在。
Thread类表示线程类
# 实现多线程
## 方式一:继承Thread类
- 1.创建一个类,继承Thread类
- 2.重写Thread类中的run()方法
- 3.创建自定义的线程子类对象后,调用start()方法
## 方式二:实现Runnable接口(建议使用)
由于Java中是单继承,如果某个类已经使用了extends关键字去继承了另一个类,这时就不能再通过extends继承Thread实现多线程。
就需要实现Runnable接口的方式实现多线程。
- 1.自定义一个类,实现Runnable接口
- 2.重写run()方法,将多线程要执行的内容写在该方法中
- 3.创建Runnable接口的实现类对象
- 4.使用构造方法Thread(Runnable target)或Thread(Runnable target,String name)将上一步创建的Runnable实现类对象包装为Thread对象
## 方式三:使用匿名内部类
如果不想创建一个Runnable接口的实现类,就可以使用匿名内部类充当Runnable接口的实现类
# 线程的生命周期
线程的初始化到终止的整个过程,称为线程的生命周期。

## 新生状态
当线程对象被创建后,就进入了新生状态。
## 就绪状态
当某个线程对象调用了start()方法后,就进入了就绪状态。
在这个状态下,线程对象不会做任何事情,只在等他CPU调度。
## 运行状态
当某个线程对象得到CPU时间片(CPU执行这个线程的机会所给的时间),则进入运行状态,开始执行run()方法。
不会等待run()方法执行完毕,只会在指定的时间内尽可能地执行run()方法。只要调用玩run()方法后,就会再进入就绪状态。
## 阻塞状态
如果某个线程遇到了sleep()方法或wait()方法时,就会进入阻塞状态。
sleep()方法会在指定时间后,让线程重新就绪。
wait()方法只有在被调用notify()或notifyAll()方法唤醒后才能重新就绪。
## 终止状态
当某个线程的run()方法中的所有内容都执行完,就会进入终止状态,意味着该线程的使命已经完成。
# 守护线程
如果将一个线程设置setDeamon(true),表示该线程为守护线程。
守护线程会随着其他非守护线程终止而终止。
```java
package com.hqyj.DaemonTest;
/*
* Test类是一个自定义线程类,死循环输出
* */
public class Test implements Runnable {
public static void main(String[] args) {
Thread thread = new Thread(new Test());
//将自定义线程类设置为守护线程
thread.setDaemon(true);
thread.start();
//main线程终止,守护线程也会终止
for (int i = 0; i < 100; i++) {
System.out.println("main方法中的循环执行中");
}
}
@Override
public void run() {
while (true) {
System.out.println("守护线程执行中。。。");
}
}
}
```
# 多线程访问同一个资源
## 可能出现的问题
如银行存款100,同一时刻在手机和ATM一起取出,如果用多线程模拟,可能会出现两个线程都取出100的情况。要避免这种情况发生。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xmjaT6FX-1670151385957)(F:\221001\笔记\JavaAdv07.assets\image-20221202145400278.png)]
本应该大于售出后再减,再打印剩余,由于线程A在打印"售出一张"后,还没来得及执行后续内容,其他线程就开始执行了。
## 出现问题的原因
由于线程调用start()方法后,就进入就绪状态。如果获得了CPU时间片,就开始调用run()方法,调用run()方法后,就会再次进入就绪状态,不会等待run()方法执行完毕,所以在线程A执行run()方法的时候,线程B也开始执行了,这样就会出现数据共享的问题。
因为现在所有的线程都是异步(同时)执行。
## 如何解决
让线程同步(排队)执行即可。这样一来,某个线程执行run()方法的时候,让其他线程等待run()方法的内容执行完毕。
### synchronized关键字
这个关键字可以修饰方法或代码块
#### 修饰方法
写在方法的返回值之前,这时该方法就称为同步方法。
```java
public synchronized void fun(){
//会排队执行的代码
}
```
#### 修饰代码块
写在一个独立的{}前,这时该段内容称为同步代码块。
```java
synchronized(要同步的对象或this){
//会排队执行的代码
}
```
#### 原理
每个对象默认都有一把"锁",当某个线程运行到被synchronized修饰的方法时,该对象就会拥有这把锁,在拥有锁的过程中,其他线程不能同时访问该方法,只有等待其结束后,才会释放这把锁。
使用synchronized修饰后的锁称为"悲观锁"。
方法被synchronized修饰后,称为同步方法,就会让原本多线程变成了单线程(异步变为同步)。
- 什么叫死锁?怎么产生?如何解决?
如果有两个人吃西餐,必须有刀和叉,此时只有一副刀叉。
如果A拿到了刀,B拿到了叉,互相都在等待另一个工具,但都不释放自己拥有的,这时就会造成僵持的局面,这个局面就称为死锁,既不结束,也不继续。
## 模拟死锁出现的情况
定义两个线程类,线程A先获取资源A后,在获取资源B;线程B先获取资源B后,再获取资源A。
如果对资源A和资源B使用了synchronized进行同步,就会在线程A获取资源A的时候,线程B无法获取资源A,相反线程B在获取资源B的时候,线程A无法获取资源B,所以两个线程都不会得到另一个资源。
**PersonA线程**
```java
package com.hqyj.deadlock;
public class PersonA implements Runnable {
//定义两个共享的成员变量,刀、叉
private Object knife;
private Object fork;
public PersonA(Object knife, Object fork) {
this.knife = knife;
this.fork = fork;
}
/*
* 该线程执行run方法时,先获取knife对象,等待3s后获取fork对象
*
* */
@Override
public void run() {
synchronized (knife) {
System.out.println(Thread.currentThread().getName() + "获取了knife,3s后获取fork");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (fork) {
System.out.println(Thread.currentThread().getName() + "获取了fork,可以吃饭了");
}
}
}
}
```
**PersonB线程**
```java
package com.hqyj.deadlock;
public class PersonB implements Runnable {
//定义两个共享的成员变量,刀、叉
private Object knife;
private Object fork;
public PersonB(Object knife, Object fork) {
this.knife = knife;
this.fork = fork;
}
/*
* 该线程执行run方法时,先获取fork对象,等待3s后获取对象knife
*
* */
@Override
public void run() {
synchronized (fork) {
System.out.println(Thread.currentThread().getName() + "获取了fork,3s后获取knife");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (knife) {
System.out.println(Thread.currentThread().getName() + "获取了knife,可以吃饭了");
}
}
}
}
```
## 死锁的解决方式
### 方式一
**让两个线程获取资源的顺序保持一致。**
如两个线程都先获取knife,再获取fork
```java
@Override
public void run() {
synchronized (knife) {
System.out.println(Thread.currentThread().getName() + "获取了knife,3s后获取fork");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (fork) {
System.out.println(Thread.currentThread().getName() + "获取了fork,可以吃饭了");
}
}
}
```
### 方式二
让两个线程在获取资源A和B之前,再获取第三个资源,对第三个资源使用synchronized进行同步,这样某个线程在获取第三个资源后,将后续内容执行完毕,其他线程才能开始执行。
如在获取knife和fork之前,先获取paper对象
```java
@Override
public void run() {
//先获取paper,再进行后续操作
synchronized (paper) {
synchronized (knife) {
System.out.println(Thread.currentThread().getName() + "获取了knife,3s后获取fork");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (fork) {
System.out.println(Thread.currentThread().getName() + "获取了fork,可以吃饭了");
}
}
}
}
```
# 面试题解析
**1. Java容器都有哪些?**
- List 容器:ArrayList、LinkedList
- Set 容器:HashSet、LinkedHashSet、TreeSet
- Map 容器:LinkedHashMap、TreeMap、ConcurrentHashMap、Hashtable
**2.Collection 和 Collections 有什么区别?**
- Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。List,Set,Queue接口都继承Collection。
直接实现该接口的类只有AbstractCollection类,该类也只是一个抽象类,提供了对集合类操作的一些基本实现。List和Set的具体实现类基本上都直接或间接的继承了该类。
- Collections 是一个包装类。它包含有各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等),大多数方法都是用来处理线性表的。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
**3.List、Set、Map 之间的区别是什么?**
- List:有序集合、元素可重复
- Set:无序集合、元素不可重复
- Map:键值对集合、储存键、值和之间的映射,Key无序,唯一;Value不要求有序,允许重复。
**4.HashMap 和 Hashtable 有什么区别?**
- 线程安全性不同。HashMap线程不安全;Hashtable 中的方法是Synchronize的。
- key、value是否允许null。HashMap的key和value都是可以是null,key只允许一个null;Hashtable的key和value都不可为null。
- 迭代器不同。HashMap的Iterator是fail-fast迭代器;Hashtable还使用了enumerator迭代器。
- hash的计算方式不同。HashMap计算了hash值;Hashtable使用了key的hashCode方法。
- 默认初始大小和扩容方式不同。HashMap默认初始大小16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍;Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1。
- 是否有contains方法。HashMap没有contains方法;Hashtable包含contains方法,类似于containsValue。
- 父类不同。HashMap继承自AbstractMap;Hashtable继承自Dictionary。
**5.如何决定使用 HashMap 还是 TreeMap?**
- 对于在 Map 中插入、删除和定位元素这类操作, 选择HashMap。
- 对一个有序 的 key 集合进行遍历, 选择TreeMap。
**6.说一下 HashMap 的实现原理?**
- JDK1.8之后,HashMap采用"**数组+链表+红黑树**"实现
- 当没有哈希冲突时,元素保存到数组中
- 如果出现哈希冲突,在对应的位置上创建链表,元素保存到链表中
- 如果链表的长度大于8,将链表转换为红黑树
- 数据采用键值对key-value的形式保存,键不能重复,能用null作为键;值没有限制,键和值都是引用类型
- 向HashMap集合中添加元素时,原理同HashSet
**7.说一下 HashSet 的实现原理?**
- 是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
**8.ArrayList 和 LinkedList 的区别是什么?**
- ArrayList 是基于数组实现的,LinkedList 是基于链表实现的
- 随机访问 List 时,ArrayList 比 LinkedList 的效率高
- 当对数据进行增加和删除的操作时,LinkedList 比 ArrayList的效率更高
- ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。
- ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
**9.如何实现数组和 List 之间的转换?**
- **集合转换为数组**:使用Collection接口中的toArray()方法
- **一组数据转换为集合**:使用Arrays工具类中的asList(一组数据)方法
**10.Array 和 ArrayList 有何区别?**
- Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
- Array大小是固定的,ArrayList的大小是动态变化的。
- ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
- 对于基本类型数据,ArrayList 使用自动装箱来减少编码工作量;而当处理固定大小的基本数据类型的时候,这种方式相对比较慢,这时候应该使用Array。
**11.哪些集合类是线程安全的?**
Vector、HashTable、ConcurrentHashMap
**12.迭代器 Iterator 是什么**
- terator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。
- 迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。
**13. Iterator 怎么使用?有什么特点?**
- Iterator的使用
(1)Iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
(2)使用next()获得序列中的下一个元素
(3)使用hasNext()检查序列中是否还有元素。
(4)使用remove()将迭代器新近返回的元素删除。
- Iterator的特点
(1) Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationEception的异常。
(2)Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素,删除的是上一次Iterator.next()方法返回的对象。
(3)Iterator必须依附于一个集合类对象而存在,Iterator本身不具有装载数据对象的功能。
(4)next()方法,该方法通过游标指向的形式返回Iterator下一个元素。
**14.Iterator 和 ListIterator 有什么区别?**
- Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
- Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
- ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引。
**15.怎么确保一个集合不能被修改?**
- 可使用 Collections. unmodifiableCollection (Collection c) 方法来创建 一个 只读集合
**16. 线程和进程的区别?**
- 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
- 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
- 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
- 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。.
**17.创建线程有哪几种方式?有什么区别?**
- 方式
- 继承Thread类
- 实现Runnable接口
- Runnable 接口的匿名内部类
- 使用Callable接口
- 区别
- 继承Thread类的线程类不能再继承其他父类
- 实现接口的方式多个线程可以共享一个target对象
**18.说一下 runnable 和 callable 有什么区别?**
- callable的核心是call方法,允许返回值,runnable的核心是run方法,没有返回值
- call方法可以抛出异常,但是run方法不行
- callable和runnable都可以应用于executors。而thread类只支持runnable
**19.在 Java 程序中怎么保证多线程的运行安全?**
- 使用手动锁lock
- 使用线程安全的类
- 使用自动锁 synchronized 关键字
- 使用 volatile 关键字
**20.什么是死锁?**
- 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去;此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
**21.多线程产生死锁的 4 个必要条件**
- 互斥条件:任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。
- 不可剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。
- 请求和保持条件:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
**22. 怎么防止死锁?**
- 破坏互斥条件 使资源同时访问而非互斥使用,就没有进程会阻塞在资源上,从而不发生死锁。 只读数据文件、磁盘等软硬件资源均可采用这种办法管理。
- 破坏占有和等待条件 采用静态分配的方式,静态分配的方式是指进程必须在执行之前就申请需要的全部资源,且直至所要的资源全部得到满足后才开始执行。 实现简单,但是严重的减低了资源利用率。
- 破坏不剥夺条件 剥夺调度能够防止死锁,但是只适用于内存和处理器资源。 占有资源的进程若要申请新资源,必须主动释放已占有资源,若需要此资源,应该向系统重新申请。
- 破坏循环等待条件 给系统的所有资源编号,规定进程请求所需资源的顺序必须按照资源的编号依次进行。 采用层次分配策略,将系统中所有的资源排列到不同层次中
**23.synchronized 和 Lock 有什么区别?**
- Synchronized是关键字,内置语言实现,Lock是接口。
- Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。Lock异常时不会自动释放锁,所以需要在finally中实现释放锁。
- Lock是可以中断锁,Synchronized是非中断锁,必须等待线程执行完成释放锁。
- Lock可以使用读锁提高多线程读效率。
**24.sleep() 和 wait() 有什么区别?**
- sleep 是 Thread 的方法,wait 是 Object 的方法
- sleep 不释放锁,wait0 0释放锁
- sleep 用于一定时间内暂停线程执行,wait 常用于线程间交互和通信
- sleep 方法指定时间之后,线程会自动苏醒,wait 可以通过 notify 或者 notifyAll 来唤醒 wait 的线程
**25.对象的四种应用方式?**
- 强引用:在我们日常编码中,使用最广的引用方式。只要强引用还存在,对象就不会被垃圾回收器回收。可以通过将引用置空的方式,让JVM回收该对象。
- 软引用:有用但是并非必须的对象可以使用弱引用。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。
- 弱引用:只具有弱引用的生命周期较软引用更加短暂。垃圾回收器线程扫描发现了只具有弱引用的对象,不管当前内存空间是否足够,都会回收它的内存。因此,弱引用更适合想缓存数据,又不想影响对象收集的地方
- 虚引用(幻影引用):该应用并不能获取到任何对象,也不会影响对象生命周期。虚引用必须和引用队列联合使用,虚引用主要用来跟踪对象被垃圾回收的活动。
**26.什么是 Java 序列化?什么情况下需要序列化?**
- 序列化:将 Java 对象转换成字节流的过程。
- 使用:当Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。
你可能感兴趣的:(java,servlet,jvm)
- SpringCloud-使用FFmpeg对视频压缩处理
m0_74824517
面试学习路线阿里巴巴springcloudffmpegspring
在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等。本文将通过Java代码示例,向您展示如何使用FFmpeg进行视频压缩,并介绍相关参数的设置。一、FFmpeg简介FFmpeg是一个可以用来录制、转换和流传输音视频的开源工具。它支持几乎所有的音视频格式,并提供了非常强大的编码、解码
- HTML,JavaScript实现时钟
木木与代码(接项目)
htmljavascript前端
HTML,JavaScript实现时钟公众号:木木与代码本文作者:@MuMu编写日期:2025年01月13日本文字数:2662个字符关注可了解更多的教程。问题或建议,请公众号留言;/开始/HTML设计界面元素,【00:00:00】格式的时间显示。翻页时钟000000CSS完成页面的布局和美化页面。让页面的元素居中,设置字体和背景颜色。:root{--primary-color:#24222d;}*
- 用JavaScript写抖音很火的罗盘时钟,附源码
编程界小明哥
canvasjavascriptjavascript精彩实例罗盘时钟javascriptcanvashtml5
原生js制作在抖音上很火的罗盘布局时钟代码。带日期、月份、星期、时分秒圆盘时钟。效果图:3个构造函数文本构造函数//文字的构造函数functionText(o){this.x=0,//x坐标this.y=0,//y坐标this.disX=0,//x坐标偏移量this.disY=0,//y坐标偏移量this.text='',//内容this.font=null;//字体this.textAlign=
- Java开发者必备:深入理解元素与对象比较的底层原理
顾漂亮
Java数据结构java算法开发语言数据结构
Java开发者必备:深入理解元素与对象比较的底层原理个人主页:顾漂亮文章专栏:Java数据结构1.元素的比较Java中,基本类型的对象可以直接比较大小基本类型有:四类八种四类:整型、浮点型、字符型、布尔型八种:数据类型关键字内存占用范围字节型byte1字节-128~127(-2^7~2^7-1)短整型short2字节-32768~32767(-2^15~2^15-1)整形int4字节-2^31~2
- 力扣131题:分割回文串的 Java 实现
杰哥的编程世界
java算法leetcodejava算法
引言力扣(LeetCode)是一个在线编程平台,提供了大量的编程题目供开发者练习。第131题“分割回文串”是一个有趣的字符串处理问题,要求将一个字符串分割成尽可能多的回文子串。本文将介绍如何使用Java解决这个问题。题目描述给定一个字符串s,请将s分割成尽可能多的回文子串。返回它所有可能的分割数量。示例:输入:"abc"输出:4解释:可以分割成"a","b","c"或"ab","c"或"a","b
- [附源码]JAVA+ssm计算机毕业设计大学生体测数据管理系统(程序+Lw)
战少程序源码
java课程设计mybatis
项目运行环境配置:Jdk1.8+Tomcat7.0+Mysql+HBuilderX(Webstorm也行)+Eclispe(IntelliJIDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM+mybatis+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.ID
- Vue.js 与 Ajax(Axios)的深入探索
wjs2024
开发语言
Vue.js与Ajax(Axios)的深入探索引言在当前的前端开发领域,Vue.js已经成为了最受欢迎的JavaScript框架之一。它以其简洁的语法、高效的性能和强大的生态系统获得了广泛的应用。而在与后端服务交互时,Ajax技术是不可或缺的。本文将深入探讨Vue.js与Ajax(Axios)的结合,帮助读者更好地理解这两种技术的协同工作。Vue.js简介Vue.js是一个渐进式JavaScrip
- 史上最详细JavaScript数组去重方法(14种)
Elena_Lucky_baby
javascript前端开发语言
1.利用Set()+Array.from()将数组的每一个元素依次与其他元素做比较,发现重复元素,删除Set对象:是值的集合,你可以按照插入的顺序迭代它的元素。Set中的元素只会出现一次,即Set中的元素是唯一的。Array.from()方法:对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。constarr=[1,2,2,'abc','abc',true,true,false,false
- console的使用记录
沐千熏
VUEuni-appjavascript开发语言ecmascript
console.log();打印调试console.dir();打印对象。javaScript对象属性列表,并以交互的形式展现。输出结果呈现为分层列表。包含展开/折叠的三角图标,可用于查看子对象的内容。console.table();打印数组。console.time();计时操作。functionlogTime(n){console.time("time");//模拟耗时for(leti=0;i
- node.js常用指令
xxq121389527
node.js
安装Node.js:你可以从Node.js官网(https://nodejs.org/)下载并安装适合你操作系统的Node.js版本。查看Node.js版本:在命令行中输入node-v,将显示你当前安装的Node.js版本。运行JavaScript文件:假设你有一个名为app.js的JavaScript文件,你可以在命令行中使用nodeapp.js来运行它。全局安装npm包:npm(NodePac
- Java计算机毕业设计大学生体测数据管理系统源码+系统+数据库+lw文档
冰冰网络
java开发语言html
Java计算机毕业设计大学生体测数据管理系统源码+系统+数据库+lw文档Java计算机毕业设计大学生体测数据管理系统源码+系统+数据库+lw文档本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0源码地址:https
- Java值传递,会影响原值的原因
浪九天
Javajava开发语言
基本数据类型对于基本数据类型(如int、double、boolean等),值传递不会影响原值。因为传递的是变量值的副本,方法内对副本的修改不会反映到原始变量上。publicclassPrimitivePassingExample{publicstaticvoidmain(String[]args){intnum=10;System.out.println("Beforemethodcall:"+n
- Java实现的登录功能(三层架构,验证,拦截)
浪九天
Javajspservlet
Java实现的登录功能(三层架构,验证,拦截)1、pojo:实体类packagecom.pojo;publicclassUser{privateintid;privateStringname;privateStringpassword;publicUser(){}publicUser(Stringname,Stringpassword){this.name=name;this.password=p
- Java在长字符串中查找短字符串的多种方法
浪九天
Javajava字符串算法
Java在长字符串中查找短字符串的多种方法方案一:补充:在输入短字符串时,如果有空格,可以在比较前用trim()方法截取前后空白/*该方法只适用于有特殊分割符号的字符串*/System.out.println("请输入字符串:");Scannerstr1=newScanner(System.in);Strings=str1.nextLine();System.out.println("请输入第二个
- 同城服务家政服务家政派单系统源码微信小程序+微信公众号+APP+H5
源码库saaskw
博纳miui52086微信小程序小程序微信公众平台
JAVA同城服务家政服务家政派单系统源码:打造全方位家政服务生态在当今快节奏的社会中,家政服务已成为城市居民生活中不可或缺的一部分。为了满足广大用户对家政服务的多样化需求,我们精心打造了一款集微信小程序、微信公众号、APP及H5于一体的JAVA同城服务家政派单系统。该系统不仅功能全面,而且框架结构清晰,实用性强,便捷性高,市场前景广阔,引领着家政服务行业的新趋势。功能全面,满足多样化需求用户端功能
- JAVA无人共享24小时自助洗车扫码洗车系统源码支持小程序
源码库saaskw
博纳miui52086微信小程序小程序微信公众平台
JAVA无人共享24小时自助洗车扫码洗车系统源码支持小程序在当今快节奏的生活中,自助洗车服务以其高效、便捷的特点逐渐受到广大车主的青睐。为满足这一市场需求,我们精心打造了一款JAVA无人共享24小时自助洗车扫码洗车系统,其源码全面支持小程序接入,不仅极大地提升了用户体验,还为创业者提供了强大的技术支持和商业机遇。功能介绍该系统集成了多项实用功能,旨在为用户提供一站式、智能化的洗车体验。精准定位功能
- Java-final关键字详解
听忆.
javajvm算法
Java-final关键字详解一、引言二、什么是final关键字?三、final变量final局部变量final实例变量final静态变量四、final方法五、final类六、final关键字的实际应用1.定义常量2.防止方法被重写3.创建不可变类4.优化性能七、final的一些常见误区1.final变量不能在构造方法中赋值2.final类中的所有方法都是final的3.final变量的引用不能改
- SpringBoot(四十二)SpringBoot集成classfinal加密Jar包
camellias_
springbootjar后端
上文中,我们使用jasypt对项目中application.yml配置文件进行了加密。很多时候我们在将项目打成jar包之后,也是不希望被反编译的,毕竟是我们自己辛苦写的代码。那怎么办呢?有现成的轮子供我们使用:classfinal官网:ClassFinal:Java字节码加密工具这是一个开源项目,是的,这是一个开源项目,所以呢,classfinal混淆代码也不是一定不会被反编译的,这里要注意。Cl
- 理解javascript中的回调函数(callback)【转】
大麦麦子
#javascriptcallback
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String、Array、Number、Object类的对象一样用于内置对象的管理。因为function实际上是一种对象,它可以“存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值”。因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟
- Java 集合:单列集合和双列集合的深度剖析
刘小炮吖i
Java后端开发面试题Java集合java
引言在Java编程中,集合是一个非常重要的概念。它就像是一个容器,能够存储多个数据元素,帮助我们更方便地管理和操作数据。Java集合框架主要分为单列集合和双列集合两大类,它们各自有着独特的特点和适用场景。接下来,让我们深入探究这两种集合。单列集合单列集合就像是一列整齐排列的数据队伍,每个元素都是独立的个体,按照一定的规则存储和组织。在Java中,单列集合的根接口是java.util.Collect
- lucene java 庖丁解牛_Lucene整合"庖丁解牛"中文分詞 ----入門 2
rubyxr109
lucenejava庖丁解牛
packagecn.luanmad.lucene;importnet.paoding.analysis.analyzer.PaodingAnalyzer;importorg.apache.lucene.analysis.Analyzer;importorg.apache.lucene.analysis.Token;importorg.apache.lucene.analysis.TokenStre
- 庖丁解java(一篇文章学java)
庖丁解java
java开发语言
(大家不用收藏这篇文章,因为这篇文章会经常更新,也就是删除后重发)一篇文章学java,这是我滴一个执念...当然,真一篇文章就写完java基础,java架构,java业务实现,java业务扩展,根本不可能.所以,这篇文章,就是一个索引,索什么呢?请看下文...关于决定开始写博文的介绍(一切故事的起点源于这一次反省)中小技术公司的软扩展(微服务扩展是否有必要?)-CSDN博客SpringCloud(
- 庖丁解java(一篇文章学java)
庖丁解java
java开发语言
(大家不用收藏这篇文章,因为这篇文章会经常更新,也就是删除后重发)一篇文章学java,这是我滴一个执念...当然,真一篇文章就写完java基础,java架构,java业务实现,java业务扩展,根本不可能.所以,这篇文章,就是一个索引,索什么呢?请看下文...关于决定开始写博文的介绍(一切故事的起点源于这一次反省)中小技术公司的软扩展(微服务扩展是否有必要?)-CSDN博客SpringCloud(
- 中小技术公司的人才培养(微服务使用--降本心法)
庖丁解java
学习
为什么我写java技术博文的大逻辑和其他博主相反呢.这种思维其实是java本身给我带来的一种思维方式(当然也有可能就是我本身思维习惯也有这样的趋势,只是接触java之后负负得负,给我放大了)在java培训的过程中,java基础讲完之后,直接上手就是spring.这已经跨过了javaSE,utils,中间件.直接接触的就是框架.很快一个可运行的项目就可以通过IDEA创建出来.这就是java面向对象的
- 面试题真的重要吗(一个javaSE硬解析)
庖丁解java
java
之前做b站视频时总会有刚入行的朋友来询问这个问题?当时的我总会喜欢这样回答,有用也没用.小公司作用小,大公司作用大,作用比重和公司规模几乎成正比.那因为要写这个系列文章,javaSE肯定也是中小公司绕不过去的技术点因为这是整个java的基础啊.除非不用java.但我认为,目前主流编程语言,java的确是中小公司的必选.PHP(我看过这个语言的代码,只能说一点也看不懂,我是一点也不喜欢,而且本来用的
- 2024华为OD机试真题-计算堆栈中的剩余数字(C++)-E卷-100分
2024剑指offer
华为OD机试(C++)2025c++华为od
2024华为OD机试题库-(E卷+C卷+D卷)-(JAVA、Python、C++)目录题目描述输入描述输出描述用例1用例2用例3题目解析代码c++题目描述向一个空栈中依次存入正整数,假设入栈元素n(1≤n≤2^31-1)按顺序依次为:nx...n4、n3、n2、n1,每当元素入栈时,如果n1=n2+...+ny(y的范围[2,x],1≤x≤1000),则n1~ny全部元素出栈,重新入栈新元素m(m
- 2024华为OD机试真题-单词接龙(C++)-E卷B卷-100分
2024剑指offer
华为OD机试(C++)2025c++华为od
2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++)目录题目描述:输入描述:输出描述:示例1示例2题目解析考点代码c++题目描述:单词接龙的规则是:可用于接龙的单词首字母必须要前一个单词的尾字母相同;当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用。现给定一组全部由小写字母组成单词数组,并指定其中
- SpringBoot + Vue 前后端跨域问题
游衍归者
SpringBoot与Vuespringbootvue.jsjava
1、报错信息java.lang.IllegalArgumentException:WhenallowCredentialsistrue,allowedOriginscannotcontainthespecialvalue"*"sincethatcannotbesetonthe"Access-Control-Allow-Origin"responseheader.Toallowcredentials
- Spring MVC框架的依赖与配置实战
三冬评论员
本文还有配套的精品资源,点击获取简介:SpringMVC是一个基于Java的Web应用开发框架,作为Spring框架的一部分,它遵循MVC设计模式。在开发SpringMVC应用时,必须引入相关JAR包以支持其核心功能。这些JAR包括核心容器、数据访问、Web支持、AOP、工具类和测试模块。本篇文章将详细介绍SpringMVC所需的各依赖JAR包及其作用,并指导如何配置和使用这些依赖,以构建高效的W
- Go、Java、Python、C/C++、PHP、Rust 语言全方位对比分析
tekin
Go语言攻坚营Python编程秘籍库javagolangjavac++编程语言对比Python语言PHP语言编程适用场景
简介在当今多元化的编程世界中,不同的编程语言各有千秋,适用于不同的应用场景。本文聚焦于Go、Java、Python、C/C++、PHP和Rust这六种热门编程语言,深入剖析它们的优劣势以及各自的最佳适用场景,旨在为开发者在选择合适的编程语言时提供全面、准确的参考依据。语言优势对比语言优势劣势最佳适用场景Go1.高性能,编译速度快,执行效率接近C/C++。2.强大的并发编程支持,goroutine和
- 关于旗正规则引擎规则中的上传和下载问题
何必如此
文件下载压缩jsp文件上传
文件的上传下载都是数据流的输入输出,大致流程都是一样的。
一、文件打包下载
1.文件写入压缩包
string mainPath="D:\upload\"; 下载路径
string tmpfileName=jar.zip; &n
- 【Spark九十九】Spark Streaming的batch interval时间内的数据流转源码分析
bit1129
Stream
以如下代码为例(SocketInputDStream):
Spark Streaming从Socket读取数据的代码是在SocketReceiver的receive方法中,撇开异常情况不谈(Receiver有重连机制,restart方法,默认情况下在Receiver挂了之后,间隔两秒钟重新建立Socket连接),读取到的数据通过调用store(textRead)方法进行存储。数据
- spark master web ui 端口8080被占用解决方法
daizj
8080端口占用sparkmaster web ui
spark master web ui 默认端口为8080,当系统有其它程序也在使用该接口时,启动master时也不会报错,spark自己会改用其它端口,自动端口号加1,但为了可以控制到指定的端口,我们可以自行设置,修改方法:
1、cd SPARK_HOME/sbin
2、vi start-master.sh
3、定位到下面部分
- oracle_执行计划_谓词信息和数据获取
周凡杨
oracle执行计划
oracle_执行计划_谓词信息和数据获取(上)
一:简要说明
在查看执行计划的信息中,经常会看到两个谓词filter和access,它们的区别是什么,理解了这两个词对我们解读Oracle的执行计划信息会有所帮助。
简单说,执行计划如果显示是access,就表示这个谓词条件的值将会影响数据的访问路径(表还是索引),而filter表示谓词条件的值并不会影响数据访问路径,只起到
- spring中datasource配置
g21121
dataSource
datasource配置有很多种,我介绍的一种是采用c3p0的,它的百科地址是:
http://baike.baidu.com/view/920062.htm
<!-- spring加载资源文件 -->
<bean name="propertiesConfig"
class="org.springframework.b
- web报表工具FineReport使用中遇到的常见报错及解决办法(三)
老A不折腾
finereportFAQ报表软件
这里写点抛砖引玉,希望大家能把自己整理的问题及解决方法晾出来,Mark一下,利人利己。
出现问题先搜一下文档上有没有,再看看度娘有没有,再看看论坛有没有。有报错要看日志。下面简单罗列下常见的问题,大多文档上都有提到的。
1、repeated column width is largerthan paper width:
这个看这段话应该是很好理解的。比如做的模板页面宽度只能放
- mysql 用户管理
墙头上一根草
linuxmysqluser
1.新建用户 //登录MYSQL@>mysql -u root -p@>密码//创建用户mysql> insert into mysql.user(Host,User,Password) values(‘localhost’,'jeecn’,password(‘jeecn’));//刷新系统权限表mysql>flush privileges;这样就创建了一个名为:
- 关于使用Spring导致c3p0数据库死锁问题
aijuans
springSpring 入门Spring 实例Spring3Spring 教程
这个问题我实在是为整个 springsource 的员工蒙羞
如果大家使用 spring 控制事务,使用 Open Session In View 模式,
com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.
- 百度词库联想
annan211
百度
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>RunJS</title&g
- int数据与byte之间的相互转换实现代码
百合不是茶
位移int转bytebyte转int基本数据类型的实现
在BMP文件和文件压缩时需要用到的int与byte转换,现将理解的贴出来;
主要是要理解;位移等概念 http://baihe747.iteye.com/blog/2078029
int转byte;
byte转int;
/**
* 字节转成int,int转成字节
* @author Administrator
*
- 简单模拟实现数据库连接池
bijian1013
javathreadjava多线程简单模拟实现数据库连接池
简单模拟实现数据库连接池
实例1:
package com.bijian.thread;
public class DB {
//private static final int MAX_COUNT = 10;
private static final DB instance = new DB();
private int count = 0;
private i
- 一种基于Weblogic容器的鉴权设计
bijian1013
javaweblogic
服务器对请求的鉴权可以在请求头中加Authorization之类的key,将用户名、密码保存到此key对应的value中,当然对于用户名、密码这种高机密的信息,应该对其进行加砂加密等,最简单的方法如下:
String vuser_id = "weblogic";
String vuse
- 【RPC框架Hessian二】Hessian 对象序列化和反序列化
bit1129
hessian
任何一个对象从一个JVM传输到另一个JVM,都要经过序列化为二进制数据(或者字符串等其他格式,比如JSON),然后在反序列化为Java对象,这最后都是通过二进制的数据在不同的JVM之间传输(一般是通过Socket和二进制的数据传输),本文定义一个比较符合工作中。
1. 定义三个POJO
Person类
package com.tom.hes
- 【Hadoop十四】Hadoop提供的脚本的功能
bit1129
hadoop
1. hadoop-daemon.sh
1.1 启动HDFS
./hadoop-daemon.sh start namenode
./hadoop-daemon.sh start datanode
通过这种逐步启动的方式,比start-all.sh方式少了一个SecondaryNameNode进程,这不影响Hadoop的使用,其实在 Hadoop2.0中,SecondaryNa
- 中国互联网走在“灰度”上
ronin47
管理 灰度
中国互联网走在“灰度”上(转)
文/孕峰
第一次听说灰度这个词,是任正非说新型管理者所需要的素质。第二次听说是来自马化腾。似乎其他人包括马云也用不同的语言说过类似的意思。
灰度这个词所包含的意义和视野是广远的。要理解这个词,可能同样要用“灰度”的心态。灰度的反面,是规规矩矩,清清楚楚,泾渭分明,严谨条理,是决不妥协,不转弯,认死理。黑白分明不是灰度,像彩虹那样
- java-51-输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
bylijinnan
java
public class PrintMatrixClockwisely {
/**
* Q51.输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
1 2 3 4
5 6 7 8
9
- mongoDB 用户管理
开窍的石头
mongoDB用户管理
1:添加用户
第一次设置用户需要进入admin数据库下设置超级用户(use admin)
db.addUsr({user:'useName',pwd:'111111',roles:[readWrite,dbAdmin]});
第一个参数用户的名字
第二个参数
- [游戏与生活]玩暗黑破坏神3的一些问题
comsci
生活
暗黑破坏神3是有史以来最让人激动的游戏。。。。但是有几个问题需要我们注意
玩这个游戏的时间,每天不要超过一个小时,且每次玩游戏最好在白天
结束游戏之后,最好在太阳下面来晒一下身上的暗黑气息,让自己恢复人的生气
&nb
- java 二维数组如何存入数据库
cuiyadll
java
using System;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace WindowsFormsApplication1
{
- 本地事务和全局事务Local Transaction and Global Transaction(JTA)
darrenzhu
javaspringlocalglobaltransaction
Configuring Spring and JTA without full Java EE
http://spring.io/blog/2011/08/15/configuring-spring-and-jta-without-full-java-ee/
Spring doc -Transaction Management
http://docs.spring.io/spri
- Linux命令之alias - 设置命令的别名,让 Linux 命令更简练
dcj3sjt126com
linuxalias
用途说明
设置命令的别名。在linux系统中如果命令太长又不符合用户的习惯,那么我们可以为它指定一个别名。虽然可以为命令建立“链接”解决长文件名的问 题,但对于带命令行参数的命令,链接就无能为力了。而指定别名则可以解决此类所有问题【1】。常用别名来简化ssh登录【见示例三】,使长命令变短,使常 用的长命令行变短,强制执行命令时询问等。
常用参数
格式:alias
格式:ali
- yii2 restful web服务[格式响应]
dcj3sjt126com
PHPyii2
响应格式
当处理一个 RESTful API 请求时, 一个应用程序通常需要如下步骤 来处理响应格式:
确定可能影响响应格式的各种因素, 例如媒介类型, 语言, 版本, 等等。 这个过程也被称为 content negotiation。
资源对象转换为数组, 如在 Resources 部分中所描述的。 通过 [[yii\rest\Serializer]]
- MongoDB索引调优(2)——[十]
eksliang
mongodbMongoDB索引优化
转载请出自出处:http://eksliang.iteye.com/blog/2178555 一、概述
上一篇文档中也说明了,MongoDB的索引几乎与关系型数据库的索引一模一样,优化关系型数据库的技巧通用适合MongoDB,所有这里只讲MongoDB需要注意的地方 二、索引内嵌文档
可以在嵌套文档的键上建立索引,方式与正常
- 当滑动到顶部和底部时,实现Item的分离效果的ListView
gundumw100
android
拉动ListView,Item之间的间距会变大,释放后恢复原样;
package cn.tangdada.tangbang.widget;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import andr
- 程序员用HTML5制作的爱心树表白动画
ini
JavaScriptjqueryWebhtml5css
体验效果:http://keleyi.com/keleyi/phtml/html5/31.htmHTML代码如下:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="UTF-8" >
<ti
- 预装windows 8 系统GPT模式的ThinkPad T440改装64位 windows 7旗舰版
kakajw
ThinkPad预装改装windows 7windows 8
该教程具有普遍参考性,特别适用于联想的机器,其他品牌机器的处理过程也大同小异。
该教程是个人多次尝试和总结的结果,实用性强,推荐给需要的人!
缘由
小弟最近入手笔记本ThinkPad T440,但是特别不能习惯笔记本出厂预装的Windows 8系统,而且厂商自作聪明地预装了一堆没用的应用软件,消耗不少的系统资源(本本的内存为4G,系统启动完成时,物理内存占用比
- Nginx学习笔记
mcj8089
nginx
一、安装nginx 1、在nginx官方网站下载一个包,下载地址是:
http://nginx.org/download/nginx-1.4.2.tar.gz
2、WinSCP(ftp上传工
- mongodb 聚合查询每天论坛链接点击次数
qiaolevip
每天进步一点点学习永无止境mongodb纵观千象
/* 18 */
{
"_id" : ObjectId("5596414cbe4d73a327e50274"),
"msgType" : "text",
"sendTime" : ISODate("2015-07-03T08:01:16.000Z"
- java术语(PO/POJO/VO/BO/DAO/DTO)
Luob.
DAOPOJODTOpoVO BO
PO(persistant object) 持久对象
在o/r 映射的时候出现的概念,如果没有o/r映射,就没有这个概念存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数据库的操作.
VO(value object) 值对象
通
- 算法复杂度
Wuaner
Algorithm
Time Complexity & Big-O:
http://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o
http://bigocheatsheet.com/
http://www.sitepoint.com/time-complexity-algorithms/