保持这两天的速度,争取明天看完Java基础
1:collection和collections的区别
1)collection:集合接口,提供了对集合对象进行基本操作的通用接口方法
在Java类库中有很多具体的实现。
意义就是为了各种具体的集合提供最大化的统一操作方式
List --LinkedList
--ArrayList
--Vector
Set --TreeSet
--HashSet
2)collections:包装类,包含各种有关集合操作的静态多态方法
此类不能实例化,就像一个工具类,所以只能用类名.方法名调用
*常用方法:
a)collections.sort(集合):按自然顺序排序
b)collections.shuffle(集合):按随机顺序排序
c)collections.binarySearch(集合,元素):查找指定集合中的元素,返回查找的索引
d)collections.max(集合):通过自然顺序比较,返回集合的最大值
collections.max(集合,比较器):按照自定义的比较器返回集合中的最大值
e)collections.indexOfSubList(集合,子集合):查找子集合在集合中首次出现的位置
f)collections.reverse(集合):反转集合中的元素
g)collections.rotate(集合,移动的距离m):集合中的元素向后移动m个位置,在后面被遮盖的元素循环到前面来
public class Test{
public static void main(String [] args){
List list=Array.asList("one two three four five six siven".split(" "));
System.out.println(list);
Collections.rotate(list,1);
System.out.println(list);
}
}
运行结果:one two three four five six siven
siven,one,two,three,four,five,six
h)collections.copy(list1,list2):将集合2中的元素全部复制进集合1中,并且覆盖相应索引的元素
public class Test{
public static void main(String [] args){
List list1=Array.asList("one two three four five six siven".split(" "));
System.out.println(list);
List list2=Array.asList("我 是 复制的".split(" "));
System.out.println(list2);
Collections.copy(list1,list2);
System.out.println(list1);
}
}
运行结果:one two three four five six siven
我 是 复制的
我,是,复制的,four,five,six,siven
i)collections.swap(集合,index1,index2):交换集合中指定索引的元素
j)collections.fill(集合,obj):将集合中的所有元素用obj替换
2:map:存储键值对的集合。一对一对的往里面存,而且要保证键的唯一性
*面试考过一个问题:map允许null键吗?Answer:hashTable不允许,hashMap允许
|--HashTable:底层哈希表,不可以存入null作为键和值,该集合是线程同步的,效率低。jdk1.0以后出现的额
|--HashMap:底层哈希表,允许存储null作为键和值,线程不同步,效率高。jdk1.2以后出现的
|--TreeMap:底层二叉树,线程不同步,用于给集合中的键进行排序
*基本操作
1)添加:put(K key V value):如果添加的键是原来就存在的,后添加的值会覆盖之前的值,并且返回被覆盖的值
putAll(Map<? extends K,extends V>m)
2)删除:clear:
3)判断:containsValue(Object value)
containsKey(Object key)
isEmpty()
4)获取:get(Object key):可以通过这个方法来判断一个键是否存在,通过返回null来判断
size()
values():获取map中所有值的集合
entrySet():获取map所有映射关系的集合
keySet():获取map所有键的集合
特别讲一下map的两种取出方式:
1)keySet():将所有的键存入到set集合中,使用set的迭代器迭代出所有的键,通过键获取值
2)entrySet():将集合的映射关系取出,存入到一个set集合中。
set集合的类型是Map.Entry
class MapDemo2
{
public static void main(String []args)
{
Map<String ,String > map=new HashMap<String,String>();
map.put("02","zhangsan2");
map.put("03","zhangsan3");
map.put("01","zhangsan1");
map.put("04","zhangsan4");
//取出键的集合
Set keySet=map.keySet();
Iterator it=keySet.iterator();
while(it.hasNext()){
String key=it.next();
String value=map.get(key);
//取出映射关系
Set<Map.entry<String,String>> entrySet=map.entrySet();
Iterator it=entrySet.iterator();
while(it.hasNext()){
Map.Entry<String,String> entry=it.next();
String key=entry.getKey();
String value=entry.getValue();
}
}
}
1:可变参数:jdk1.5以后出现的新特性
*其实就是一种数组参数的简写形式,不用每一次都手动的建立数组对象
只要将操作的元素作为参数传递即可,隐式的将这些参数封装成数组
*注意事项:可变参数一定要定义在参数列表的最后
2:静态导入:当类名重名时,需要指定具体的包名
当方法名重名时,需要指定所属对象或类
3:System:类中的方法和属性都是静态的
1)out:标准输出,默认是控制台
2)in:标准输入,默认是键盘
*描述系统的一些信息
io开始
1:date
eg:
//如果直接打印这个值,输出的格式只是一串数字,没有多大意义
Date d=new Date();
//所以我们使用一个格式类,定义我们自己的格式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年M月dd日E hh:mm:ss");
//然后调用它的format方法将日期用我们定义的格式输出
String time=sdf.format(d);
2:math
Math.ceil():返回大于指定数据的最小整数
Math.floor():取整,返回小于指定数据的最大整数
Math.round():四舍五入
Math.pow():次方运算
3:io:用来处理设备之前的数据传输
Java堆数据的操作都是通过流的方式
Java操作流的对象都在io包中
1)字节流:InputStream OutputStream
字符流:Reader Writer
字符流的由来:字符流的对象里面融合了编码表。
我们可以自己想要存储的编码方式
FileInputStream:字节文件读取流
FileReader:字符文件读取流
*有read()方法,一次读取一个字节,有一个小细节,我不是很懂
为什么直接在控制台打印的时候,就必须强转成char类型,否则输出的是数字编号
但是直接用输出流写到文件中去的时候,却不需要强转,输出就直接是字符
FileOutputStream:字节文件输出流
FileWriter:字符文件输出流
*有write()方法,可以写字符串,字符数组,int型数据(在文件中会按照ASCII码表进行字符的转换)等。
但是FileWriter的write方法,如果没有关流的话,必须手动刷新,不然数据还在缓冲区中
指定文件的时候,还可以在后面跟一个布尔值,如果为真,可以在原文件数据的末尾添加数据,而不是覆盖
3:缓冲区:为了提高流的操作效率而出现的,所以创建缓冲区之前,必须有流对象的存在
输出缓冲区提供了一个跨平台的换行符:newLine()
使用步骤:
1)创建io流对象
2)将需要提高效率的流对象传递给缓冲区的构造函数
3)操作缓冲区对象
4)使用缓冲区对象一定要刷新,因为缓冲区只有等缓冲区满了之后才会自动刷新。
*字符读取流缓冲区:提供了一个一次读一行的方法(readLine()),方便对文本数据的获取
当返回null时,表示读到了文件的末尾
*readLine方法只返回换行符之前的数据内容,并不会返回换行符('\r\n')
*带行号的缓冲区对象:即这个类有一个方法,可以在打印的时候打印出行号,并且可以自己设置行号的起始值
class LineBunberReaderDemo
{
public static void main(String []args)
{
FileReader fr=new FileReader("PersonDemo.java");
LineNumberReader lnr=new LineBunberReader(fr);
String line=null;
lnr.setLineNumber(100);
while((line=lnr.readLine())!=null)
{
System.out.println(lnr.getLineNumber()+"..."+line);
}
lnr.close();
}
}
4:转换流
*读取键盘录入:System.out:标准的输出设备
System.out:标准的输入设备
1)当我们读取键盘录入的时候,想录入一行,做简单处理之后就打印一行。
简单分析:其实就是读一行(readLine())的原理。
但素:readLine()是BufferReader的方法。
读取键盘录入的read()方法又是属于InputStream的。
此时就想,有没有一种流,能把字节流转换成字符流呢?
还真有,InputStreamReader
class ReadIn
{
public static void main(String []args) throws IOException
{
/*
//获取键盘录入对象
InputStream in=System.in;
//将字节流对象转换成字符流对象,使用转换流。InputStreamReader
InputStreamReader isr=new InputStreamReader(in);
//为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
BufferedReader bufr=new BufferedReader(isr);
*/
//键盘录入的最常见写法。等于前面三句话加起来,以后说到读取键盘录入,都直接写着一句
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
/*
OutputStreamReader out=System.out;
OutputStreamReader osw=new OutputStreamReader(out);
BufferedWriter bufw=new BufferedWriter(osw);
*/
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
//System.out.println((line.toUpperCase()));
}
bufr.close();
}
}
5:不知道叫啥
*流操作的基本规律,通过三个明确来完成。(因为流的体系非常复杂,所以最纠结的就是使用哪一个流对象)
1)明确源和目的:源:输入流 InputStream Reader
目的:输出流 OutputStream Writer
2)明确操作的数据是否是纯文本:是:字符流
不是:字节流
3)当体系明确后,再明确要使用哪个具体对象,通过设备来区分
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
**想要把指定的数据按照指定的编码表(utf-8)存储到文本中。
目的:OutputStream Writer
是否纯文本:是,Writer
设备:键盘-->文件 ,使用FileWriter。但是FileWriter使用的默认编码方式,GBK
要想在存储时加入指定的编码方式,只有转换流可以指定,所以要用到OutputStreamWriter
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要提高效率吗?需要
BufferedWriter bufw=new BufferedWriter(osw);
总而言之:转换流是字节和字符之间的桥梁,通常涉及到字符编码的指定时,就需要用到转换流
4:装饰设计模式:当想要对已有的对象进行功能的增强时,可以定义类,将已有对象传入,基于已有对象的功能,提供加强的功能
自定义的那个类就叫做装饰类
装饰类通常会通过构造方法接收被装饰的对象
并基于被装饰的对象的功能,提供更强的功能
*和继承的区别:装饰设计模式比继承体系灵活,避免了基继承体系的臃肿,降低了类于类之间的关系
装饰类因为是增强已有对象,具备的功能和已有对象是相同的,只不过提供了更强的供
所以装饰类和被装饰的类通常都是属于同一个体系中的
明天复习完基础部分,然后开始全面的框架学习,加油!