LeetCode
3.无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
暴力法
- 枚举所有子串
- 使用集合检查子串是否有重复字符
滑动窗口
[i, j)
左开右闭,向右侧滑动索引j,如果它不在 HashSet 中,我们会继续滑动 j。
这样找到的没有重复字符的最长子字符串将会以索引 ii 开头。
如果对所有的 i 这样做,就可以得到答案。
##
Question
Cannot make a static reference to the non-static method lengthOfLongestSubstring(String) from the type uniqueSubstring
java中静态方法不可以直接调用非静态方法和成员,也不能使用this关键字。
Cannot infer type arguments for hashmap<>
import java.util.Map; //hashmap添加map
import java.util.Set; //hashset添加set
map重复
map是无序的,它的查询需要通过key的值来查找,如果你定义两个同样的key,那么一个key就对应了多个值,这样就违背了java对map的定义,键和值是一一对应的。所以key不可以重复。
重复的值会覆盖之前的键值对。
try catch finally
try catch finally 都有返回:最终都会得到finally的返回结果。 try catch 都有返回 finally没有返回:try出现异常,会得到catch的返回结果。finally中的操作,不影响返回结果。 try catch 都有返回 finally没有返回:try没有异常,会得到try的返回结果。 finally中的操作,不影响返回结果。
重载
方法名一致,形参列表不同
Vector & ArrayList
vector支持线程的同步,也就是内部加锁的,但是效率低;因此新版JDK加入了线程不安全的ArrayList。
Java泛型
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
泛型通配符
?
任意类型,Object以及任意Java类。
? extends E
向下限定,E及其子类
? super E
向上限定,E及其父类
String StringBuffer StringBuilder
String:
字符串常量,字符串长度不可变。Java 中 String 是 immutable(不可变)的。
- String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
StringBuffer:
字符串变量(Synchronized,即线程安全)。
- 使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
append
方法始终将这些字符添加到缓冲区的末端;insert
方法则在指定的点添加字符。
StringBuilder:
字符串变量(非线程安全)。在内部,StringBuilder 对象被当作是一个包含字符序列的变长数组。
- 该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
StringBuilder():
创建一个容量为16的StringBuilder对象(16个空元素)
substring
[)
左闭右开,str.substring(0, str.length() - 1)
比str
少一位。
implement 实例
实例不需要main了吗?
class RunnableDemo implements Runnable {
private Thread t;
private String threadName;
RunnableDemo( String name) {
threadName = name;
System.out.println("Creating " + threadName );
}
public void run() {
System.out.println("Running " + threadName );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// 让线程睡眠一会
Thread.sleep(50);
}
}catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo( "Thread-1");
R1.start();
RunnableDemo R2 = new RunnableDemo( "Thread-2");
R2.start();
}
}