public?static?void?main(String[]?args){ ??
byte?b1=1; ??
byte?b2=2;
//对于常数,编译器是知道的,所以会自动得出结果3,从而确定没有越界而顺利赋值
byte?b3=1?+?2; ??
//对于变量,编译器不知道值是多少,会进行自动转换,从而报错,出现异常
byte?b4=b1?+?b2; ??
System.out.println(b3); ??
System.out.println(b4);
}
int[] arr=new int[4];
int[] arr=new int[]{1,2,3,4};
int[] arr={1,2,3,4};
特点:封装了方法
默认方法(JDK8)(public default void fly(){}):可以被继承,可以被重写
接口中没有成员变量
变量名?instanceof?数据类型?
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。
Animal a=new Cat;
if(a instanceof Cat){}
访问特点
外部类名.内部类名?对象名?=?new?外部类型().new?内部类型();
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名 和$符号 。
比如,Person$Heart.class
new?父类名或者接口名(){ ????
//?方法重写 ????
@Override? ????
public?void?method()?{ ????????
//?执行语句 ????
}
};
?FlyAble??f?=?new?FlyAble(){ ????????????
public?void?fly()?{ ????????????????
System.out.println("我飞了~~~"); ????????????
} ????????
}; ? ????????
//调用?fly方法,执行重写后的方法 ????????
f.fly();
修饰符 class 类名<代表泛型的变量> { }
class ArrayList<E>{
public boolean add(E e){ }
public E get(int index){ }
....
}
ArrayList<String> list = new ArrayList<String>();
//此时
class ArrayList<String>{
public boolean add(String e){ }
public String get(int index){ }
...
}
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
public class MyGenericMethod {
public <MVP> void show(MVP mvp) {
System.out.println(mvp.getClass());
}
}
public class GenericMethodDemo {
public static void main(String[] args) {
// 创建对象
MyGenericMethod mm = new MyGenericMethod();
// 演示看方法提示
mm.show("aaa");
mm.show(123);
mm.show(12.45);
}
}
修饰符 interface接口名<代表泛型的变量> { }
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
public class MyImp1 implements MyGenericInterface<String> {
@Override
public void add(String e) {
// 省略...
}
@Override
public String getE() {
return null;
}
}
//还是无法确定泛型
public class MyImp2<E> implements MyGenericInterface<E> {
@Override
public void add(E e) {
// 省略...
}
@Override
public E getE() {
return null;
}
}
/*
* 使用时确定泛型
*/
public class GenericInterface {
public static void main(String[] args) {
MyImp2<String> my = new MyImp2<String>();
my.add("aa");
}
}
泛型通配符
泛型的上限:
类型名称 <? extends 类 > 对象名称
只能接收该类型及其子类
泛型的下限:
类型名称 <? super 类 > 对象名称
只能接收该类型及其父类型
for(元素的数据类型 变量 : Collection集合or数组){
//写操作代码
}
//使用增强for遍历
for(String s :coll){//接收变量s代表 代表被遍历到的集合元素
System.out.println(s);
}
修饰符?返回值类型?方法名(参数类型...?形参名){??}
等价于
修饰符?返回值类型?方法名(参数类型[]?形参名){??}
public?boolean?equals?(Object?anObject)
public?boolean?equalsIgnoreCase?(String?anotherString)
public?char[]?toCharArray?()
public?byte[]?getBytes?()
public?String?replace?(CharSequence?target,?CharSequence?replacement)
public?String[]?split(String?regex) //按照给定的正则规则分割成字符串数组
public?static?String?toString(int[]?a)
public?static?void?sort(int[]?a) //默认升序排序
public?static?double?abs(double?a) //求绝对值
public?static?double?ceil(double?a)
public?static?double?floor(double?a)
public?static?long?round(double?a)
List<String>?list?=?new?ArrayList<>();
public?boolean?add(E?e)
public?E?remove(int?index)
public?E?get(int?index)
public?int?size()
public String toString() //经常被重写
public boolean equals(Object obj) //默认是地址比较,而我们经常把他改成值比较,然后再配合hasCode()方法完成判断对象是否相同
//判断两个对象是否相等
public static boolean equals(Object a, Object b){
return (a == b) || (a != null && a.equals(b));
}
构造函数和方法
public Date()
public Date(long date)
public long getTime()
System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2018
public SimpleDateFormat(String pattern) //构造方法,参数为日期格式
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public String format(Date date)
public Date parse(String source)
DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
String str = "2018年12月11日";
Date date = df.parse(str);
静态方法
public static Calendar getInstance()
Calendar cal = Calendar.getInstance();
常用方法
public int get(int field)
public void set(int field, int value)
public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
public Date getTime()
field选项
YEAR:年
MONTH:月(从0开始,可以+1使用)
DAY_OF_MONTH:月中的天(几号)
HOUR:时(12小时制)
HOUR_OF_DAY:时(24小时制)
MINUTE:分
SECOND:秒
DAY_OF_WEEK:周中的天(周几,周日为1,可以-1使用)
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天
cal.add(Calendar.YEAR, -3); // 减3年
public static long currentTimeMillis()
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):
public static void main(String[] args) {
int[] src = new int[]{1,2,3,4,5};
int[] dest = new int[]{6,7,8,9,10};
System.arraycopy( src, 0, dest, 0, 3);
/*代码运行后:两个数组中的元素发生了变化
src数组元素[1,2,3,4,5]
dest数组元素[1,2,3,9,10]
*/
}
public StringBuilder()//空容器
public StringBuilder(String str) //指定初值的容器
public StringBuilder append(任意类型)//都看成表面上的字符串
public String toString()
int num = Integer.parseInt("100");
short num = Short.parseShort("10");
Byte b = Byte.parseByte("a");
Long num = Long.parseLong("10");
Float num = Float.parseFloat("10.7");
Double num = Double.parseDouble("10.3");
Boolean num = Boolean.parseBoolean("10");
public boolean add(E e)
public void clear()
public boolean remove(E e)
public boolean contains(E e)
public boolean isEmpty()
public int size()
public Object[] toArray()
public Iterator<E> iterator() //返回的是迭代器接口的实现类
- public E next():返回迭代的下一个元素。
- public boolean hasNext():如果仍有元素可以迭代,则返回 true。
public?void?add(int?index,?E?element)
public?E?get(int?index)
public?E?remove(int?index)
public?E?set(int?index,?E?element)
public?void?addFirst(E?e) :将指定元素插入此列表的开头。
public?void?addLast(E?e) :将指定元素添加到此列表的结尾。
public?E?getFirst() :返回此列表的第一个元素。
public?E?getLast() :返回此列表的后一个元素。
public?E?removeFirst() :移除并返回此列表的第一个元素。
public?E?removeLast() :移除并返回此列表的后一个元素。
public?E?pop() :从此列表所表示的堆栈处弹出一个元素。
public?void?push(E?e) :将元素推入此列表所表示的堆栈。
public?boolean?isEmpty() :如果列表不包含元素,则返回true
public?static?<T>?boolean?addAll(Collection<T>?c,?T...?elements) :往集合中添加一些元素。 public?static?void?shuffle(List<?>?list)?打乱顺序 :打乱集合顺序。 public?static?<T>?void?sort(List<T>?list) :将集合中元素按照默认规则排序。 public?static?<T>?void?sort(List<T>?list,Comparator<??super?T>?) :将集合中元素按照指定规则排 序。
public?int?compare(T?o1,?T?o2)?
?Collections.sort(list,?new?Comparator<String>()?{
?@Override ????????????
public?int?compare(String?o1,?String?o2)?{ ????????????????
return?o2.charAt(0)?‐?o1.charAt(0); ????????????
} ????????
});
两个对象比较的结果有三种:大于,等于,小于。
如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数)(即o1大于o2为真)
如果要按照 降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)(即o2大于o1为真)
public?V?put(K?key,?V?value) : 把指定的键与指定的值添加到Map集合中。 public?V?remove(Object?key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的 值。 public?V?get(Object?key) 根据指定的键,在Map集合中获取对应的值。
public?Set<K>?keySet() : 获取Map集合中所有的键,存储到Set集合中。 public?Set<Map.Entry<K,V>>?entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
public?K?getKey() :获取Entry对象中的键。
public?V?getValue() :获取Entry对象中的值
Set<Entry<String,String>>?entrySet?=?map.entrySet(); ? ????????
//?遍历得到每一个entry对象 ????????
for?(Entry<String,?String>?entry?:?entrySet)?{ ???????????
//?解析? ? ????????????
String?key?=?entry.getKey(); ????????????
String?value?=?entry.getValue();?? ????????????
System.out.println(key+"的CP是:"+value); ????????
}
?Set<String>?str1=Set.of("a","b","c");?? ????????
//str1.add("c");这里编译的时候不会错,但是执行的时候会报错,因为是不可变的集合?? ????????
System.out.println(str1);?? ????????
Map<String,Integer>?str2=Map.of("a",1,"b",2);?? ????????
System.out.println(str2);?? ????????
List<String>?str3=List.of("a","b");?? ????????
System.out.println(str3);??
//生成的集合是不可修改的
1:of()方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如 HashSet,ArrayList等待;
2:返回的集合是不可变的;
public?Properties() :创建一个空的属性列表。
public?Object?setProperty(String?key,?String?value) : 保存一对属性。 public?String?getProperty(String?key) :使用此属性列表中指定的键搜索属性值。 public?Set<String>?stringPropertyNames() :所有键的名称的集合。
public?void?load(InputStream?inStream) : 从字节输入流中读取键值对。
public?void?printStackTrace() :打印异常的详细信息
public?String?getMessage() :获取发生异常的原因
public?String?toString() :获取异常的类型和异常描述信息(不用)。
public?class?MyThread?extends?Thread?{ ???
public?MyThread(String?name)?{? ??? ????
super(name);? ???????
}?
@Override
public?void?run()?{...}? ???
}
public?class?Demo01?{
public?static?void?main(String[]?args)?{? ???
MyThread?mt?=?new?MyThread("新的线程!");? ???????
mt.start();? ???????
}? ???
}
public static void main(String[] args) {
//共享资源
final Ticket ticket = new Ticket();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 1000; i++) {
//内部类可直接访问
ticket.sale();
}
}
}, "thread01").start();
}
public?Thread() :分配一个新的线程对象。
public?Thread(String?name) :分配一个指定名字的新的线程对象。
public?Thread(Runnable?target) :分配一个带有指定目标新的线程对象。
//重点掌握,这种最常用
public?Thread(Runnable?target,String?name) :分配一个带有指定目标新的线程对象并指定名字
public?String?getName() :获取当前线程名称。
public?void?start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。
public?void?run() :此线程要执行的任务在此处定义代码。 留给子类重写
public?static?void?sleep(long?millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
public?static?Thread?currentThread() :返回对当前正在执行的线程对象的引用
//同步代码块
synchronized(同步锁){ ?????
需要同步操作的代码
}
//同步方法
public?synchronized?void?method(){ ???
可能会产生线程安全问题的代码 ?
}//对于静态方法,同步锁是该类的字节码对象(类名.class),对于非静态方法,就是this
public?class?Ticket?implements?Runnable{
private?int?ticket?=?100;? ??? ????
Lock?lock?=?new?ReentrantLock();? ???? ???
@Override? ???
public?void?run()?{? ? ???????
while(true){? ???????
lock.lock();?
要上锁部分的代码
lock.unlock();? ???????????
}? ???????
}? ???
}
线程池的顶级接口
EXecutor:但严格意义上说它是产生线程池的工具类的接口
Executors:线程池的工具类
静态方法:
public?static?ExecutorService?newFixedThreadPool(int?nThreads) //获取线程池对象
ExecutorService:线程池接口,通过Executors的静态方法获取实现该接口的实例对象
方法
public?Future<?>?submit(Runnable?task) :获取线程池中的某一个线程对象,并执行
Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用
public void shutdown(); 关闭线程池
public?class?ThreadPoolDemo?{ ????
public?static?void?main(String[]?args)?{ ????????
ExecutorService?service?=?Executors.newFixedThreadPool(2);//包含2个线程对象 ?????
MyRunnable?r?=?new?MyRunnable(); ? ???????????????
service.submit(r); ????????
//?再获取个线程对象,调用MyRunnable中的run() ????????
service.submit(r); ????????
service.submit(r); ????????
service.shutdown(); ??//关闭线程池??
}
}
(参数类型?参数名称)?‐>?{?代码语句?} //虽然能简写,但是这个是规范,最好使用这样
public?static?void?main(String[]?args)?{ ??
invokeCook(()?‐>?System.out.println("吃饭啦!")); //省略了大括号 ??
}
public?File(String?pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public?File(String?parent,?String?child) :从父路径名字符串和子路径名字符串创建新的 File实例。
public?File(File?parent,?String?child) :从父抽象路径名和子路径名字符串创建新的 File实例
常用方法
public?String?getAbsolutePath() :返回此File的绝对路径名字符串。 public?String?getPath() :将此File转换为路径名字符串。
public?String?getName() :返回由此File表示的文件或目录的名称。
public?long?length() :返回由此File表示的文件的长度
判断功能方法
public?boolean?exists() :此File表示的文件或目录是否实际存在。 public?boolean?isDirectory() :此File表示的是否为目录。
public?boolean?isFile() :此File表示的是否为文件。
创建删除功能的方法
public?boolean?createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 public?boolean?delete() :删除由此File表示的文件或目录。
public?boolean?mkdir() :创建由此File表示的目录。
public?boolean?mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录
目录遍历方法
public?String[]?list() :返回一个String数组,表示该File目录中的所有子文件或目录。
public?File[]?listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
public?File[]?listFiles(FileFilter) :返回一个File数组,表示该File目录中的满足过滤器的文件
FileFilter接口
抽象方法:
boolean?accept(File?pathname) :测试pathname是否应该包含在当前File目录中,符合则返回true
代码实现
public?class?DiGuiDemo4?{ ????
public?static?void?main(String[]?args)?{ ????????File?dir?=?new?File("D:\\aaa"); ????????
printDir2(dir); ????
} ?? ????
public?static?void?printDir2(File?dir)?{ ???
//匿名内部类实现
File[]?files?=?dir.listFiles(new?FileFilter()?{ ????????????
@Override ????????????
public?boolean?accept(File?pathname)?{ ????????????????return?pathname.getName().endsWith(".java")||pathname.isDirectory(); ????????????
} ????????
}); ??????
//?循环打印 ?? ????????
for?(File?file?:?files)?{ ????????????
if?(file.isFile())?{ ????????????????
System.out.println("文件名:"?+?file.getAbsolutePath()); ????????????}?else?{ ????????????????
printDir2(file); ????????????
} ????????
} ????
}
}
public?void?close() :关闭此输出流并释放与此流相关联的任何系统资源。
public?void?flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public?void?write(byte[]?b) :将 b.length字节从指定的字节数组写入此输出流。 public?void?write(byte[]?b,?int?off,?int?len) :从指定的字节数组写入 len字节,从偏移量 o?开始输 出到此输出流。
public?abstract?void?write(int?b) :将指定的字节输出流。
//这两种默认不支持追加,没有指定文件会自动创建
public?FileOutputStream(File?file) :创建文件输出流以写入由指定的 File对象表示的文件。 public?FileOutputStream(String?name) : 创建文件输出流以指定的名称写入文件。
public?FileOutputStream(File?file,?boolean?append) : 创建文件输出流以写入由指定的 File对象表示的文件。参数2表示能否追加数据(不能则每次都是先清空在写入数据)
public?FileOutputStream(String?name,?boolean?append) : 创建文件输出流以指定的名称写入文件。
public?void?close() :关闭此输入流并释放与此流相关联的任何系统资源。
public?abstract?int?read() : 从输入流读取数据的下一个字节。
public?int?read(byte[]?b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
FileInputStream(File?file) ://路径下没有文件会抛异常
FileInputStream(String?name) : //路径下没有文件会抛异常
public?void?close() :关闭此流并释放与此流相关联的任何系统资源。
public?int?read() : 从输入流读取一个字符。
public?int?read(char[]?cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
FileReader(File?file) : 创建一个新的 FileReader ,给定要读取的File对象。 FileReader(String?fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。
void?write(int?c) 写入单个字符。
void?write(char[]?cbuf) 写入字符数组。
abstract??void?write(char[]?cbuf,?int?off,?int?len)
void?write(String?str) 写入字符串。
void?write(String?str,?int?off,?int?len)
void?flush() 刷新该流的缓冲。
void?close() 关闭此流,但要先刷新它。
FileWriter(File?file) : 创建一个新的 FileWriter,给定要读取的File对象。 FileWriter(String?fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。
public?BufferedInputStream(InputStream?in) :创建一个 新的缓冲输入流。 public?BufferedOutputStream(OutputStream?out) : 创建一个新的缓冲输出流
//?创建字节缓冲输入流
BufferedInputStream?bis?=?new?BufferedInputStream(new?FileInputStream("bis.txt"));
//?创建字节缓冲输出流
BufferedOutputStream?bos?=?new?BufferedOutputStream(new?FileOutputStream("bos.txt"));
public?BufferedReader(Reader?in) :创建一个 新的缓冲输入流。
public?BufferedWriter(Writer?out) : 创建一个新的缓冲输出流。
//?创建字符缓冲输入流
BufferedReader?br?=?new?BufferedReader(new?FileReader("br.txt"));
//?创建字符缓冲输出流
BufferedWriter?bw?=?new?BufferedWriter(new?FileWriter("bw.txt"));
BufferedReader: public?String?readLine() : 读一行文字。
BufferedWriter: public?void?newLine() : 写一行行分隔符,由系统属性定义符号。
InputStreamReader类:是Reader的子类
构造方法
InputStreamReader(InputStream?in) : 创建一个使用平台默认字符集的字符流。 InputStreamReader(InputStream?in,?String?charsetName) : 创建一个指定字符集的字符流。即按指定编码读取流中的内容。
OutputStreamWriter类:是Writer的子类
构造方法
OutputStreamWriter(OutputStream?in) : 创建一个使用默认字符集的字符流。 OutputStreamWriter(OutputStream?in,?String?charsetName) : 创建一个指定字符集的字符流。,即按指定的字符类型输出
ObjectOutputStream类:将java对象的原始数据类型写到文件中,实现对象的持久存储
构造方法
public?ObjectOutputStream(OutputStream?out) : 创建一个指定OutputStream的ObjectOutputStream
具体操作
方法
public?final?void?writeObject?(Object?obj) : 将指定的对象写出
ObjectInputStream类:反序列化操作
构造方法
public?ObjectInputStream(InputStream?in) : 创建一个指定InputStream的ObjectInputStream
方法
public?final?Object?readObject?() : 读取一个对象。
注意
PrintStream类
构造方法
public?PrintStream(String?fileName) : 使用指定的文件名创建一个新的打印流
System.out就是一个PrintStream类型,只不过它是向控制台打印。
?public?static?void?main(String[]?args)?throws?IOException?{
//?调用系统的打印流,控制台直接输出97? ??????? ????????
System.out.println(97); ??????
//?创建打印流,指定文件的名称? ??????? ????????
PrintStream?ps?=?new?PrintStream("ps.txt"); ???????? ??????
//?设置系统的打印流流向,输出到ps.txt ?? ????????
System.setOut(ps); ??????
//?调用系统的打印流,ps.txt中输出97 ?? ????????
System.out.println(97); ????
}
Socket类:用于客户端套接字
构造方法和成员方法
public?Socket(String?host,?int?port)//连上指定主机的端口上
public?InputStream?getInputStream() : 返回此套接字的输入流
public?OutputStream?getOutputStream() : 返回此套接字的输出流。
public?void?close() :关闭此套接字。 //这个也会将流给关闭
public?void?shutdownOutput() : 禁用此套接字的输出流
ServerSocket类:用于服务端套接字
构造方法和成员方法
public?ServerSocket(int?port) //指定服务端的端口号
public?Socket?accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法 会一直阻塞直到建立连接
服务端实现
public?class?ServerTCP?{ ????
public?static?void?main(String[]?args)?throws?IOException?{ ????????
System.out.println("服务端启动?,?等待连接?....?"); ????????
//?1.创建?ServerSocket对象,绑定端口,开始等待连接 ????????
ServerSocket?ss?=?new?ServerSocket(6666); ????????
//?2.接收连接?accept?方法,?返回?socket?对象. ????????
Socket?server?=?ss.accept(); ????????
//?3.通过socket?获取输入流 ????????
InputStream?is?=?server.getInputStream(); ????????
//?4.一次性读取数据 ??????
//?4.1?创建字节数组 ?? ????????
byte[]?b?=?new?byte[1024]; ??????
//?4.2?据读取到字节数组中. ?? ????????
int?len?=?is.read(b); ????????
//?4.3?解析数组,打印字符串信息 ????????
String?msg?=?new?String(b,?0,?len); ????????
System.out.println(msg); ????????
//5.关闭资源. ????????
is.close(); ????????
server.close(); ????
}
}
public?class?ClientTCP?{
public?static?void?main(String[]?args)?throws?Exception?{? ???
System.out.println("客户端?发送数据");? ???????
//?1.创建?Socket?(?ip?,?port?)?,?确定连接到哪里.? ???????
Socket?client?=?new?Socket("localhost",?6666);? ???????
//?2.获取流对象?.?输出流? ???????
OutputStream?os?=?client.getOutputStream();? ???????
//?3.写出数据.? ???????
os.write("你好么??tcp?,我来了".getBytes());? ???????
//?4.?关闭资源?.? ???????
os.close();? ???????
client.close();? ???????
}? ???
}
原文:https://www.cnblogs.com/liujiashun/p/12194674.html