开发环境
将JDK的bin下目录加入到环境变量下即可
基本结构
public class Main
{
public static void main(String[] args)
{
System.out.println("FuckWorld!!");
}
}
主类名必须和文件名一致,上列示例代码意味着文件名为 Main.java.
主函数格式须为 public static void main(String[] args)
基本语法
较C语言,以下为不同点
一些变量赋值
long a = 0L
float a = 0.0f;
double a = 0.0d;
for循环
//除C风格for循环以外,还可以迭代对象循环
int[] a = new int[10]
for (int i : a)
{
system.out.print(i);
}
Collection接口数组
ArrayList 底层由数组实现,适合查询多增删少的情景。
LinkedList 底层由链表实现,适合查询少增删多的情景。
OOP
修饰符
default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
多态
(等号)左父右子为多态
只有方法能覆盖重写,变量不能。因而在多态代码中,创建一个父类下的一个子类的实例化对象,这个实例化对象是不可访问那个子类中所定义的变量。
//访问成员变量:
//直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
Fu obj = new Zi();
//优先用Fu 类中变量,没有则向上找
一个实现类(小范围)可以向上转换为接口类型,可类比int自动转换为double。
因而,一个实现类是可以传入一个参数类型为接口类的方法的
重载(overload)和重写(overide)
重载关注方法的名称和参数列表的个数和类型,他们之中至少有一项必须不一样才可称为重载。
重写可以参数列表和名称完全一样,但方法实现不同,也可以不一样,因而可以改变从父类继承过来的一些方法实现多态的特性。
匿名对象
匿名对象只可实例化调用一次,之后被GC
new Person().name = "Tim";
泛型
当一个类不确定要使用什么类型的时候,可以使用泛型 <E e> <t> ,在实例化对象的时候再确定具体使用什么数据类型
ArrayList <String> li = new ArrayList<>();
创建一个 String类型的 ArrayList
ArrayList li = new ArrayList();
//若不写泛型,则默认数据类型为object,可以存储任何类型
作为参数处理泛型时,可以通过泛型通配符来处理
public static void PrintArray(ArrayList<?> list)
{
Iterator<?> it = list.iterator()
....
}
这样,在传入参数时,就可自动识别到具体泛型是什么。
泛型上下限定
public static void get(Collection<? extends Number> coll)
public static void get(Collection<? super Number> coll)
常用内置方法
Collections类下数组排序
ArraryList[] li = new ArraryList[10];
... //赋值操作
Collections.sort(li); //默认升序
//若需要自定义类排序方法,需要重写 compareTo方法
Map接口集合
Map<String, String> m = new HashMap<>();
//创建键值对集合
m.put("a", "Goods");
//添加键值对
String a = m.get("a");
//删除键值对
m.remove("a");
多线程
创建多线程程序的第一种方式:创建Thread类的子类
java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类
实现步骤:
1.创建一个Thread类的子类
2.在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?)
3.创建Thread类的子类对象
4.调用Thread类中的方法start方法,开启新的线程,执行run方法
void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
结果是两个线程并发地运行;当前线程(main线程)和另一个线程(创建的新线程,执行其 run 方法)。
多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
java程序属于抢占式调度,那个线程的优先级高,那个线程优先执行;同一个优先级,随机选择一个执行
获取线程名/重命名线程
//获取当前线程名
Thread.currentThread().getName()
//修改线程名
mt.setname("NewName");
sleep方法
Thread.sleep(1000);
//停一秒
创建多线程程序的第二种方式:实现Runnable接口
java. lang. Runnable
Runnable接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一一个称为run 的无参数方法。
java. lang. Thread类的构造方法
Thread(Runnable target)分配新的Thread 对象。
Thread(Runnable target, String name)分配新的Thread 对象。
实现步骤:
1.创建一个Runnable接口的实现类
2.在实现类中重写Runnabl e接口的run方法,设置线程任务
3.创建- -个Runnable接口的实现类对象
4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
5.调用Thread类中的start方法,开启新的线程执行run方法
实现Runnable接口创建多线程程序的好处:
1.避免了单继承的局限性
一个类只能继承一个类(一个人只能有一个亲爹) ,类继承了Thread类就不能继承其他的类
实现了Runnable接口,还可以继承其他的类,实现其他的接口
2.增强了程序的扩展性,降低了程序的耦合性(解耦)
实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
实现类中,重写了run方法:用来设置线程任务
创建Thread类对象,调用start方法:用来开启新线程
多线程代码同步
//创建一个锁对象
Object obj = new Object();
//同步代码块
synchronized(obj)
{
...
}
//或者使用synchronized 修饰符方法
同步技术的原理:
使用了一个锁对象,这个锁对象叫同步锁也叫对象锁也叫对象监视器
3个线程起抢夺cpu的执行权谁抢到了谁执行run方法进行卖票
t0抢到了cpu的执行权执行run方法遇到synchronized代码块
这时t会检查synchronized代码块是否有锁对象
发现有,就会获取到锁对象进入到同步中执行
t1抢到了cpu的执行权执行run方法遇到synchronized代码块
这时t1会检查synchronized代码块是否有锁对象
发现没有,t1救护进入到阻塞状态会一直等待t0线程归还锁对象
一直到t0线程执行完同步中的代码,会把锁对象归还给同步代码块
t1才能获取到锁对象进入到同步中执行
总结:同步中的线程没有执行完毕不会释放锁同步外的线程没有锁进不去同步
Lock锁接口也可实现线程同步
线程池
线程池:IDK1.5之后提供的
java. util. concurrent . Executors :线程池的工厂类,用来生成线程池
Executors类中的静态方法:
static ExecutorService newFixedThreadPool(int nThreads) 创建-一个可重用固定线程数的线程池
参数:
int nThreads :创建线程池中包含的线程数量
返回值:
ExecutorService接口,返回的是ExecutorService接口的实现类对象,我们可以使用Executorservice接口接收(面向接口编程)
java. util. concurrent. Executorservice:线程池接口
用来从线程池中获取线程,调用start方法,执行线程任务
submit(Runnable task) 提交一个Runnable 任务用于执行
关闭销毁线程池的方法
void shutdown()
线程池的使用步骤:
1.使用线程池的工厂类Executors里边提供的静态方法newF ixedThreadPool生产-一个指定线程数量的线程池
玉创建一个类,实现Runnable接口,重写run方法,设器线程任务
3.调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
4.调用ExecutorService中的方法shutdown销毁线程池(不建议执行)