- 浏览: 55644 次
- 性别:
- 来自: 上海
最新评论
环境变量C:\jdk1.5.0_04 JDK安装路径
JAVA_HOME C:\jdk1.5.0_04
编辑系统变量
变量明: Path
变量值: C:\jdk1.5.0_04\bin
在编译Servlet时,有时会出现找不到servlet包的问题,真是因为servlet为jdk的扩展包,所以在使用时需要指定classpath,具体方法 -- set classpath=%Tomcat%\common\lib\servlet.jar
如果不指定classpath,可以采用如下方法:
--将C:\Tomcat 5.0\common\lib\servlet-api.jar servlet-api.jar 文件拷贝到JDK安装路径下的jre\lib\ext\下
C:\Tomcat 5.0\conf\server.xml
<Context path='/test' docBase="d:\testWeb" reloadable="true"/>
//隐藏文件到web-inf中 / 设置初始化参数
D:\testWeb\WEB-INF\WEB.XML
<!-- JSPC servlet mappings start -->
<servlet>
<servlet-name>mldn</servlet-name>
<jsp-file>/WEB-INF/sdemo.jsp</jsp-file>
<init-param>
<param-name>uname</param-name>
<param-value>mldn</param-value>
</init-param>
<init-param>
<param-name>upass</param-name>
<param-value>lxh</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mldn</servlet-name>
<url-pattern>/lxh</url-pattern>
</servlet-mapping>
<!-- JSPC servlet mappings end -->
//servlet通用格式
package cn.mldn.lxh.servlet.SimpleServlet ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
public class SimpleServlet extends HttpServlet
{
public void init(ServletConfig config) throws ServletException
{
System.out.println("**Servlet 初始化 ...") ;
}
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
{
PrintWriter out = resp.getWriter() ;
out.println("<html>") ;
out.println("<head>") ;
out.println("<title>the first servlet</title>") ;
out.println("</head>") ;
out.println("<body>") ;
out.println("<h1>hello world</h1>") ;
out.println("</body>") ;
out.println("</html>") ;
}
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
{
this.doPost(req,resp) ;
}
public void destroy()
{
System.out.println("**Servlet销毁 ...") ;
}
};
//servlet配置
<servlet>
<servlet-name>simple</servlet-name>
<servlet-class>cn.mldn.lxh.servlet.SimpleServlet</servlet-class>
</servlet>
<servlet-mapping>//多地址访问同一servlet
<servlet-name>simple</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
<servlet-mapping>//多地址访问同一servlet
<servlet-name>simple</servlet-name>
<url-pattern>/demo.fad</url-pattern>
</servlet-mapping>
<servlet-mapping>//多地址访问同一servlet
<servlet-name>simple</servlet-name>
<url-pattern>/dfa</url-pattern>
</servlet-mapping>
<servlet-mapping>//多地址访问同一servlet
<servlet-name>simple</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<%-- JDBC-ODBC 连接方式 --%>
<%!
//定义数据库驱动程序
String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;
//定义数据库连接地址,用JDBC-ODBC 则格式 固定如下
String DBURL = "jdbc:odbc:mldn" ;
//定义数据连接对象,属于java.sql包中的接口
Connection conn = null ;
//定义Statement对象,用于操纵数据库
Statement stmt = null ;
//定义一个字符串变量,用于保存SQL语句
String sql = null ;
%>
<%
//1、加载驱动程序
try
{
Class.forName(DBDRIVER) ;
}
catch(Exception e)
{
//此处使用out.println是出于演示目的,在实际开发中所有的错误
//消息绝对不可以用out.println打印,否则会存在安全问题
out.println("数据库驱动程序加载失败!!!") ;
}
//2、连接数据库
try
{
conn = DriverManager.getConnection(DBURL) ;
}
catch(Exception e)
{
out.println("数据库连接失败!!!") ;
}
//3、操纵数据库
//通过Connection对象实例化Statement对象
try
{
stmt = conn.createStatement() ;
// 为sql变量赋值
//sql = "insert into person (name,password,age) values('lxh','zzzzzz','28')" ;
sql = "update person set name='李新华',password='mldn' where id='1'" ;
stmt.executeUpdate(sql) ;
}
catch(Exception e)
{
out.println("操作数据库失败!!!") ;
}
//4、关闭数据库
try
{
//关闭操作
stmt.close();
//关闭连接
conn.close();
}
catch(Exception e)
{
out.println("关闭数据库失败!!!") ;
}
%>
利用JDBC开发Web数据库一般步骤:
装入JDBC驱动程序
创建与数据库的连接
创建语句对象----Statement / PrepareStatement
利用语句对象执行SQL语句得到结果
处理结果
JDBC应用结束
JavaBean 打包 javac –d . SimpleBean.java
upload.htm
<jsp:useBean id="sb" scope="page" class="cn.mldn.lxh.SimpleBean"/>
<form action="upload.jsp" method="post" ENCTYPE="multipart/form-data">
选择要上传的图片:<input type="file" name="pic">
<input type="submit" value="提交">
</form>
upload.jsp
<jsp:useBean id="smart" scope="page" class="org.lxh.smart.SmartUpload"/>
<%
// 1、上传初始化
smart.initialize(pageContext) ;
// 2、准备上传
smart.upload() ;
// 3、保存上传的文件
// smart.save("/upload") ;
String ext = smart.getFiles().getFile(0).getFileExt() ;
%>
<%
String name = smart.getRequest().getParameter("name") ;
%>
<%
// 保存文件
smart.getFiles().getFile(0).saveAs("/upload/"+name+"."+ext) ;
%>
//使用JSP标签去调用JavaBean时必须有一个无参构造函数
//两种方法调用JavaBean 。 一种是import导入 另一种用jsp的标签指令<jsp:useBean .../>
//使用JAVABEAN自动设置内容时,一定要使参数名称与Bean中属性名称一致,这样通过Java的命名规范,可以达到统一。
使用MyEclipse运行WEB程序有以下两种方法:
1、直接通过MyEclipse在服务器上进行部署(了解即可)
2、通过外接服务器的方式运行程序(推荐)
修改conf/server.xml文件
与jsp页面中服务器跳转指令<jsp:forward page="mvcdemo.jsp"/>类似
Servlet跳转到JSP的服务器端跳转的指令是:req.getRequestDispatcher("mvcdemo.jsp").forward(req,resp) ;
我们可以发现:
使用MVC开发程序,代码稍微复杂
JSP与JavaBean之间没有什么特别明显的直接关系
而Servlet根据JavaBean返回的内容进行跳转
Servlet中最好只有以下几种代码:
接收参数
调用JavaBean
进行跳转
有一些简单的逻辑判断
//表达式语句取集合中的值
<%@page import="java.util.*"%>
<%--
--%>
<%
List l = (List)request.getAttribute("all") ;
Iterator iter = l.iterator() ;
while(iter.hasNext())
{
pageContext.setAttribute("sim",iter.next()) ;
%>
<h1>${sim.name}</h1>
<%
}
%>
监听器
一、对ServletContext监听
1、ServletContextListener:对整个Servlet上下文监听(启动、销毁)
2、ServletContextAttributeListener:对Servlet上下文属性的监听
二、对Session监听
对session的创建、销毁、属性操作
1、HttpSessionListener: 对session整体状况的监听
2、HttpSessionAttributeListener:对session的属性监听
Session如何失效
1、session超时
需要在web.xml中进行设置
<session-config>
<session-timeout>1</session-timeout>
</session-config>
2、手工使session失效
invalidate():使session失效 session.invalidate() ;
同步问题的解决
class Demo implements Runnable
{
private int ticket = 10 ;
// 加入一个同步方法
public synchronized void fun()
{
// 把需要同步的地方放在同步方法之中
if(this.ticket>0)
{
try
{
Thread.sleep(100) ;
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+" --> 卖票:"+this.ticket--) ;
}
}
public void run()
{
while(ticket>0)
{
this.fun() ;
}
}
};
public class ThreadDemo14
{
public static void main(String args[])
{
Demo d = new Demo() ;
Thread t1 = new Thread(d,"售票点 A") ;
Thread t2 = new Thread(d,"售票点 B") ;
Thread t3 = new Thread(d,"售票点 C") ;
t1.start() ;
t2.start() ;
t3.start() ;
}
};
死锁问题的解决
class Person
{
// 两种情况: 李兴华 作者
// MLDN 网站
private String name = "李兴华" ;
private String content = "作者" ;
private boolean flag = false ;
// 加入一个设置的同步方法
public synchronized void set(String name,String content)
{
// 如果为绿灯则表示可以设置,否则等待:true
// 值是假,则表示要等待不能去设置
if(flag)
{
try
{
wait() ;
}
catch (Exception e)
{
}
}
this.name = name ;
try
{
Thread.sleep(100) ;
}
catch (Exception e)
{
}
this.content = content ;
// 设置完成之后,要改变灯
flag = true ;
notifyAll() ;
}
public synchronized String get()
{
if(!flag)
{
try
{
wait() ;
}
catch (Exception e)
{
}
}
String str = this.name+" --> "+this.content ;
// 如果为红灯,则表示可以取,否则等待:false
flag = false ;
notifyAll() ;
return str ;
}
};
class Pro implements Runnable
{
private Person per = null ;
public Pro(Person per)
{
this.per = per ;
}
public void run()
{
for(int i=0;i<100;i++)
{
if(i%2==0)
{
per.set("MLDN","网站") ;
}
else
{
per.set("李兴华","作者") ;
}
}
}
};
class Cust implements Runnable
{
private Person per = null ;
public Cust(Person per)
{
this.per = per ;
}
public void run()
{
for(int i=0;i<100;i++)
{
System.out.println(per.get()) ;
}
}
} ;
public class ThreadDemo19
{
public static void main(String args[])
{
Person per = new Person() ;
Pro p = new Pro(per) ;
Cust c = new Cust(per) ;
new Thread(p).start() ;
new Thread(c).start() ;
}
};
// 建立一个Person类,把Person类的对象序列化
import java.io.* ;
class Person implements Serializable
{
private String name ;
private transient int age ;
public Person(String name,int age)
{
this.name = name ;
this.age = age ;
}
public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age ;
}
};
public class IODemo26
{
public static void main(String args[]) throws Exception
{
Person per = new Person("李兴华",30) ;
ser(per) ;
System.out.println(dser()) ;
}
// 建立一个方法用于完成对象的序列化
public static void ser(Person per) throws Exception
{
ObjectOutputStream oos = null ;
oos = new ObjectOutputStream(new FileOutputStream(new File("f:\\lxh.txt"))) ;
oos.writeObject(per) ;
oos.close() ;
}
// 反序列化
public static Person dser() throws Exception
{
ObjectInputStream ois = null ;
ois = new ObjectInputStream(new FileInputStream(new File("f:\\lxh.txt"))) ;
Object obj = ois.readObject() ;
ois.close() ;
return (Person)obj ;
}
};
仿dos copy程序
import java.io.* ;
public class Copy
{
public static void main(String args[])
{
if(args.length!=2)
{
System.out.println("请输入正确的格式的参数: (例如:java Copy d:\\\\input.txt d:\\\\output.txt") ;
return ;
}
else
{
File file1 = new File(args[0]) ;
File file2 = new File(args[1]) ;
copyFile(file1,file2) ;
}
}
public static void copyFile(File srcfile,File desfile)
{
byte[] b = new byte[512] ;//512可以改成其它大于零的适当整数值
int len = 0 ;
try
{
FileInputStream fis = new FileInputStream(srcfile) ;
FileOutputStream fos = new FileOutputStream(desfile) ;
while((len=fis.read(b))!=-1)//循环以512字节拷贝,知道拷贝完.
{
fos.write(b,0,len) ;
}
fis.close() ;
fos.close() ;
}
catch(Exception e)
{
System.out.println(e) ;
}
}
};
类集
Collection: Collection下存放的就是一个个对象,每次存放单个对象
Maps: 每次存放一对值 key -> value
Iterator: 输出接口,只要是集合都要去使用iterator输出
Collection接口:在一般开发中为了清楚的表现处理数据的存放往往不直接使用Collection接口
子接口:List
子接口:Set
List既然是一个接口,则使用必须依靠子类 -> ArrayList
如果要使用List ,则格式为: List l = new ArrayList() ;
如果去使用类集则在加入对象时最好只加入一种对象.
如果希望可以一个个元素打印出来,可以有两种方法:
1.使用for循环 , size()方法求出对象数组的长度
for(int i=0;i<all.size();i++)
{
System.out.println(all.get(i)) ;
}
2.实际开发中一般用Iterator输出
因为集合的长度不固定,所以iterator采用的方法是一个一个判断输出
如果有下一个元素,则执行,如果没有则不执行
while(iter.hasNext())
{
Object obj = iter.next() ;
System.out.println(obj) ;
}
Collection 集合操作的主要方法
向集合中加入数据: public boolean add(Object obj)
从集合中删除数据: public boolean remove(Object obj) / public boolean remove(int index)
为Iterator实例化: public Iterator iterator()
取出元素的个数 : public int size()
Set的基本使用与List一致,但是HashSet子类存放时是无序的(散列存放)
Set与List第二个区别:
List中的数据允许重复元素,重复元素保留下来
Set中的数据不允许重复元素,重复元素被替换掉
在Set中如果使用HashSet则属于散列的无序的存放,如果希望有序存放使用TreeSet子类
Map的主要功能是作为查找使用,而不是作为输出使用
存数据的方法:
put(Object key,Object value)
取内容: 根据 key 取
Object get(Object key)
Map 接口的对象不能直接使用Iterator输出
如果非要使用Iterator输出Map接口对象的内容,必须使用以下的步骤:
Map -> Set -> Iterator -> Map Entry -> key , value
分清楚以下几点:
保存单个值的集合:Collection
List: 允许有重复元素
Arraylist: 同步处理,新的类,只能用Iterator输出
Vector: 同步处理,旧的类,能用Iterator和Enumeration同时输出
Set: 不允许有重复元素
HashSet: 散列,无序
TreeSet: 有序,按Comparable排序
保存一对值: Map
HashMap: 异步处理,新的类
Hashtable: 同步处理,旧的类
TreeMap: 按KEY进行排序的集合
输出
Iterator: 新的输出类,方法名称较短
Enumeration: 新的输出类,方法名称较长
对象克隆(复制)实例:
要完成克隆的类必须具备以下两种条件
1.类必须实现Cloneable接口,表示可以被克隆
2.类必须覆写Object类中的clone方法
import java.util.* ;
class Person implements Cloneable
{
private String name ;
private int age ;
public Person(String name,int age)
{
this.name = name ;
this.age = age ;
}
public String toString()
{
return "姓名: "+this.name+" 年龄:"+this.age ;
}
public Object clone()
throws CloneNotSupportedException
{
return super.clone() ;
}
};
public class Demo01
{
public static void main(String args[])
{
Person p1 = new Person("李新华",33) ;
try
{
Person p2 = (Person)p1.clone() ;
System.out.println(p2) ;
}
catch(Exception e)
{
}
}
};
比较器:Comparable
Arrays类 -> 专门用于数组排序的
可以对任意数据类型排序
例题: 给出一个Person类里面包含姓名、年龄、成绩,声明5个Person对象的对象数组,要求对数组
中的内容进行排序,排序规则如下:
按成绩进行排序,如果成绩一样,按年龄由高到低进行排序
import java.util.* ;
class Person implements Comparable //对象比较的类必须实现Comparable接口
{
private String name ;
private int age ;
private float score ;
public Person(String name,int age,float score)
{
this.name = name ;
this.age = age ;
this.score = score ;
}
public String toString()
{
return "姓名:"+this.name+"年龄:"+this.age+"成绩:"+this.score ;
}
// 覆写compareTo方法就是排序规则
public int compareTo(Object obj)
{
Person per = (Person)obj ;
if(per.score > this.score)
{
return 1 ;//成绩由高到底排列
}
else if(per.score < this.score)
{
return -1 ;
}
else
{
if(per.age > this.age)
{
return 1 ;
}
else if(per.age < this.age)
{
return -1 ;
}
else
{
return 0 ;
}
}
}
};
public class Demo01
{
public static void main(String args[])
{
Person[] p = new Person[5] ;
p[0] = new Person("张三",23,99) ;
p[1] = new Person("李四",19,99) ;
p[2] = new Person("张三",23,77) ;
p[3] = new Person("张三",18,88) ;
p[4] = new Person("张三",21,78) ;
Arrays.sort(p) ;
for(int i=0;i<p.length;i++)
{
System.out.println(p[i]) ;
}
}
};
比较器除了在Arrays类的排序外还可以用在TreeSet上,实际上TreeSet也需要比较器支持
public class Demo01
{
public static void main(String args[])
{
Set<Person> s = new TreeSet<Person>() ;
s.add(new Person("张三",23,99)) ;
s.add(new Person("李四",19,99)) ;
s.add(new Person("张三",23,77)) ;
s.add(new Person("张三",18,88)) ;
s.add(new Person("张三",21,78)) ;
Iterator iter = s.iterator() ;
while(iter.hasNext())
{
System.out.println(iter.next()) ;
}
}
};
Class类
类->对象
我希望由对象能够知道其所属的类是哪个
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
Class能够动态为类实例化
Class类本身没有任何构造方法
import java.util.* ;
public class AdvDemo08
{
public static void main(String args[]) throws Exception
{
// 通过代码验证
List all = null ;
// all = new ArrayList() ;
// 根据字符串找到一个类
Class c = Class.forName("java.util.ArrayList") ;
all = (List)c.newInstance() ;
all.add("A") ;
all.add("B") ;
all.add("C") ;
System.out.println(all) ;
}
};
总结: JAVA中对象实例化的途径
1. 直接用new: 代码比较直观,但是程序会出现耦合度
2. 程序出现了接口,如果一个接口的子类直接通过new实例化会造成程序耦合,所以使用工厂进行解耦合操作
3. 对象的克隆,将对象拷贝一份,但是此种方法需要在子类中覆写clone()
4. Class类,通过Class类来实例化一个对象,通过字符串操作完成
关于Class类只需重点掌握实例化对象的操作
发表评论
-
ddddddddddddddd
2009-04-07 22:56 0dddddddddddddd -
工厂模式经典例子
2007-10-31 21:28 1549package org.lxh.demo ; import j ... -
thinkinjava一系列项目
2007-08-15 13:26 1166本章包含了一系列项目 ... -
附录C Java编程规则
2007-08-15 13:25 1004本附录包含了大量有用 ... -
附录A 使用非JAVA代码
2007-08-15 13:24 1334附录A 使用非JAVA代码 JA ... -
对比C++和Java
2007-08-15 13:20 950附录B 对比C++和Java “作为一名C++程序员,我们早 ... -
JSP笔记
2007-08-08 18:16 2140Tomcat下建立虚拟目录 例: 建立目录 d ... -
JSP & Servlet解惑^_^
2007-08-07 19:03 1583钻进去几天,虽然网上找过问题的答案,但到现在看到Marty ... -
java笔记十
2007-08-03 21:03 728java 代码 pa ... -
java笔记九
2007-08-02 12:45 1005java 代码 /* AWT(A ... -
java笔记八
2007-08-01 19:02 976对象序列化 将对象转换为字节流保存起来,并在日后还原这个对象, ... -
java笔记七
2007-08-01 16:16 1090java 代码 /*RandomAcce ... -
java笔记六
2007-07-31 19:07 927流(Stream)是字节的源或目的。 两种基本的流是:输入流( ... -
java笔记五
2007-07-31 08:52 851ArrayList和LinkedList的比较 ArrayLi ... -
java笔记四
2007-07-31 08:51 954程序是计算机指令的集合,它以文件的形式存储在磁盘上。 进程:是 ... -
java笔记三
2007-07-28 18:27 892java 代码 /*java迭代器Iterat ... -
eclipse快捷键
2007-07-28 13:07 821本文档从Eclipse软件上整 ... -
java笔记二
2007-07-28 13:06 829java 代码 //*孙鑫教程笔记。接口中run ... -
java笔记一
2007-07-27 17:15 842java 代码 //: notes about ... -
在eclipse + MyEclipse+tomcat下配置建立J2EE工程环境
2007-07-26 19:13 4397在eclipse + MyEclipse+tomcat下配置 ...
相关推荐
gui笔记***************************************
高分项目,PID-小车类-飞思卡尔光电组原理图+PCB+应用笔记 *********************************************************************************************/ ** 舵机PWM调速频率为300HZ。 ** 电机PWM调速频率为...
1. **什么是读书笔记** 读书笔记是指在阅读过程中,读者对书籍中的精华内容、深刻观点或个人感悟进行记录的一种学习方法。它包括摘录名言警句、重要论点、精彩片段,以及个人对书本内容的理解和反思。读书笔记不仅...
- **讲座笔记**:这部分内容主要介绍了一些基本的概念,包括算法的基本定义、如何分析算法的时间复杂度等基础知识。通过这些基础知识的学习,为后续章节的学习打下坚实的基础。 - **解决方案**:提供了针对该章节...
1. **第一季:读书笔记** - 包含了对多种重要书籍的学习总结,如《Linux基础》、《C陷阱与缺陷》等。 2. **第二季:应用技巧** - 分享了一些实用的技巧和解决方案,例如如何在Ubuntu下安装NS2等。 3. **第三季:源...
- **查询笔记**:使用SELECT语句从数据库中获取所有笔记,然后将这些数据绑定到ListView或其他适配器上展示。 - **查看笔记**:点击笔记条目时,启动一个新的Activity显示笔记详情,这可能涉及到Intent的使用。 -...
**Struts2笔记** Struts2是MVC(模型-视图-控制器)设计模式的一个实现,它为Java Web开发提供了强大的控制层。Struts2的核心是Action类,它处理用户请求并调用业务逻辑。以下是一些关键知识点: 1. **...
- **文字笔记**:用户可以自由格式化文本,添加标题、列表、高亮等,方便记录会议纪要、学习心得等。 - **图片插入**:直接粘贴或拍摄照片,支持导入扫描文档,便于保存视觉信息。 - **手写输入**:支持触屏设备...
- **手写笔记**:支持手绘图形,方便绘制思维导图或草图,特别适合创意类笔记。 - **OCR识别**:通过光学字符识别技术,可以将图片中的文字转化为可编辑文本,提高信息提取效率。 - **网页剪辑**:浏览器插件允许...
1. **创建笔记**:用户可以输入文本创建新的笔记,可能有一个简单的输入界面和保存按钮。 2. **编辑笔记**:用户应能编辑已有的笔记内容,如修改文字、添加或删除段落。 3. **查看笔记**:应用提供查看模式,让用户...
**摘要式笔记**侧重于收集书中的关键信息,如重要观点、精彩语句、数据和材料。这种笔记的目的在于积累资料,为科研、教学、学习和工作做准备。摘要可以按照原文结构摘录,也可以提取主要论点和段落,或者记录重要...
- **讲座笔记**:讲解了大O记号、小o记号、大Ω记号等概念,帮助学生掌握算法效率的度量标准。 - **解决方案**:针对教材中的习题给出解答,加深对时间复杂度的理解。 **第4章:递归式** - **讲座笔记**:介绍了...
1. **多类型笔记**:软件允许用户创建不同类型的笔记,包括阅读书籍的心得体会、编程学习过程中的代码片段、算法解析、技术文档摘录等。 2. **文本编辑**:“可以直接复制doc的内容”表明该软件支持导入和编辑DOC...
1. **符号式笔记**:在阅读过程中,用特定符号标记重要、疑惑或感兴趣的部分,如直线、曲线、问号等。符号需统一且不过于繁杂,保持书页整洁,便于日后复习。 2. **摘录式笔记**:选取书中的精华内容进行抄录,注重...
2. **CSS笔记**: CSS(Cascading Style Sheets)用于控制网页的样式和布局。笔记中可能涵盖选择器、盒模型、布局模式(如流体布局、网格布局)、响应式设计、CSS3新特性(如动画、过渡、阴影、渐变等)。理解并...
- **移动笔记**:通过鼠标右键点击笔记,在弹出的菜单中选择“移动到”选项,可以把笔记移动到其他笔记本中,实现更为灵活的分类管理。 ##### 2. 建立多层级目录结构 - **笔记组的概念**:在实际使用过程中,仅有...
- **共享笔记**:用户可以将笔记或笔记本分享给他人,进行知识交流或团队协作。 - **评论与讨论**:在共享笔记中,接收者可以添加评论,形成互动讨论。 - **外链引用**:为知笔记支持生成公开链接,允许任何人...
- **讲座笔记**:介绍如何选择和分析算法,包括大O表示法等基础概念。 - **解决方案**:提供了关于算法设计和分析的基础练习题解答。 3. **第三章:函数的增长** - **讲座笔记**:讲解不同类型函数的增长率比较...