一、哪个Set类是按元素排好序的?
TreeSet:自然排序(即按元素排好序)
二、map.containskey(Object key)方法
判断该key在map中是否有key存在。如果存在则返回true,反之,返回false。
本示例首先使用HashMap类创建Map集合对象,并向集合中添加几个元素,然后调用containsKey方法查询是否包含指定的键名。
public static void main(String[] args) { Map map = new HashMap(); //定义Map对象 map.put("apple", "新鲜的苹果"); //向集合中添加对象 map.put("computer", "配置优良的计算机"); map.put("book", "堆积成山的图书"); map.put("time", new Date()); String key = "book"; boolean contains = map.containsKey(key); //判断是否包含指定的键值 if (contains) { //如果条件为真 System.out.println("在Map集合中包含键名" + key); //输出信息 } else { System.out.println("在Map集合中不包含键名" + key); } }
三、字符串基本操作
1.字符串的创建和赋值
String 字符串变量名;
字符串变量名="字符串常量";
String username;
username="Tom"
或者
String 字符串变量名="字符串常量";
String SayHello="Hello world";
或者
String studentName=new String("周杰杰");
2.获取字符串的长度
length()方法是用来获取字符串长度的。它会返回字符串对象中所包含的字符的个数
public class myfirst {
public static void main(String[] args) {
String sayHello="Hello,Welcome to Java!!!"; //创建一个sayHello字符串并赋值
int length=sayHello.length(); //创建一个变量length存放所获取的字符串长度
System.out.println(length);
}
}
运行结果为:24
注意:字符串中的标点或空格在计算字符串长度时,也要包括在内
3.字符串拼接
string1.concat(string2); concat()方法返回一个字符串,是将字符串string2添加到string1后面之后形成新字符串。
public class myfirst {
public static void main(String[] args) {
String sayHello1="Hello,"; //创建字符串sayHello1、sayHello2并赋值
String sayHello2="Welcome to Java!!!";
String sayHello3=sayHello1.concat(sayHello2); //将合并后的字符串赋值给sayHello3
System.out.println(sayHello3);
}
}
运行结果为:Hello,Welcome to Java!!!
也可以直接使用字符串字面量来调用concat()方法。
String sayHello3="Hello,".concat("welcome to Java!!!")
连接字符串还可以使用加号“+”运算符。这是一个重载了的运算符,用来直观地连接两个字符串,它使用起来比concat()方法更加灵活。
String 字符串3=字符串1+字符串2;
注:Java会根据加号运算符两边的操作数类型来决定是进行算术运算还是字符串连接的运算。
4.字符串比较
equals()方法,它是比较两个字符串是否相等,返回值boolean值;equalsIgnoreCase()方法,同样返回值为boolean值。
字符串1.equals(字符串2); //严格比较字符串是否相同
字符串1.equalsIgnoreCase(字符串2); //忽略字母大小写来进行比较
public class myfirst {
public static void main(String[] args) {
String sayHello1="HELLO"; //创建两个字符串
String sayHello2="hello";
System.out.println(sayHello1.equals(sayHello2)); //使用equals方法进行严格比较
System.out.println(sayHello1.equalsIgnoreCase(sayHello2)); //使用equalsIgnoreCase方法忽略大小写进行比较
}
}运行结果:
false
true
compareTo方法比较两个字符串的大小
- 若调用方法的字符串比较参数字符串大,返回正整数;
- 若比参数字符串小,则返回负整数;
- 若两字符串相等,则返回0;
- 若两个字符串各个位置的字符都相同,仅长度不同,则返回值为两者长度之差
public class myfirst {
public static void main(String[] args) {
String sayHello1="HELLO";
String sayHello2="hello";
System.out.println(sayHello1.compareTo(sayHello2)); //比较两个字符串的大小
}
}
5.字符串查找
int indexOf(char ch):搜索字符ch出现的第一个索引号,如果没有找到匹配,则返回-1;
int indexOf(char ch,int fromIndex):从fromIndex位置开始搜索字符ch出现的第一个索引号;
int indexOf(String str):搜索字符串str出现的第一个索引号。
public class myfirst {
public static void main(String[] args) {
String s1="abcdefg"; //创建字符串s1并赋值
System.out.println(s1.indexOf('c')); //输出字符'c'的索引号
System.out.println(s1.indexOf('c',5)); //输出索引号为5的字符是否是字符'c'
System.out.println(s1.indexOf("de")); //输出字符串出现的第一个索引号
}
}
运行结果:
2
-1
3
6.字符串截取
String substring(int index):提取从位置索引开始的字符串部分;
String substring(int beginindex,int endindex):提取beginindex到endindex-1为止的字符串部分
public class myfirst {
public static void main(String[] args) {
String s1="abcdefg";
System.out.println(s1.substring(3)); //截取开始位置为3的字符串
System.out.println(s1.substring(2, 5)); //截取开始索引为2,结束索引为5但不包含5的字符串
}
}
运行结果:
defg
cde
7.字符串替换
replace方法可以实现用新字符去替代字符串中指定的所有字符。
string1.replace(char oldchar,char newchar)
public class myfirst {
public static void main(String[] args) {
String s1="abcdeag";
char oldchar='a'; //被替换字符
char newchar='A'; //替换字符
String s2=s1.replace(oldchar, newchar); //进行替换
System.out.println("替换后的字符串为:"+s2); //输出新字符串
}
}
运行结果:
替换后的字符串为:AbcdeAg
8.字符数组转换为字符串
我们可以将字符数组转换为字符串,然后利用字符串对象的属性和方法,进一步对字符串进行处理,
public class myfirst {
public static void main(String[] args) {
char []helloArray= {'h','e','l','l','o'}; //声明一个字符数组
String helloString=new String(helloArray); //将字符数组作为构造函数的参数
System.out.println(helloString);
}
}
运行结果:hello
9.字符串转换为字符数组
我们也可以将字符串转换为字符数组,这需要使用字符串对象的一个方法toCharArray()。它返回一个字符串对象转换过来的字符数组。
public class myfirst {
public static void main(String[] args) {
String helloString ="hello"; //声明一个字符串变量并赋值
char []helloArray=helloString.toCharArray(); //进行字符串和字符数组的转换
for(int i=0;i<helloArray.length;i++) { //for循环输出字符数组
System.out.print(helloArray[i]+" ");
}
}
}
运行结果:
h e l l o
三、try catch
try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。
注意:说try代码块抛出的异常catch代码块会精确匹配,这是错的!!
原因是除精确匹配之外,还有父类匹配。在没有精确匹配的时候,会命中父类。如果没有精确匹配,也没命中父类,就会命中父类的父类,不断寻找,直到命中一个catch代码块。
- throws 捕获并向外抛出异常
- throw 抛出异常
- try catch 是内部捕获异常并做自定义处理
- finally 是无论是否有异常都会被处理的语句,除非在finally前存在被执行的 System.exit(int i)时除外
异常介绍:http://t.csdnimg.cn/4eIrz
受检异常及非受检异常区别和使用:http://t.csdnimg.cn/qTTbK
受检以及非受检异常及使用建议:http://t.csdnimg.cn/bTx2Z
(互相补充吧)
四、jdk的常用包
1.java.lang:语言包
2.java.util:实用包
3.java.awt:抽象窗口工具包
4.javax.swing:轻量级的窗口工具包,这是目前使用最广泛的GUI程序设计包
5.java.io:输入输出包
6.java.net:网络函数包
7.java.applet:编制applet用到的包(目前编制applet程序时,更多的是使用swing中的JApplet类)。
更细的介绍:http://t.csdnimg.cn/ZBsQ8
五、广播
浅了解一下吧
广播的发送方式分为有序和无序
广播的注册方式分为静态和动态
优先级高的越早接收
相同优先级下动态注册比静态注册更早接收
有序和无序:http://t.csdnimg.cn/Ac6RL
静态和动态:http://t.csdnimg.cn/VNDY3
六、进程 线程相关
关系区别:http://t.csdnimg.cn/NuT6O
1.java 中有几种方法可以实现一个线程?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
thread和runnable的区别?
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
thread是类,runnable为接口,建议使用runable实现多线程。
同步的实现方面有两种,分别是synchronized,wait与notify
同步的实现方式有两种,同步方法和同步代码块,这两种方式都要用到synchronized关键字。
同步方法是在方法返回类型前边加上synchronized关键字
同步代码块是synchronized(同步的对象){ }
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉 InterruptedException(中断异常)异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒 某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处于等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是 让它们竞争。
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程 必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
2.用什么关键字修饰同步方法?
用synchronized 关键字修饰同步方法
synchronized和lock区别:
lock能够完成synchronized所实现的所有功能;lock有比synchronized更精确的线程语义和更好的性能;synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放;Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。
3.stop() 和suspend()方法为何不推荐使用?
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一 种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题 所在。
suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍 然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的 线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定 的资源,就会造成死锁,所以不应该使用suspend()。
而应在自己的Thread类中置入一个 标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状 态。若标志指出线程应当恢复,则用一个notify()重新启动线程。
4.优先级
后台线程:处于后台运行,任务是为其他线程提供服务。也称为“守护线程”或“精灵线程”。JVM的垃圾回收就是典型的后台线程。
特点:若所有的前台线程都死亡,后台线程自动死亡。
每一个Java线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。
Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:
static int MAX_PRIORITY
线程可以具有的最高优先级,取值为10。
static int MIN_PRIORITY
线程可以具有的最低优先级,取值为1。
static int NORM_PRIORITY
分配给线程的默认优先级,取值为5。
Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。
每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。
七、垃圾回收机制GC
1.GC
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方, 忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以 自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分 配内存的显示操作方法。
2.GC机制
八、安卓开发的四大组件
了解一下:http://t.csdnimg.cn/Fx9uN
活动(activity),用于表现功能;
activity的启动模式:standard、singleTop、singleTask、singleInstance
服务(service),后台运行服务,不提供界面呈现;
startService(启动)
广播接受者(Broadcast Receive),勇于接收广播;
abortBroadcast()
方法可以中断所有广播——这是错误的。
原因:abortBroadcast()
方法仅用于中断当前正在处理的有序广播(Ordered Broadcast)的后续传递。
在Android中,广播的中断主要涉及到有序广播(Ordered Broadcast)。与无序广播(Normal Broadcast)不同,有序广播允许广播接收者按照指定的优先级顺序接收广播,并且前面的接收者可以选择中断广播,阻止它继续传递给后面的接收者。
要实现广播的中断,需要发送一个有序广播,并在某个接收者的onReceive
方法中调用abortBroadcast()
方法。这样,当这个接收者收到广播后,它就会中断广播的传递,后面的接收者将不会收到这个广播。
需要注意的是,有序广播的中断仅对后面的接收者有效。如果某个接收者的优先级设置得非常高,以至于它在所有其他接收者之前收到广播并中断了它,那么只有这个接收者会处理这个广播。其他所有接收者都不会收到它。
此外,无序广播是无法被中断的,因为它们会同时发送给所有注册的接收者,且没有顺序性。
内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库。
containskey方法示例指路:http://t.csdnimg.cn/Yx6db
指路字符串转自:http://t.csdnimg.cn/cd9e7