java基础
-
容器
-
数组
-
//一维数组
int [] a1 = new int [] {1,2,3};
int [] a2 = {1,2,3};
int [] a3 = new int [3] ;
// a3 = {1 ,2 3};//只有声明是可以这样赋值;
a3 = new int [] {1,2,3};//常规赋值要用new;
//二维数组
//长方形数组
int [][] b0 = new int [3][4];
//非长方形数组
int [][] b1 = new int [][] {{1,2,3},{2,3},{3}};
int [][] b2 = {{1,2,3},{2,3},{3}};
int [][] b3 = new int [4][];
b3[0] = new int[] {1,2,3};
// b3[0] = {1,2,3};//错,常规赋值要用new;
b3[1] = new int[] {2,3};
复制数组,System的静态方法:
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)将指定源数组中的数组从指定位置复制到目标数组的指定位置。
-
操作数组的 Arrays 工具类
软件包 : java.util.Arrays
public static int binarySearch(int[] a,int key);
public static int binarySearch(int[] a,int fromIndex,int toIndex,int key);
使用二叉搜索算法搜索指定的int数组的指定值。 在进行此调用之前,必须对数组进行排序。找到返回索引,否则返回-1;
public static int[] copyOf(int[] original,int newLength)
复制指定的数组;
public static boolean equals(int[] a,int[] a2)
如果两个指定的int数组彼此相等 ,则返回true
public static void fill(int[] a,int val)
public static void fill(int[] a,int fromIndex,int toIndex,
int val)
将指定的int值分配给指定的int数组的指定范围的每个元素
-
泛型容器
该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,该类没有同步方法,LinkedList 查找效率低。
该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。
该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。存放在HashMap集合key部分和HashSet集合中的元素需要同时重写hashCode和equals。
TreeMap的key或者TreeSet集合中的元素要想排序,有两种实现方式:
第一种:实现java.lang.Comparable接口。
第二种:单独编写一个比较器Comparator接口。
它存储的内容是键值对(key-value)映射。该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
Iterator
这里通过实例列出 Iterator 和 ListIterator 接口提供的所有方法。
-
操纵容器的Collections 工具类
软件包: java.util.Collections
public static <T> boolean addAll(Collection<? super T> c,
T... elements)
将所有指定的元素添加到指定的集合。 要添加的元素可以单独指定或作为数组指定。 这种方便方法的行为与c.addAll(Arrays.asList(elements))相同
public static <T> void copy(List<? super T> dest,
List<? extends T> src)
将所有元素从一个列表复制到另一个列表中。
public static void reverse(List<?> list)
反转指定列表中元素的顺序。
public static void shuffle(List<?> list)
使用默认的随机源随机排列指定的列表
public static <T extends Comparable<? super T>> void sort(List<T> list)
根据其元素的natural ordering ,将指定的列表按升序排序。 列表中的所有元素必须实现Comparable接口
-
容器之间的转换
1 int[] data = {4, 5, 3, 6, 2, 5, 1}; 2 List<Integer> list1 = Arrays.stream(data).boxed().collect(Collectors.toList()); 3 // int[] 转 List<Integer> 4 // Arrays.stream(arr) 可以替换成IntStream.of(arr)。 5 // 1.使用Arrays.stream将int[]转换成IntStream。 6 // 2.使用IntStream中的boxed()装箱。将IntStream转换成Stream<Integer>。 7 // 3.使用Stream的collect(),将Stream<T>转换成List<T>,因此正是List<Integer>。 8 // int[] 转 Integer[] 9 Integer[] integers1 = Arrays.stream(data).boxed().toArray(Integer[]::new); 10 // 前两步同上,此时是Stream<Integer>。 11 // 然后使用Stream的toArray,传入IntFunction<A[]> generator。 12 // 这样就可以返回Integer数组。 13 // 不然默认是Object[]。 14 // List<Integer> 转 Integer[] 15 Integer[] integers2 = list1.toArray(new Integer[0]); 16 // 调用toArray。传入参数T[] a。这种用法是目前推荐的。 17 // List<String>转String[]也同理。 18 // List<Integer> 转 int[] 19 int[] arr1 = list1.stream().mapToInt(Integer::valueOf).toArray(); 20 // 想要转换成int[]类型,就得先转成IntStream。 21 // 这里就通过mapToInt()把Stream<Integer>调用Integer::valueOf来转成IntStream 22 // 而IntStream中默认toArray()转成int[]。 23 // Integer[] 转 int[] 24 int[] arr2 = Arrays.stream(integers1).mapToInt(Integer::valueOf).toArray(); 25 // 思路同上。先将Integer[]转成Stream<Integer>,再转成IntStream。 26 // Integer[] 转 List<Integer> 27 List<Integer> list2 = Arrays.asList(integers1); 28 // 最简单的方式。String[]转List<String>也同理。 29 // 同理 30 String[] strings1 = {"a", "b", "c"}; 31 // String[] 转 List<String> 32 List<String> list3 = Arrays.asList(strings1); 33 // List<String> 转 String[] 34 String[] strings2 = list3.toArray(new String[0]);
字符串String
在Java内部都是Unicode编码; //返回str以gbk编码的byte[] ; str.getBytes("gbk")
//将byte数组以gbk编码方式解码成Unicode
new String(byte[],"gbk")
-
StringBuffer
构造器
构造一个字符串缓冲区,其中没有字符,初始容量为16个字符。 |
|
StringBuffer(int capacity) |
构造一个字符串缓冲区,其中没有字符和指定的初始容量。 |
StringBuffer(String str) |
构造一个初始化为指定字符串内容的字符串缓冲区。 |
方法
append(char c) |
将 char参数的字符串表示形式追加到此序列。 |
|
append(char[] str) |
将 char数组参数的字符串表示形式追加到此序列。 |
|
append(char[] str, int offset, int len) |
将 char数组参数的子数组的字符串表示形式追加到此序列。 |
|
append(String str) |
将指定的字符串追加到此字符序列。 |
|
append(StringBuffer sb) |
将指定的 StringBuffer追加到此序列。 |
|
int |
capacity() |
返回当前容量。 |
char |
charAt(int index) |
返回指定索引处的此序列中的 char值。 |
int |
compareTo(StringBuffer another) |
按字典顺序比较两个 StringBuffer实例。 |
delete(int start, int end) |
删除此序列的子字符串中的字符。 |
|
deleteCharAt(int index) |
按此顺序删除指定位置的 char 。 |
|
int |
indexOf(String str) |
返回指定子字符串第一次出现的字符串中的索引。 |
int |
indexOf(String str, int fromIndex) |
从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引。 |
insert(int offset, char c) |
将 char参数的字符串表示形式插入此序列中。 |
|
insert(int offset, char[] str) |
将 char数组参数的字符串表示形式插入此序列中。 |
|
insert(int index, char[] str, int offset, int len) |
将 str数组参数的子数组的字符串表示形式插入此序列中。 |
|
insert(int offset, String str) |
将字符串插入此字符序列。 |
|
int |
lastIndexOf(String str) |
返回指定子字符串最后一次出现的字符串中的索引。 |
int |
lastIndexOf(String str, int fromIndex) |
返回指定子字符串最后一次出现的字符串中的索引,从指定索引开始向后搜索。 |
replace(int start, int end, String str) |
使用指定的 String的字符替换此序列的子字符串中的字符。 |
|
reverse() |
导致此字符序列被序列的反向替换。 |
|
void |
setCharAt(int index, char ch) |
指定索引处的字符设置为 ch 。 |
void |
setLength(int newLength) |
设置字符序列的长度。 |
substring(int start) |
返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。 |
|
substring(int start, int end) |
返回一个新的 String ,其中包含当前包含在此序列中的字符的子序列。 |
|
void |
尝试减少用于字符序列的存储空间。 |
-
StringBuilder
-
IO
-
java.io包下需要掌握的流有16个:
-
文件专属:
java.io.FileInputStream(掌握)
java.io.FileOutputStream(掌握)
java.io.FileReader
java.io.FileWriter
转换流:(将字节流转换成字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter
缓冲流专属:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream
数据流专属:
java.io.DataInputStream
java.io.DataOutputStream
标准输出流:
java.io.PrintWriter
java.io.PrintStream(掌握)
对象专属流:
java.io.ObjectInputStream(掌握)
java.io.ObjectOutputStream(掌握)
-
FileInpuFteam 字节流
FileInpuFteam
FileInputStream(String name) 创建一个 FileInputStream ,路径名 name
int available() 返回从此输入流中可以读取(或跳过)的剩余字节数
void close() 关闭此文件输入流并释放与流相关联的任何系统资源。
int read() 从该输入流读取一个字节的数据。读取结束返回-1;
int read(byte[] b) 从该输入流读取最多 b.length个字节的数据到一个字节数组。返回实际读取的个数,读取结束返回-1;
int read(byte[] b, int off, int len) 从该输入流读取最多 len个字节的数据到字节数组。
long skip(long n) 跳过并从输入流中丢弃 n字节的数据。
FileOutputStream
FileOutputStream(String name) 创建文件输出流以指定路径 name 写入文件。
FileOutputStream(String name, boolean append) 创建文件输出流以指定路径 name 写入文件,append决定是否从文件尾开始写入.
void write(byte[] b) 将 b.length字节从指定的字节数组写入此文件输出流。
void write(byte[] b, int off, int len) 将b[off]开始len个byte写入此文件输出流。
void write(int b) 将指定的字节写入此文件输出流。
示例代码:
//打开文件
FileInputStream fis = new FileInputStream("First/temp.txt");
//创建以该文件还可读取字节数目为长度的byte数组
byte[] str = new byte[fis.available()];
//读取文件str.length个字节
fis.read(str);
//关闭文件
fis.close();
System.out.println(new String(str));
String s = "hello 世界!";
byte[] b = s.getBytes();
FileOutputStream fos = new FileOutputStream("First/out.txt");
fos.write(b);
fos.close();
-
FileReader FileWritter 字符流
用法与字节流相似。用 char数组读写;
-
Other
-
异常
异常类型 |
说明 |
ArithmeticException |
算术错误异常,如以零做除数 |
ArraylndexOutOfBoundException |
数组索引越界 |
ArrayStoreException |
向类型不兼容的数组元素赋值 |
ClassCastException |
类型转换异常 |
IllegalArgumentException |
使用非法实参调用方法 |
lIIegalStateException |
环境或应用程序处于不正确的状态 |
lIIegalThreadStateException |
被请求的操作与当前线程状态不兼容 |
IndexOutOfBoundsException |
某种类型的索引越界 |
NullPointerException |
尝试访问 null 对象成员,空指针异常 |
NegativeArraySizeException |
再负数范围内创建的数组 |
NumberFormatException |
数字转化格式异常,比如字符串到 float 型数字的转换无效 |
TypeNotPresentException |
类型未找到 |
异常类型 |
说明 |
ClassNotFoundException |
没有找到类 |
IllegalAccessException |
访问类被拒绝 |
InstantiationException |
试图创建抽象类或接口的对象 |
InterruptedException |
线程被另一个线程中断 |
NoSuchFieldException |
请求的域不存在 |
NoSuchMethodException |
请求的方法不存在 |
ReflectiveOperationException |
与反射有关的异常的超类 |
异常方法
下面的列表是 Throwable 类的主要方法:
序号 方法及说明
1 public String getMessage()
返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。
2 public Throwable getCause()
返回一个Throwable 对象代表异常原因。
3 public String toString()
使用getMessage()的结果返回类的串级名字。
4 public void printStackTrace()
打印toString()结果和栈层次到System.err,即错误输出流。
5 public StackTraceElement [] getStackTrace()
返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。
6 public Throwable fillInStackTrace()
用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。
处理异常:
1 捕获异常: try-catch,在catch中处理异常
2 声明异常: 在方法中声明(throws)异常,由调用方处理
在方法改写中,子类声明的异常不能不父类多,即要么不抛异常,要么就抛出跟父类方法相同的异常或该异常的子类。
-
线程
-
创建线程的两种方法:
-
对Thread进行扩展,为其提供一个新的run方法;
-
创建 Runnable接口的实例,把它作为入口参数传给Thread构造函数,来创建 Thread的实例。
-
-
public void start() |
public void run() 否则,该方法不执行任何操作并返回。 |
public final void setName(String name) |
public final void setPriority(int priority) |
public final void setDaemon(boolean on) |
public final void join(long millisec) |
public void interrupt() |
public final boolean isAlive() |
上述方法是被 Thread 对象调用的,下面表格的方法是 Thread 类的静态方法。
public static void yield() |
public static void sleep(long millisec) |
public static boolean holdsLock(Object x) |
public static Thread currentThread() |
public static void dumpStack() |
-
把代码标成同步的两种方法
用 synchronized把整个方法都变成同步(执行时必须获得包含该方法的对象(this)锁)
用 synchronized(obj){}把一段程序代码变成同步(执行时,必须获得 obj的锁)
死锁:两个线程,相互等待对方释放锁。Java不能自动检测和避免
可采用以下方法来避免:
确定获取锁的次序;始终遵守该次序;以相反的次序来释放锁
-
线程通信
-
常用类
-
Date
-
1、获取系统当前时间
Date d = new Date();
2、日期格式化:Date --> String
yyyy-MM-dd HH:mm:ss SSS
SimpleDateFormat sdf = new SimpleDate("yyyy-MM-dd HH:mm:ss SSS");
String s = sdf.format(new Date());
3、String --> Date
SimpleDateFormat sdf = new SimpleDate("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse("2008-08-08 08:08:08");
4、获取毫秒数
long begin = System.currentTimeMillis();
Date d = new Date(begin - 1000 * 60 * 60 * 24);
-
数字
3.1、DecimalFormat数字格式化
###,###.## 表示加入千分位,保留两个小数。
###,###.0000 表示加入千分位,保留4个小数,不够补0
//加入千分位,保留两位小数
DecimalFormat df = new DecimalFormat("###,###.##");
System.out.println(df.format(1234.23452));
//加入千分位保留4位小数,不够补零
System.out.println(new DecimalFormat("###,###.0000").format(12345.12));
3.2、BigDecimal
财务软件中通常使用BigDecimal
-
Random
4.1、怎么产生int类型随机数。
Random r = new Random();
int i = r.nextInt();
4.2、怎么产生某个范围之内的int类型随机数。
Random r = new Random();
int i = r.nextInt(101); // 产生[0-100]的随机数。
-
Other
-
反射
-
Java中的类反射
-
构造Class对象有3种方式:
1.Class.forName();
Class clazz = Class.forName("java.lang.String");
Object obj = clazz.newInstance();
2.类.class;
Class stringClass = String.class;
3.Object.getClass();
String s = "s";
Class cStr = s.getClass();
-
Java反射中的主要类和方法
软件包 java.lang.reflect
提供类和接口,以获取关于类和对象的反射信息。
-
ttt
-
Java小知识
-
byte,short 运算后变为int;
-
大范围类型向小范围类型强转,小范围向大范围自动转换;
-
方法体中不能定义静态变量;
-
只有final 可以修饰方法参数;
-
子类改写方法的访问控制权限不能比父类窄;
-
子类改写方法声明异常不能比父类多;
-
子类改写方法返回类型可以是父类的方法返回类型的子类;
-
System.currentTimeMillis();返回当前时间(毫秒,long);
-
System.gc();建议回收垃圾;
-
-
案例
-
ResourceBundle
// 属性资源文件绑定
ResourceBundle bundle = ResourceBundle.getBundle("包名.文件名");//resources.jdbc
// 根据属性配置文件key获取value
String driver = bundle.getString("driver");
-
t
-
onthr