集合
---|Collection: 单列集合
---|List: 有存储顺序, 可重复
---|ArrayList: 数组实现, 查找快, 增删慢
由于是数组实现, 在增和删的时候会牵扯到数组
增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快
---|LinkedList: 链表实现, 增删快, 查找慢由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素. 这样的增删效率较高但查询时需要一个一个的遍历, 所以效率较低
---|Vector: 和ArrayList原理相同, 但线程安全, 效率略低
和ArrayList实现方式相同, 但考虑了线程安全问题, 所以效率略低
---|Set: 无存储顺序, 不可重复
---|HashSet 线程不安全,存取速度快。底层是以哈希表实现的。
---|TreeSet 红-黑树的数据结构,默认对元素进行自然排
序(String)。如果在比较的时候两个对象
返回值为0,那么元素重复。
---| Map: 键值对 键不可重复,键可以重复
---|HashMap 线程不安全,存取速度快。底层是以哈希表实现的.
---|TreeMap 红-黑树的数据结构,默认对元素进行自然排
序(String)。如果在比较的时候两个对象
返回值为0,那么元素重复
---|HashTable 底层也是使用了哈希表 维护的,存取的读取快,存储元素是
无序的。
泛型
泛型类型必须是引用类型
使用泛型方法前需要进行泛型声明,使用一对尖括号 ,声明的位置在static后返回值类型前。
当一个类中有多个函数声明了泛型,那么该泛型的声明可以声明在类上。
函数泛型:
public T getData(T data) {
return data;
}
类泛型:
public class Demo6 {
public static void main(String[] args) {
System.out.println(getData2(100));
}
public T getData(T data) {
return data;
}
//静态方法不可以使用类中定义的泛型,错误
public static T getData2(T data) {
return data;
}
}
创建对象的时候要指定泛型的具体类型
创建对象时可以不指定泛型的具体类型(和创建集合对象一眼)。默认是Object,例如我们使用集合存储元素的时候没有使用泛型就是那么参数的类型就是Object
类上面声明的泛型只能应用于非静态成员函数,如果静态函数需要使用泛型,那么需要在函数上独立声明(加T)。
如果建立对象后指定了泛型的具体类型,那么该对象操作方法时,这些方法只能操作一种
数据类型。
所以既可以在类上的泛型声明,也可以在同时在该类的方法中声明泛型。
IO流
读文件:
public static void main(String[] args) {
String path = "c:/a.txt";
FileInputStream in = null;
try {
// 打开流
in = new FileInputStream(path);
// 使用流读文件内容
int b = in.read();
while (b != -1) {
System.out.print((char) b);
b = in.read();
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
// 释放资源
if (in != null) {
try {
in.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
拷贝文件
public static void main(String[] args) {
String srcPath = "c:/a.txt";
String destPath = "c:/b.txt";
// 一定要使用字节流
InputStream in = null;
OutputStream out = null;
try {
// 打开流
in = new FileInputStream(srcPath);
out = new FileOutputStream(destPath);
// 使用流
byte[] buf = new byte[1024 * 8];
for (int len = -1; (len = in.read(buf)) != -1;) {
out.write(buf, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
}
多线程
两种启动线程方法:
private static int count = 100;
public static void main(String[] args) {
// 用继承Thread类的方式启动一个线程
new Thread() {
public void run() {
synchronized (StartThreadTest.class) {
while (count > 0) {
count--;
System.out.println(Thread.currentThread() + "卖了一张票,还剩" + count);
}
}
}
}.start();
// 用实现Runnable接口的方式启动一个线程
new Thread(new Runnable() {
public void run() {
synchronized (StartThreadTest.class) {
while (count > 0) {
count--;
System.out.println(Thread.currentThread() + "卖了一张票,还剩" + count);
}
}
}
}).start();
}
由于文章篇幅原因只写了一部分,本人这边专门整理了一套对应的Java pdf文档复习资料,含全面的java学习资料和就业面试题,需要获取这套文档资料的读者朋友们可以关注小编,后台私信关键字“面试资料”获取这套Java面经pdf文档资料。
![ca9d9a5f7e30cc52149bbdf95852caad.png](https://i-blog.csdnimg.cn/blog_migrate/630bc6b26d0fdd373a3ec895910b685c.jpeg)
![abad9e479da46ad2b56c86252f39f704.png](https://i-blog.csdnimg.cn/blog_migrate/aceef3dff3a9df540816a23afb6641cc.jpeg)
![9adaefa431a336fb454ca5d958f35ffd.png](https://i-blog.csdnimg.cn/blog_migrate/36a187ea6ff3896b43585059e3711639.jpeg)
觉得此文不错的大佬们可以帮忙转发分享一下,希望能帮助到更多正在为面试做准备的码友们,感谢!!!!
![f1851dad49bd012db9e8fdc1e51e82ab.png](https://i-blog.csdnimg.cn/blog_migrate/cfa38d5cfdd24a726bf153a120bec95f.jpeg)